Ich benutze Phong Shading als mein Beleuchtungsmodell. Trotzdem erzeugt die Spiegelschattierung Gradienten im Lichtkegel:
Hoffentlich können Sie sehen, dass sich der Gradient von der unteren linken Ecke entlang des Quaders ausdehnt.
Hier ist der Shader-Code, der dieses spiegelnde Licht erzeugt:
vec3 viewDir = normalize(-FragPos);
vec3 lightDir = normalize(-light.direction);
vec3 reflectDir = reflect(-lightDir, normal);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
Übrigens mache ich meine Beleuchtungsberechnungen im Sichtraum.
Gibt es eine Chance, die Beleuchtung sanfter zu machen?
Antworten:
Dies ist ein häufiges Problem bei sehr subtilen Verläufen. Das Problem ist, dass das Bild mit 8 Bit pro Komponente angezeigt wird und dies nicht genau genug ist, um unter diesen Bedingungen einen für das Auge glatten Farbverlauf zu erzielen.
Die zugrunde liegenden Berechnungen, die im Shader durchgeführt werden, sind jedoch präziser (z. B. float = 24 effektive Mantissenbits), sodass Sie Dithering anwenden können, um das Erscheinungsbild des Bildes zu verbessern.
Sie können dies tun, indem Sie dem Wert jedes Pixels im Shader etwas zufälliges Rauschen hinzufügen. Das Rauschen kann von einer Textur stammen, die mit zufälligen Graustufenwerten in [0, 1] gefüllt und 1: 1 auf Bildschirmpixel abgebildet wird. Im Shader ordnen Sie dies dem Bereich [−0.5 / 255, 0.5 / 255] neu zu und fügen ihn der Ausgabefarbe hinzu.
Hier ist ein Shadertoy, der dies demonstriert. Die linke Seite hat kein Zittern; Die rechte Seite verwendet das gerade beschriebene Verfahren. Wie Sie sehen können, verschwindet die Streifenbildung rechts.
Durch Dithering können Sie effektiv Zwischenwerte zwischen 8-Bit-Integer-Ebenen darstellen. Beispielsweise wird ein Bereich, den der Shader als 82,3 (von 255) berechnet, normalerweise gleichmäßig auf 82 abgerundet. Beim Dithering wird er jedoch als zufällige Mischung ausgegeben, wobei 70% der Pixel auf 82 und 30% eingestellt sind bis 83. Das Auge mittelt über dieses sehr leichte, hochfrequente Rauschen und es wird praktisch unsichtbar.
quelle
fragCoord
sollte bereits auf Pixelzentren sein.