Hallo,
für mein aktuelles Projekt hatte ich mir gedacht, dass ich doch mal versuchen könnte 2D Schatten zu implementieren. Ich habe allerdings noch nicht wirklich viel Erfahrung mit glsl bzw. shadern allgemein.
Mein erster (ineffizienter, aber theoretisch einfacher) Gedanke war, von jedem Pixel eine "Linie" im Fragment-Shader zu ziehen und falls diese Linie einen Pixel schneidet, der nicht Alpha = 0 hat, liegt dieser Pixel im Schatten. Alle Objekte die Schatten werfen, habe ich davor in eine Textur gerendert, welche mit Color(0,0,0,0) gecleared wurde. Ich hab jetzt aber ein Problem mit dem "Linie ziehen". Wie kann ich das am besten anstellen?
Im Moment sieht der Code so aus:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#version 120
uniform vec4 lightColor;
uniform vec2 lightPos;
uniform sampler2D tex;
void main()
{
vec2 TexCoord = vec2 (gl_TexCoord[0]);
vec4 Color = texture2D (tex,TexCoord);
if (Color.a == 0)
{
vec2 vector = vec2 (lightPos - TexCoord);
vec2 Pos = vec2 (TexCoord);
while (Pos != lightPos)
{
Pos += vector;
vec4 Color2 = texture2D (tex,Pos);
if (Color2.a != 0)
{
gl_FragColor = vec4 (0.0,1.0,0.0,1.0); // farbe grün zum test
return;
}
}
gl_FragColor = lightColor; // wenn nicht im schatten liegt, dann beleuchet
}
else
gl_FragColor = Color; // wenn es ein Objekt ist, farbe so lassen
}
|
Das ganze funktioniert überhaupt nicht wirklich, teils entstehen grüne artefakte und flimmern. Außerdem ist der Schatten an der völlig falschen stelle und hat auch nicht die richtige Form.
-->> Code ist Bullshit
Wie berechne ich richtig, welcher Pixel jetzt im Schatten liegt und welcher nicht? Bin ich auf dem richtigen Weg oder ist das alles unnötig? Wenn ja, wie macht man dann 2D Schatten?
Bin über jede Antwort dankbar =)
lg chaia