Ich versuche, einen Glitzereffekt für meinen Echtzeit-Shader zu erzeugen, aber ich weiß nicht wie.
Hier ist ein Beispiel und ein anderes Beispiel .
Mit welcher Technik kann ich dies implementieren?
Ich versuche, einen Glitzereffekt für meinen Echtzeit-Shader zu erzeugen, aber ich weiß nicht wie.
Hier ist ein Beispiel und ein anderes Beispiel .
Mit welcher Technik kann ich dies implementieren?
Antworten:
Wenn wir gebeten werden, einen Shader zu entwerfen, sollten wir zunächst kleinere Probleme aufteilen. Und genau wie der Glitzereffekt den Shader nicht wirklich gut aussehen lässt, aber die Gesamtbeleuchtung und der Effekt, wenn nur einer von ihnen verwendet wird, sehen nicht so gut aus.
Lassen Sie uns zunächst feststellen, was nicht direkt Teil des Shaders ist:
Zweitens teilen wir den eigentlichen Shader in separate Effekte auf:
Es ist zu beachten, dass solche Stoffe unendlich viele Normalen haben, aber die hier beschriebene Technik nähert sich der signifikantesten Normalen an
Um die höchstwertige Normale zu approximieren, besteht eine Möglichkeit darin, Texturkoordinaten zu verwenden und Tangenten des Netzes zu berechnen, anstatt N zu berechnen . L Sie berechnen 1- (NT).
Vollständige Erklärung hier . Und Sie müssen dies wahrscheinlich im Fragment-Shader implementieren und nicht in der Vertex-Technik, über die sie sprechen. Andere anisotrope Modelle können ebenfalls angewendet werden.
Nun zum Glitzereffekt:
Dies kann im Weltraum / lokalen Texturraum oder im Bildschirmraum als separater Durchgang erfolgen.
Der Algorithmus, an den ich denken kann, verwendet eine Bildverarbeitungstechnik (vorausgesetzt, das Netz hat Texturkoordinaten).
Beachten Sie, dass das obige Bild nur ein Beispiel für den Max-Filter ist. Wenn Sie es auf das Rauschen anwenden, erhalten Sie etwas, das einem Sternfeld ähnelt.
Beispiel eines Gausschen Filters, der auf maximales (ed) Rauschen angewendet wird.
Beachten Sie, dass diese Technik möglicherweise eine erhebliche Optimierung für einen Echtzeit-Shader erfordert.
Es gibt einen interessanten Artikel AMD - Getting Procedural .
Es scheint, dass Funkeln härter sind als ich denke.
Anständige Lösung: Verwenden Sie die 3D-Position, um die 3D-Rauschfunktion zu indizieren, fügen Sie den Ansichtsvektor hinzu und verwenden Sie die Frac-Funktion, um die Dinge weiter zu randomisieren.
Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);