Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

27.10.2015, 13:54

Normalen für Spiegelung im korrekten Raum

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ß!

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

28.10.2015, 11:39

Du musst deine Normalen im Vertexshader mit der Inversen-transponierten Weltmatrix transformieren, sonst hast du vermutlich das beschriebene Problem.

Allerdings kannst du das Problem erstmal reduzieren, in dem du dein Objekt mit einer World-Einheitsmatrix transformierste und die Kamera nur bewegst.

Ansonsten kann es höchstens noch sein, dass die Unterseite deiner Figur die Vertices in einer anderen Orientierung (Clockwise/Counterclickwise) definiert hat als der Rest. Dann hast du auch dein beschriebenes Ergebnis.

3

28.10.2015, 14:27

Danke erstmal für deine Antwort!

Von der Vorgehensweise hab ich auch schon gelesen, doch habe ich da ein Problem bei der Umsetzung (vielleicht denke ich aber auch nur falsch):
Ich berechne die normalen erst im Geometry Shader, kann daher im Vertex Shader noch keinen Einfluss auf die Normalen nehmen, oder kann ich den übergebenen Vertex schon transformieren?
Die Flächennormalen kann ich auch erst da berechnen, da die Position der Nachbar Vertices im Vertexshader noch gar nicht bekannt ist.
Ich denke, ich habe auch abseits der Normalen noch ein Problem, da die Spiegelung der Objekt-Draufsicht etwas zeigt, dass von dort nicht sichtbar sein sollte, obwohl die Normale in die Richtige Richtung zeigt (y).
Ach, und die korrekte Visualisierung der Unterseite des Objekts ist nicht notwendig, da sie nicht verwendet wird. Ich dachte nur, es könnte mit meinem Ursprünglichen Problem zusammenhängen.
Die Orientierung der Vertices könnte aber schon ein Grund sein, danke dafür nochmal. ;)

Hier noch ein paar Beispielbilder:
Die Grundfläche des Test-Objekts ist Horizontal, die Farben der Normalen von -1 bis 1 auf 0 bis 128 gemappt.
http://www.bilder-upload.eu/show.php?fil…-1446039140.png

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

28.10.2015, 14:36

Ich berechne die normalen erst im Geometry Shader, kann daher im Vertex Shader noch keinen Einfluss auf die Normalen nehmen, oder kann ich den übergebenen Vertex schon transformieren?


Das ist korrekt, ich hatte im Sinn, dass der Geometry shader vor dem Vertex Shader aufgerufen wird, ist aber nicht so. Daher würde ich das Problem auf die orientierung der Flächen reduzieren. Anscheinend ist aber deine Reflektion falsch. Da bin ich auch etwas skeptisch über die erste Zeile des VertexShader-Ausschnittes. Warum transformierst du einen Nullvektor mit der inversen ModelViewMatrix? deine Augposition sollte schon im WorldSpace sein, da muss man nur die differenz zur transformierten Vertexposition berechnen.

Ansonsten solltest du dir als reflection map etwas erstellen, so dass du jede Seite des Cubes eindeutig an Hand von Farbe erkennen kannst, um Fehler beim Berechnen der Reflektion rausfinden zu können.

5

28.10.2015, 16:20

Die im Geometry Shader berechnete Flächennormale muss aber noch in Worldspace tranformiert werden, oder? Da die Vertices zur Berechnung ja aus dem Objectspace stammen, oder täusche ich mich gerade?

Die Berechnung des Augenvektors habe ich aus einem Beispiel übernommen, und zugegebenermaßen nicht weiter recherchiert.
Also wäre der korrekte Augenvektor 1 - gl_Position? (nach Transformation von gl_Position in den Worldspace)

Ich habe mal eine aussagekräftigere Cubemap erstellt. Hättest du jetzt noch direkt Anpassungen am Code?
Sonst würde ich ein paar aussagekräftigere Bilder der Reflektion hochladen.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

28.10.2015, 17:27

Nein muss sie denke nicht, weil die vertices des geometry shaders schon in world sind. Das kriegst du am einfachsten raus, in dem du dein Objekt langsam drehst und die normalen beobachtet.
Wenn GL_Position die Position des vertex in world ist, ja. Ja und lade trotzdem mal ein besseres Bild hoch, das hilft.

7

29.10.2015, 09:49

Ok, mit der Drehung werde ich später versuchen, da die normalen im Object Space und im World Space die gleiche Orientierung haben, sollte das beim eigentlichen Problem ja keinen Unterschied machen.
Ich habe meine Implementierung mal ein wenig mit anderer Umgebung getestet, gezeigt hat sich folgendes:

Ein Blick senkrecht auf die Flächen eines nicht gedrehten statischen Würfels zeigt immer in Richtung der positiven Z-Richtung,
außer beim Blick entlang der Z-Richtung selber (positiv, wie negativ), da zeigt sich die Seite entland der negativen Z-Richtung.

Anders ausgedrückt: Blickt man im 90 Grad Winkel von rechts, links, oben oder unten auf den Würfel, sieht man das, was ursprünglich vorne war.
Blickt man von vorne oder von hinten darauf, sieht man das, was ursprünglich hinten war.

Kannst du dir vorstellen, was ich meine?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

8

29.10.2015, 10:23

*kopfkratz* nach mehrfachen nachdenken nicht 100%, aber dann klingt das ja nach einen Vektor, der falsch orientiert ist. Spiel mit mal beim Reflect mit den Vorzeichen der Operanden herum...

9

30.10.2015, 16:53

Hallo, ich wollte dir nur mal ein Update meinerseits geben:
Das Vertauschen von Vorzeichen hat leider nicht funktioniert. Obwohl alles genau wie in einigen Tutorials sein sollte funktioniert die Spiegelung noch nicht korrekt.
Da ich nicht ausschließen kann, dass es an der Cubemap selber hängt, muss ich das ganze Thema wohl einfach nochmal langsam von vorne angehen.
Ich danke dir auf jeden Fall für deine Mühe, mir zu helfen! :)

Gruß!

Werbeanzeige