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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

11

01.07.2009, 14:24

Ich verstehe nicht, warum es nicht reicht, wenn man die Normale des Vertex udn die NormalMap bzw. BumpMap (nicht die total bunte) hat.
Ich hatte gedacht, dass die Normalen aus der BumpMap einfach irgendwie mit der Vertex Normale und der NormalMatrix (ModelviewMatrix - Position) verrechnet wird.

Wenn man die Tangenten im Vertex speichern muss, muss man ja auch die Texture Koordinaten, Farbe und die Normale über die Vertex-Attributen selbst angeben. glNormalPointer würde dann nichts mehr nutzen, stimmt's?!

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

12

01.07.2009, 15:51

Zitat

Ich verstehe nicht, warum es nicht reicht, wenn man die Normale des Vertex udn die NormalMap bzw. BumpMap (nicht die total bunte) hat.
Ich hatte gedacht, dass die Normalen aus der BumpMap einfach irgendwie mit der Vertex Normale und der NormalMatrix (ModelviewMatrix - Position) verrechnet wird.

"irgendwie mit der Normale verrechnet" ist ja auch das was passiert ;)
Das was du da allerdings als "Normalmatrix" bezeichnest geht mir nicht ganz auf.
Die Vektoren in der Bumpmap kannst du dir vorstellen wie ein Fläche von der lauter Pfeile weggehen.. jetzt legst du diese Fläche auf dein Model, folglich krümmst und zerrst du die Fläche je nach Texturkoordinaten, damit du damit dein Model austapezieren kannst -> die Vektoren werden umgerechnet je nach dem wie man sie drauflegt. Den Raum in dem sie vorher lagen nennt man Tangentspace - und der ist dann eben wie die Texturkoordinaten pro Vertex anders angegeben. Der Tangentspace wird aufgemacht durch Normale und Tangente; die Binormale als dritte Achse wird normal im Vertexshader berechnet, man kann sie aber auch vorberechnen (es ist aber klüger sie jedes mal neu zu berechnen, da man sodurch das Vertexformat kleiner halten kann).

Das jetzt weiter auszubreiten spar ich mir jetzt, da gibts genug im Internet was das fehlerfreier erklären kann als ich; außerdem hab ich auch nicht genau parat wie man den Tangentspace nochmal aufmacht. Sich das vorzustellen was man jetzt rechnen muss ist nicht umbedingt so einfach je nach Mathematikkenntnissen... such einfach mal nach Bumpmap Erklärungen oder direkt nach Tangentspace; da findet man nen Haufen dazu.

Zitat

Wenn man die Tangenten im Vertex speichern muss, muss man ja auch die Texture Koordinaten, Farbe und die Normale über die Vertex-Attributen selbst angeben. glNormalPointer würde dann nichts mehr nutzen, stimmt's?!

Ähm also mit OpenGL spezifischen Sachen kenne ich mich jetzt nicht aus, aber das Texturkoordinaten, Normale, eventuell Farbe und eben auch Tangente pro Vertex gespeichert sind sollte wohl nix neues sein?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

01.07.2009, 16:11

Ich weis nicht ob es das is was du suchst, aber die FFP von Direct3D kann auch Bumpmapping (ohne Shader), in älteren SDKs gibts da auch massig samples zu...

http://msdn.microsoft.com/en-us/library/bb206304.aspx

Ansonsten: Wümpftlbrümpftl hat eh schon schön erklärt was der Tangent Space ist. Die Normale allein reicht noch nicht um eindeutig festzulegen wie die Normalen aus der Normalmap (Normalmapping is im übrigen nur eine Art von Bumpmapping) "verrechnet" werden müssen (denk dran, die Textur könnte ja z.B. irgendwie um die Normale rotiert sein...). Es braucht weitere Vektoren um die exakte Ausrichtung zu bestimmen und genau das sind Tangente und Binormale. Oft ist es zumindest eine gute Näherung (wenn auch oft nich exakt) davon auszugehen dass die 3 Vektoren die diesen Raum aufspannen orthonormal sind, da das die Berechnungen stark vereinfacht (ein Vektor pro Vertex weniger im Speicher, inverse = transponierte Matrix).

Wenn du mehr wissen willst: Google spuckt da eh einiges dazu aus. Das z.B. sieht ganz gut aus:
http://www.blacksmith-studios.dk/projects/downloads/tangent_matrix_derivation.php

Werbeanzeige