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.