Angenommen, es gibt einen Wert p
, der pro Frame berechnet wird und sich kontinuierlich über die Oberfläche eines Objekts ändert. Der Wert von p
bestimmt die Dichte eines Musters auf der Oberfläche. Zum Beispiel in einem Fall mit nur zwei möglichen Dichten, wenn p < 0.3
es 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 p
Probe 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):
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.
Und zum Schluss hier der Vergleich zwischen dem, was gewünscht wird und dem, was mit dieser Methode tatsächlich passieren würde:
Das Problem besteht darin, dass ein Kreis mit hoher Dichte, der die Linie kreuzt, ignoriert wird, wenn p
die 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 p
jedes 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 p
pro 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.
Antworten:
Um sicherzustellen, dass die Musterformen immer entweder vollständig vorhanden sind oder fehlen, niemals abgeschnitten werden, muss sichergestellt werden, dass
p
fü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 seinp
.Ich gehe davon aus, dass Sie eine Möglichkeit haben,
p
an 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 gleichenp
Wert 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
p
den angegebenen Bewertungspunkt überprüft und ihn mit dem angegebenen Schwellenwert vergleicht.Auf diese Weise sieht jede Musterform einen einheitlichen
p
Wert und Schwellenwert und wird entweder ein- oder vollständig ausgeschaltet. Mitp
zunehmender Anzahl überschreiten mehr Formen ihre Schwelle und erscheinen, was den Eindruck einer sich kontinuierlich ändernden Dichte erweckt.quelle
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.
quelle