Ich implementiere derzeit ein 3D-Perlin-Noise-Bump-Mapping mit Shader Model 4 (DirectX 10 HLSL). Das Erzeugen des Rauschens selbst ist kein großes Problem (es gibt Unmengen an Tutorials und Codes), aber was ich nicht gefunden habe, sind analytische Ableitungen von 3D-Perlin-Rauschen.
Die einzigen Websites, die die Derivate berücksichtigen, sind die Website von Iñigo Quilez und eine verwandte GameDev.net Diskussion . Das Problem ist, dass in der ersten Verbindung das Rauschen wertbasiert ist, nicht gradientenbasiert (was für mich eine Voraussetzung ist), in der zweiten Verbindung gibt es nur 2D-Gradientenrauschableitung.
Beachten Sie, dass ich nicht nach numerischen Ableitungen suche, da diese erfordern, dass vier benachbarte Rauschproben erzeugt werden, und das ist viel zu viel Aufwand.
Hat jemand diese Derivate berechnet? Gibt es eine Referenzimplementierung, die sie verwendet?
Ich habe heute auch keine Lösung im Internet gefunden, also habe ich versucht, sie abzuleiten.
Zuerst werden die Notationen eines 3D Perlin Noise definiert.
Nehmen wir an, das 3D-Perlin-Rauschen wird durch die trilineare Interpolation als
berechnet %Vor% wobei u
, v
, w
die Interpolationsfaktoren durch das quintische Polynom von Bruchteilkoordinaten sind (d. h. verbessertes Perlin-Rauschen):
und dot___
s sind Skalarprodukte der Gradientenvektoren (gx___, gy___, gz___)
s an Gitterpunkten und die Bruchkoordinaten:
Berechnen Sie zuerst die Derivate von u
, v
und w
Durch Erweitern von n
mit Lerp(a, b, t) = a + (b - a) * t
,
Nehmen Sie dann partielle Ableitungen von n
,
,
%Vor%,
%Vor% Dann ist (nx, ny, nz)
der Gradientenvektor (partielle Ableitungen) der Rauschfunktion.
Einige allgemeine Unterausdrücke können ausgeklammert werden, wenn der Compiler damit nicht umgehen kann. Zum Beispiel:
%Vor% Die Koeffizienten in der erweiterten n
werden mehrfach wiederverwendet. Sie können berechnet werden durch:
Auch die Derivate haben ähnliche Koeffizienten,
%Vor% Die Berechnung von n
kann das erweiterte Formular auch mit k0
, ... k6
verwenden.
Diese Lösung wurde gegen die zentrale Differenzmethode verifiziert.
Obwohl diese Lösung plump aussieht, hat mein Experiment (CPU only, SSE) gezeigt, dass die Berechnung dieser Ableitungen durch diese Lösung nur etwa 50% zusätzliche Zeit für die Berechnung eines einzelnen 3D Perlin Noise-Samples kostet.
Endliche Differenz benötigt mindestens 300% zusätzliche Zeit (zusätzliche 3 Proben) oder 600% (6 Proben für zentrale Differenz).
Daher ist diese Lösung besser in der Leistung und sollte auch numerisch stabiler sein.
Tags und Links 3d perlin-noise derivative