Wie erstelle ich ein gemustertes Objekt mit variabler Musterdichte in Echtzeit?

8

Angenommen, es gibt einen Wert p, der pro Frame berechnet wird und sich kontinuierlich über die Oberfläche eines Objekts ändert. Der Wert von pbestimmt die Dichte eines Musters auf der Oberfläche. Zum Beispiel in einem Fall mit nur zwei möglichen Dichten, wenn p < 0.3es eine hohe Dichte ist, andernfalls ist es niedrig.

Ich habe mir eine einfache Lösung auf hoher Ebene überlegt: Erstellen Sie zwei Texturen mit jeweils unterschiedlicher Dichte und basierend auf dem Wert der pProbe aus der entsprechenden. Es gibt jedoch ein Problem mit der Grenze zwischen hoher und niedriger Dichte.

Hier ist ein Beispiel zur Veranschaulichung des Problems (beachten Sie, dass mein Problem NICHT ausschließlich für dieses Beispielmuster von Punkten gilt. Ich beschreibe die Muster, mit denen ich später arbeite):

Geben Sie hier die Bildbeschreibung ein

Und hier ist der Schwellenwert zwischen niedrig und hoch (angezeigt auf der Textur mit hoher Dichte, aber das ist nicht relevant.) Wenn unter der Linie, impliziert dies, dass die Textur mit hoher Dichte abgetastet werden sollte.

Geben Sie hier die Bildbeschreibung ein

Und zum Schluss hier der Vergleich zwischen dem, was gewünscht wird und dem, was mit dieser Methode tatsächlich passieren würde:

Geben Sie hier die Bildbeschreibung ein

Das Problem besteht darin, dass ein Kreis mit hoher Dichte, der die Linie kreuzt, ignoriert wird, wenn pdie abzutastende Textur mit niedriger Dichte angezeigt wird, was zu einem abgeschnittenen Kreis führt. Ich weiß nicht, wie ich dieses Problem lösen soll, da pjedes Bild unterschiedlich ist, sodass ich nicht einfach eine Grenze zwischen den beiden Dichten "backen" kann. Es ist einfach, das umgekehrte Problem zu vermeiden, indem die Textur mit hoher Dichte aus der unteren Textur erstellt wird (dh wenn sich ein Kreis auf der Textur mit niedriger Dichte befindet, stellen Sie sicher, dass er sich auf der Textur mit hoher Dichte befindet.)

Ich bin interessiert, ob jemand eine Möglichkeit hat, meine Lösung zu verbessern, oder sogar eine andere Methode. Die Einschränkung hierbei ist, dass ppro Frame in Echtzeit berechnet wird. Eine weitere Einschränkung betrifft die Mustertextur: Das Muster ist Schwarzweiß, wobei Schwarz das Muster und Weiß der Hintergrund ist (wie die Kreise im Beispiel). Das Muster kann nicht nur identische Formen sein, die wiederholt werden, sondern jede Anordnung von beliebigen schwarzen Formen über einem weißen Hintergrund. (Vielleicht ist Muster die falsche Wortwahl.)

Ich bin mit der Forschung auf diesem Gebiet nicht vertraut, daher war ich mir nicht sicher, welche Keywords ich suchen sollte. Daher würde ich mich sogar freuen, wenn mich jemand in die richtige Richtung weisen könnte.

