Hallo, ich bin gerade dabei Reflektionen an einem Objekt zu implementieren, dafür berechne ich die Flächen-Normalen, mit denen ich den Reflektionsvektor auf eine Reflection-Map bestimme.
Nun entspricht das Ergebnis nicht den Erwartungen.
Mein bisheriges Vorgehen (aufs wesentliche gekürzt in GLSL 1.5 compatibility):
VertexShader: Setzen der Position in Screenspace, Berechnung des Kameravektors
|
Quellcode
|
1
2
3
|
vec4 eye = vec4(modelViewMatrixInverse * vec4(0,0,0,1));
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
eyeVector = gl_Position.xyz-eye.xyz;
|
GeometryShader: Berechnung der Flächennormalen
|
Quellcode
|
1
2
3
4
5
6
7
|
vec3 P[3];for(int i=0;i<3;i++){
P[i] = vertex[i].position; // = gl_Vertex
}
vec3 V0 = P[0] - P[1];
vec3 V1 = P[2] - P[1];
vec3 N = cross(V1, V0);
nN = normalize(N);
|
FragmentShader: Berechnung und Darstellung des resultierenden Umgebungspixels
|
Quellcode
|
1
2
3
4
|
vec3 eye = normalize(eyeVector);
vec3 coord = reflect(eye, nN);
vec4 cube = textureCube(cubemap, coord);
gl_FragColor = cube;
|
Resultat:
Ich habe nN visualisiert, die Ergebnisse scheinen korrekt, außer, dass die Unterseite der Testfigur die gleiche Normale erhält, wie die Oberseite (nN.y).
Die Spiegelung ist nicht korrekt (zb: Blick von oben auf horizontale Fläche lässt Horizont erkennen, statt nur Himmel).
Wahrscheinlich stimmt der Raum der Normalen nicht (Object Space vs World Space), wie berechne ich diesen ohne große Umwege?
Ist mein Vorgehen ansonsten korrekt?
Gruß!