Hallo
Da ich teilweise mit starkem und hässlichem Banding zu kämpfen habe, brauche ich einen Dithering-Shader.
Das normale glEnable(GL_DITHER) bewirkt nichts - zumindest sehe ich keinen Unterschied.
Nach etwas googlen habe ich herausgefunden, dass viele Dithering-Algorithmen nicht für Pixel/Fragment Shader geeignet sind, da diese ja parallel berechnet werden.
Irgendwann hab ich dann auch diesen
Thread bei zfx gefunden. Dort wird Dithering basierend auf zufälligem Noise verwendet (siehe 3.1 Dithering gegen Banding).
Dann hab ich mir aus unterschiedlichen Quellen einen Shader gebastelt, der mir zufälliges Noise für jeden Pixel liefert.
Hier ist der Shader (GLSL) und das Ergebnis ist im Anhang (sieht ganz gut aus finde ich).
|
HLSL-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#version 120
uniform sampler2D tex;
uniform float Seed; // Intervall [0.0,1.0]
uniform float ScreenWidth;
float rand(vec2 co){
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
void main (void)
{
vec2 uv = gl_TexCoord[0].xy;
float Rand1 = ScreenWidth*uv.y+uv.x*Seed;
float Rand2 = uv.x*uv.y;
vec3 R = vec3 (rand(vec2(Rand1*0.41,Rand2*0.23)),rand(vec2(Rand1*0.29,Rand2*0.59)),rand(vec2(Rand1*0.53,Rand2*0.47)));
gl_FragColor = vec4 (R,1.0);
}
|
So und meine Frage ist jetzt: Was muss ich mit dem Noise machen? Muss ich addieren, multiplizieren...?
Dazu habe ich leider kaum was gefunden und wenn, dann war es nur etwas um das Bild von einer höheren Farbtiefe in eine kleinere zu konvertieren. Ich will ja aber eine noch höhere Farbtiefe simulieren und nicht eine kleinere.
Wie muss ich da vorgehen?
Lg chaia