Ryan
quelle
3
Ist Ihre tatsächliche Textur auch nur schwarze Punkte auf Weiß? In diesem Fall können Sie die Textur möglicherweise prozedural generieren, z. B. mit Poisson-Disc-Sampling mit unterschiedlichen Radien. Andernfalls ist das Mischen möglicherweise eine Option, wenn Ihre Textur tatsächlich kontinuierlicher ist (dies würde jedoch für gestochen scharfe Texturen wie in Ihrem Beispiel nicht gut funktionieren). Wenn Sie also klären könnten, wie Ihr tatsächliches Muster / Ihre Textur aussieht, könnten Sie hilfreichere Antworten erhalten.
Martin Ender
1
Nachbearbeitung? So etwas wie eine Variante der Kantenerkennung: Schreiben Sie den Abstand zum nächsten Punktzentrum auf und durchsuchen Sie dann im Bildschirmbereich die punktgroße Nachbarschaft jedes Pixels nach (nahe) Nullwerten. Dies gibt Bildschirmraumpunkte, so dass Sie schreiben und mit UV-Derivaten herumspielen müssen, um zum Texturraum zurückzukehren ... Beachten Sie, dass Sie immer noch ein Kontinuitätsproblem haben - wenn sich die p-High / Low-Grenze über die Oberfläche bewegt, erscheinen Punkte und verschwinden. Wenn p stetig sein kann (eine weiche Grenze), können Sie möglicherweise die Punkte entlang der Grenze verkleinern / wachsen lassen ...
Daniel M Gessel
1
Eine andere Möglichkeit besteht darin, sich mit Wang-Kacheln zu befassen. Einführung , Fliesengenetik , GPU Edelsteine
maogenc
1
Haben Sie sich Texturbomben angesehen? http.developer.nvidia.com/GPUGems/gpugems_ch20.html
Mikkel Gjoel
1
Können Sie eine Vorstellung davon geben, welche Formen / Muster Sie abdecken müssen und wie flexibel der Ansatz sein kann? @ DanielMGessels Vorschlag, die Kreisradien anstelle ihrer Dichte zu ändern, könnte die Dinge einfacher machen und eine flüssigere Animation ergeben, aber es ist noch nicht klar, wie stark Ihr Ansatz eingeschränkt ist.
Trichoplax

Antworten:

6

Um sicherzustellen, dass die Musterformen immer entweder vollständig vorhanden sind oder fehlen, niemals abgeschnitten werden, muss sichergestellt werden, dass pfür alle Texel innerhalb der Form der gleiche Wert verwendet wird. In Ihrem Beispiel für Kreise müssen sich alle Texel in einem bestimmten Kreis einig sein p.

Ich gehe davon aus, dass Sie eine Möglichkeit haben, pan einem bestimmten Punkt auf der Oberfläche zu bewerten (ob es von einer Textur nachgeschlagen oder von einer Funktion berechnet wird). Eine Möglichkeit, um sicherzustellen, dass eine Gruppe von Texeln alle den gleichen pWert erhält, besteht darin, sicherzustellen, dass sie alle vom selben Punkt aus nachschlagen.

Die UVs dieses Bewertungspunktes könnten in zusätzlichen Kanälen der Mustertextur gespeichert werden. Beispielsweise könnten die roten und grünen Kanäle die UV-Koordinaten speichern, bei denen ausgewertet werden soll p, der blaue Kanal den Schwellenwert speichern, bei dem dieses Musterelement eingeschaltet werden soll, und der Alpha-Kanal die antialiasierte Graustufe des anzuzeigenden Musters speichern. Falls gewünscht, können die UV + -Schwellenwertdaten auch in einer separaten sekundären Textur vorliegen.

Um diese UV + -Schwellenwerttextur zu erzeugen, können Sie ausgehend von einer Eingabemustertextur programmgesteuert verbundene Komponenten finden (z. B. durch Suchen nach schwarzen Pixeln und Überfluten). Stellen Sie den Bewertungspunkt für alle Texel in jeder Komponente auf die UV-Strahlung der Mitte der Komponente ein und generieren Sie einen zufälligen Schwellenwert dafür. Verwenden Sie dann beim Rendern einen Pixel-Shader, der diese Textur zuerst abtastet, dann pden angegebenen Bewertungspunkt überprüft und ihn mit dem angegebenen Schwellenwert vergleicht.

Auf diese Weise sieht jede Musterform einen einheitlichen pWert und Schwellenwert und wird entweder ein- oder vollständig ausgeschaltet. Mit pzunehmender Anzahl überschreiten mehr Formen ihre Schwelle und erscheinen, was den Eindruck einer sich kontinuierlich ändernden Dichte erweckt.

Nathan Reed
quelle
1
Ich mag diese Idee wirklich, ich muss sie ausprobieren. Es macht vollkommen Sinn. Vielen Dank!
Ryan
0

Ein anderer Gedanke ist in diese Richtung. Wenn Sie einen einheitlichen Punktsatz in der Ebene und eine Zuordnungsfunktion von der Ebene zur Zieloberfläche definiert haben, gibt die Dichtefunktion auf der Oberfläche an, wie Bereiche von der ebenen Oberfläche zum Ziel abgebildet werden. Eine Karte zur Erhaltung des Gebiets würde also zu einheitlichen Punkten auf dem Ziel führen.

MB Reynolds
quelle