Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DirectX - Problem mit Licht bei skalierten Objekten (https://www.delphipraxis.net/98970-directx-problem-mit-licht-bei-skalierten-objekten.html)

Reddog 4. Sep 2007 19:18


DirectX - Problem mit Licht bei skalierten Objekten
 
Hallo,

ich hab ein Problem mit Licht in Direct3D 9. Es funktioniert grundsätzlich, allerdings sind flache Sachen heller. Also zum Beispiel ein Würfel der entlang der y-Achse herunterskaliert ist ist von oben gesehen viel heller, als ein normaler Würfel. Ich hab keine Ahnung woran das liegen könnte.

Ich speichere für meine Objekte zwei Vektoren für Ausrichtung: Direction und Up, außerdem einen Scale Vektor. Damit bau ich die World_Matrix zusammen. Die Matrix ist an sich auch richtig und die Objekte werden korrekt dargestellt.

Das Licht, das ich verwende ist Directional. Aber es ist ähnlich mit Point Light.

Weiß da jemand vielleicht Rat?

Danke,
Reddog.

Bubblegum 13. Sep 2007 14:00

Re: DirectX - Problem mit Licht bei skalierten Objekten
 
Kann es sein, dass du die Normalen neu berechnet (setzen) nusst?

Reddog 14. Sep 2007 09:09

Re: DirectX - Problem mit Licht bei skalierten Objekten
 
Hmm, das ist ein guter Vorschlag.

Ich hab bis jetzt noch nie mit Licht gearbeitet. Kann man das einfach so? Bzw. das Problem tritt ja nach der Transformation auf. Dann kann ich aber doch nicht mehr die Normalen verändern...

Naja ich such mal da nach weiteren Hinweisen.

Danke auf jeden Fall. Erste Antwort :)

OregonGhost 14. Sep 2007 09:22

Re: DirectX - Problem mit Licht bei skalierten Objekten
 
Ich habe dunkel in Erinnerung, dass die Normalen gerne normalisiert (d.h. auf Länge 1 gebracht) werden wollen.

Bubblegum 14. Sep 2007 09:46

Re: DirectX - Problem mit Licht bei skalierten Objekten
 
Dies sollte das Problem lösen!

Setze einfach diesen Renderstate einmal beim intialiseren deiner Engine:

Pd3dDevice.SetRenderState(D3DRS_NORMALIZENORMALS, DWord(true));

Reddog 14. Sep 2007 10:57

Re: DirectX - Problem mit Licht bei skalierten Objekten
 
Wow, das ging so einfach :(

Vielen Dank für die Hilfe, hab schon fast die Hoffnung aufgegeben.

Ich befürchte mein tolles "DirectX9 in Delphi" Buch fliegt bald zum Fenster raus. In dem ganzen Licht-Kapitel stand nix von D3DRS_NORMALIZENORMALS.

Sehr erleichtert,
Reddog.

OregonGhost 14. Sep 2007 11:52

Re: DirectX - Problem mit Licht bei skalierten Objekten
 
Bleib bei dem Buch.
Zitat:

Zitat von MSDN
Enabling this feature causes the system to normalize the vertex normals for vertices after transforming them to camera space, which can be computationally time-consuming.

Normalerweise solltest du die Normalisierung der Normalen selbst durchführen, weil nur du den idealen Zeitpunkt dafür kennst (sobald du genügend Erfahrung gesammelt hast, zumindest ;)).
Du kannst unter Umständen übrigens die Skalierung der Normalen auch im Vertex-Shader berücksichtigen und musst sie dann eventuell nicht normalisieren. Du kannst zum Beispiel auch das Licht skalieren (!), d.h. eine Skalierung pro Licht und Objekt durchführen statt eine pro Vertex.

Reddog 14. Sep 2007 12:51

Re: DirectX - Problem mit Licht bei skalierten Objekten
 
Man sollte auf sowas zumindest hinweisen...

Naja, ich werde das echte 3D-Licht wohl ohnehin nicht zu oft einsetzen.
Ich schreibe an einer Engine für mein Spiel. Da ich bis jetzt nur 2D gemacht habe und die Engine jetzt auf 3D erweitern will, war das einfach mal interessant sich Licht anzugucken. So wie ich das aber verstehe, sollte man möglichst wenig direkt so ausleuchten.

Auf jeden Fall Danke,
Reddog.

Bubblegum 14. Sep 2007 13:02

Re: DirectX - Problem mit Licht bei skalierten Objekten
 
Lass es besser drin!!!

Die SDK empfiehlt dies sogar einer Stelle, und er Performanceverlust ist im Vergleich zu irgendwelchen Randerscheinungen vernachlässigbar.
Zitat:

Note In most cases, applications should enable automatic normalization of vertex normals. To do this, set D3DRS_NORMALIZENORMALS to TRUE. If you do not enable this render state, the appearance of the environment map will be drastically different than you might expect.
Gebe dir auch den Tipp auf die Clootie - Header umzusteigen. Diese sind immer sehr schnell aktualisiert und sind näher an MS - dran, was das Arbeiten mit der SDK und sehr guten C++ Büchern erleichtert! Die du bald brauchen wirst, um dein Wissen zu erweitern.

OregonGhost 14. Sep 2007 17:31

Re: DirectX - Problem mit Licht bei skalierten Objekten
 
Man sollte natürlich auch wissen, was man tut. Das DirectX SDK erwähnt dies speziell für Cubic Environment Mapping, nicht allgemein, weil dieses Feature in Direct3D (wenn man es nicht selbst implementiert über Shader) ohne wie erwähnt nicht richtig funktioniert.

Du kannst bei Gelegenheit ja mal in einer großen Szene testen, wo der Performance-Unterschied liegt zwischen aktivierter und deaktivierter Normalisierung. Wenn du keine Fixed-Function-Pipeline mehr zur Verfügung hast, dürftest du ohnehin keine Wahl mehr haben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz