Ich versuche heute schon den ganzen Tag ein anständiges
Glanzlicht in meinen Wasser-Shader zu implementieren und komme irgendwie nicht darauf, wo der Fehler liegt. Die Normalen habe ich alle bereits als Farbe und einem Normal-Debug-Geometryshader untersucht und scheinen mir zu stimmen. Der "Eye"-Vektor zeigt vom Fragment zum Betrachter. Der "SunDirection"-Vektor zeigt die Richtung in die sich das Licht bewegt. Meine aktueller vereinfacher Fragmentshadercode:
|
HLSL-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#version 330
uniform vec3 SunDirection;
smooth in vec3 Eye;
out vec4 OutColor;
void main()
{
vec3 HalfwayVector = normalize(normalize(Eye) - normalize(SunDirection));
float SpecularIntensity = max(dot(HalfwayVector, vec3(0.0, 1.0, 0.0)), 0.0); //Die Normale ist zur Vereinfachung fest gesetzt.
float SpecularColor = 1.0 * pow(SpecularIntensity, 5.0);
OutColor = vec4(SpecularColor, SpecularColor, SpecularColor, 1.0);
}
|
Und der Vertexshader...
|
HLSL-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#version 330
uniform mat4 ViewTransformMatrix;
uniform ivec2 PositionAdd;
uniform vec3 CameraPos;
layout(location = 1) in float WaterHeight;
layout(location = 0) in float Height;
smooth out vec3 Eye;
void main()
{
ivec2 Pos2D = ivec2(gl_VertexID & (TERRAINBLOCKDATA_SIZE - 1), gl_VertexID >> TERRAINBLOCKDATA_SIZE_LOG2); //Berechnung der Position aus dem Grid
Pos2D += PositionAdd;
vec3 Position = vec3(float(Pos2D.x), (1.0 / (VERTICALFACTOR)) * float(WaterHeight), float(Pos2D.y));
gl_Position = ViewTransformMatrix * vec4(Position, 1.0);
Eye = normalize(CameraPos - Position);
}
|
Das Ergebnis ist zwar gar nicht komplett falsch, hat aber so einen komischen scharfe Ecke auf der Seite der Lichtquelle(Sonne) bei einem flachen Betrachtungswinkel. Das sieht sehr seltsam aus, wenn die virtuelle Sonne untergeht, bevor das Glanzlicht ganz verschwindet. Der weiße Glanzfleck wird dabei immer kleiner, ohnw schwächer zu werden.
Am späten Tag, könnte es noch in Ordnung sein: (Die Grasfläche im Hintergrund wird mit einem anderen
Fragmentshader ohne Glanzlicht gerendert)
Wenn die Sonne untergegangen ist, verschwindet das Glanzlicht nicht mit und das Artefakt ist besonders gut erkennbar.
Obwohl eigentlich nicht so viel falsch sein kann, bin ich langsam ratlos. Habt ihr irgendwelche Ideen?