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

29.10.2008, 10:16

Meins du die Vertices? Naja, eben jetzt nicht mehr +X, +Y, -Z sondern +X, +Y, +Z mittels der linkshändigen Projektionsmatrix. Nur mit den Normalen scheint OpenGL nicht mehr klar zu kommen :?
Weil die Beleuchtung und das Spheremapping nicht mehr korrekt aussehen.
Wenn ich als erstes glScalef(1, 1, -1) aufrufe würde das im Grunde funktionieren. Aber ich will das nicht umgehen sondern gleich richtig machen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

29.10.2008, 10:52

Zitat von »"LukasBanana"«

Meins du die Vertices?


Nein, die Normalen.


Zitat von »"LukasBanana"«


Wenn ich als erstes glScalef(1, 1, -1) aufrufe würde das im Grunde funktionieren. Aber ich will das nicht umgehen sondern gleich richtig machen.


Was meinst du mit "umgehen" und "richtig machen"? Ist das nicht richtig?
@D13_Dreinig

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

13

29.10.2008, 16:34

Ich berechne die Normalen ganz normal, eben mit dem Kreuzprodukt:

C-/C++-Quelltext

1
2
3
NewX = Y1 * Z2 - Y2 * Z1;
NewY = Z1 * X2 - Z2 * X1;
NewZ = X1 * Y2 - X2 * Y1;

Und übermittle sie über die VertexBuffer:

C-/C++-Quelltext

1
2
3
4
#define BUFFER_OFFSET(i) ((char*)0 + (i))
/* ... */
glNormalPointer(GL_FLOAT, sizeof(SVertexInfo), BUFFER_OFFSET(4*4));
/* ... */

Wenn ich dir Normalen als 3D Linine darstelle sehe ich, dass sie immer noch korrekt berechnet sind. Aber anscheinend verarbeitet OpenGL die Normalen werte jetzt intern anders.

Oder wie meinst du sonst mit transformieren?!

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

14

29.10.2008, 16:54

Hier mal ein Beispielbild meines Problems:


(Link)

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

15

29.10.2008, 16:57

http://en.wikipedia.org/wiki/Cross_product#Cross_product_and_handedness

Wenn ich mich richtig erinnere braucht das Kreuzprodukt in einem left handed System ein Vorzeichenwechsel in der Z Komponente. Bin ich mir aber gerade nicht ganz sicher. Am besten mal ausprobieren.

[edit] Sorry, das ist blöde formuliert. Ich bin auch gerade zu faul das mathematisch korrekt zu formulieren.. also einfach mal ausprobieren mit dem Vorzeichenwechsel ;)

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

16

29.10.2008, 17:07

Ich verstehe vor allem nicht, warum bei der Beleuchtung das Diffuse Licht noch funktioniert aber der Rest nicht?! :?

Anonymous

unregistriert

17

30.10.2008, 19:37

Zitat von »"LukasBanana"«

In der Irrlicht Engine gibt es in der matrix-Klasse aber auch extra zwei Funktionen: "buildProjectionMatrixPerspectiveFovLH" und "buildProjectionMatrixPerspectiveFovRH" ;)

Schau dir mal die Implementierung des OpenGL renderers an. DOrt wird auch die Z-Koordinate invertiert.

Werbeanzeige