Störung der Bildtexturimplementierung aus der Renderman-Sprache

8

Ich versuche (in C #) einen Bildstörungsalgorithmus zu implementieren, der im Buch "Texturierung und Modellierung - K. Perlin et al." (Seite 91, falls jemand ihn hat) vorgestellt wird und ein Bild verzerrt. Der folgende Code ist in Renderman-Sprache: Der Texturzugriff

Ct = texture("example.tx", s, t);

wird ersetzt durch

point Psh;
float ss, tt;
Psh = transform("shader", P);
ss = s + 0.2 * snoise(Psh);
tt = t + 0.2 * snoise(Psh+(l.5,6.7,3.4));
Ct = texture("example.tx", ss, tt);

Transformieren Sie das Bild links in das Bild rechts. Geben Sie hier die Bildbeschreibung ein

Nach dem, was ich verstanden habe, greifen wir nicht auf Koordinaten , sondern greifen auf leicht gestörte Koordinaten und zeigen sie an den Stellen , wodurch ein Bild entsteht, das leicht gestört aussieht .( s s , t t ) ( s , t )(s,t)[0,1](ss,tt)(s,t)

( n o i s e ( x ) 2 ) - 1 [ 0 , 1 ] [ - 1 , 1 ] n o i s e ( P )snoise(x) ist definiert als , wobei Rauschen von auf abgebildet wird , und in der RenderMan-Dokumentation wird wobei P ein Punkt ist Ein Wert, der auf etwas Rauschen basiert (höchstwahrscheinlich Perlin oder Gitter). ( http://renderman.pixar.com/resources/current/RenderMan/noiseFunctions.html )(noise(x)2)1[0,1][1,1]noise(P)

Was ich nicht verstehe, ist, was die Transformationsfunktion tut, die den 3D-Punkt P in den "Shader" -Raum abbilden soll, und wie er implementiert werden kann. Ich bin mir auch nicht sicher, ob Rauschen (x) einen 3D-Punkt oder einen Float zurückgibt (was sinnvoller wäre) und ob ich eine einfache 2D-Implementierung von Perlins Rauschen verwenden kann, um den gleichen gewünschten Effekt zu erzielen.

simog
quelle

Antworten:

6

Wie Sie vermutet haben, transform()transformiert die Funktion Punkte von einem Koordinatenraum in einen anderen. (Es gibt auch vtransform()und ntransform()zum Transformieren von Richtungsvektoren bzw. Normalenvektoren.) Das Zeichenfolgenargument benennt den Koordinatenraum, in den transformiert werden soll.

Die Renderman Shading Guidelines haben Folgendes zu sagen:

Zu Beginn der Shader-Ausführung werden alle Punkt-, Vektor-, Normal- und Matrixvariablen im "aktuellen" Koordinatensystem ausgedrückt. Welches Koordinatensystem genau "aktuell" ist, hängt von der Implementierung ab. Es ist einfach so, dass "aktuell" für PRMan * "Kamera" ist, aber Sie sollten niemals mit diesem Verhalten rechnen - es ist durchaus möglich, dass andere RenderMan-kompatible Renderer (einschließlich zukünftiger Renderer von Pixar) einen anderen Speicherplatz verwenden (z "Welt") als "aktueller" Raum.

Als Beispiel wird ein Fall wie dieser angeführt. Die meisten Beleuchtungsberechnungen sollten im Kameraraum durchgeführt werden, die Auswertung einer Rauschfunktion sollte jedoch im Koordinatensystem des Objekts erfolgen, da das Rauschen so bleiben soll, wie sich das Objekt durch den Weltraum bewegt.

In Ihrer C # -Implementierung müssen Sie auch den vom Kameraraum schattierten Punkt in das Koordinatensystem des Objekts umwandeln. Vielleicht haben Sie dies bereits getan, bevor Sie die Texturkoordinaten berechnet haben. Wenn nicht, müssen Sie mit der Transformationsmatrix des Objekts multiplizieren. Denken Sie daran, dass dieser transformierte Punkt nur als Eingabe (wie ein Startwert) für den Perlin-Rauschgenerator verwendet wird. Es legt den Bereich fest, über den das Rauschen variiert: Weltraumkoordinaten.

In RSL kann die noise()Funktion einen beliebigen Typ zurückgeben: a float, a color, a pointoder a vector. Wenn Sie es einem anderen float( uoder v) hinzufügen , erhalten Sie einen floatin diesem Code. Tatsächlich erzeugen die beiden noise()Aufrufe, die zu sund hinzugefügt twerden, einen einzelnen 2D-Rauschvektor. Wenn Sie in Ihrem eigenen Code einen 2D-Vektor zum Speichern Ihrer Texturkoordinaten verwenden, können Sie eine einzelne Rauschfunktion verwenden, die einen 2D-Vektor zurückgibt, um den gleichen Effekt in einer Codezeile zu erzielen.


Wenn Sie an einem netten Rauschgenerator interessiert sind, bietet Shadertoy viele Rausch-Shader mit verschiedenen Varianten von Perlin-Rauschen mit unterschiedlichen Eigenschaften (isotrop oder nicht, konfigurierbare Glätte und Bandbreite). Es lohnt sich, nach Inspiration und Implementierungshinweisen zu suchen .

Dan Hulme
quelle