2016-07-02 7 views
2

Ich studiere/implementiere eine Version der Perlin Noise und Improved Perlin Noise. Perlin sagt in seinem Vortrag, dass er die smoothstep Funktion ersetztPerlin Noise: Warum würde ein Interpolant-Derivat zweiter Ordnung ein Normal-/Schattierungs-Artefakt erzeugen?

3t^2 - 2t^3 

, dass er verwendet, um die 8 linearen Funktionen an der Gitterzelle Ecken mit der Funktion zu interpolieren:

6t^5 - 15t^4 + 10t^3 

Da die zweite Ableitung der Smoothstep-Funktion ist diskontinuierlich. Er sagt (und das ist deutlich sichtbar in dem Bild, das er zeigt), dass dies einige visuelle Artefakte aufgrund der Art verursacht, wie die Normalen als Ergebnis dieser Funktion aussehen. Jetzt verstehe ich, was eine diskontinuierliche Funktion ist. Ich verstehe auch, wie die Normalen in der Perlin-Rauschfunktion unter Verwendung der partiellen Ableitungen der Perlin-Rauschfunktion berechnet werden, aber ich verstehe nicht, warum die Tatsache, dass Ableitung zweiter Ordnung nicht kontinuierlich ist, ein Problem mit den Normalen verursacht. Die Normalen werden unter Verwendung der Ableitung erster Ordnung der Rauschfunktion und nicht der Ableitung zweiter Ordnung berechnet. Wie kann also die Tatsache, dass die Ableitung 2. Ordnung nicht stetig ist, eine solche Auswirkung auf die Normalen haben?

enter image description here

Weitere Einzelheiten zu dem improved Noise Function.

Antwort

0

Also wie kann die Tatsache, dass die Ableitung 2. Ordnung nicht kontinuierlich ist solch eine Wirkung auf die Normalen?

Erstens, denken Sie daran, dass die Ableitung 2. Ordnung die Ableitung 1. Ordnung der Norm ist. Es geht nicht darum, Normale zu berechnen, sondern darum, wie reibungslos die Normalen im Raum fortschreiten. Dies wird die Beleuchtung direkt beeinflussen und die Glattheit der zugrundeliegenden Funktion zeigen, und im Allgemeinen ist die stetigere ableitbare Funktion, je glatter sie sich anfühlt.

Obwohl Perlins frühere Methode zu kontinuierlichen Normalen und kontinuierlichen Schattierungen führt, können Sie immer noch sagen, wo die Grenze liegt, da die Schattierung keine kontinuierliche Ableitung hat und unsere Wahrnehmung so konzipiert ist, dass sie als das was es ist: eine kontinuierliche Oberfläche das ist nicht dass glatt in dieser Grenze

Werfen Sie einen Blick auf diesen vier Funktionen (von oben nach unten):

  • in deutlichen discontinuos Mapping
  • Kontinuierlich Mapping, discontinuos die ivative
  • Continuos Derivat
  • Stufenlos Kontinuierlich Derivat

     half TriangleWave (half x) { 
    
          x = 2 * frac(x/2); 
          return min(x, 2 - x); 
         } 
    
         half SShape (half x) { 
    
          x = saturate(x); 
          return x * x * (3 - 2 * x); 
         } 
    
         fixed4 frag (v2f f) : SV_Target { 
    
          // Bottom to top coordinate system 
          half x = 3 * f.tex.x; 
          half y = f.tex.y; 
    
          if (y > 0.75) 
           return frac(x); 
          if (y > 0.5) 
           return TriangleWave(x); 
          if (y > 0.25) 
           return SShape(TriangleWave(x)); 
          return 0.5 - 0.5 * cos(x*3.141592); 
         } 
    

    Functions smoothness comparison

Der letzte ist die glatte, aber man kann es fast nicht aus dem dritten erzählen. Aber die zweite, obwohl eine kontinuierliche Zuordnung, können Sie noch eine Grenze dort fühlen.

Aufgrund der direkten Auswirkung der Normalen auf die Beleuchtung (der vorherige Shader kann leicht als Beleuchtungsberechnung verwendet werden), wählen Sie grundsätzlich zwischen der zweiten und dritten Option. Deshalb möchten Sie normalerweise, dass die Normalen selbst fortlaufend differenzierbar sind und sich nicht nur mit Kontinuität begnügen.

+0

Könnten Sie bitte einige Pfeile zum Bild hinzufügen, die zeigen, wo das Ergebnis jeder Funktion ist? –

Verwandte Themen