Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:22

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Projektions-Matrix und Licht
BeitragVerfasst: So Sep 23, 2007 23:42 
Offline
DGL Member

Registriert: Di Mär 13, 2007 02:40
Beiträge: 17
hi, Leute

Ich habe mal wieder ein Problem :). Ich möchte das Lighting fixen. Im Moment verhält es sich nicht nachvollziehbar.

Ich habe eine recht einfache Szene mit einer großen Kugel in der Mitte und zwei kleinen Kugeln in der Nähe davon. Jede der kleinen Kugeln repräsentiert eine Punkt-Lichtquelle, die genau an den selben Koordinaten liegt. Der einfachheit halber habe ich nur eine (die Rote) angeschaltet. Natürlich hat die Große Kugel ein entsprechendes Material, um die Lichtquelle entsprechend zu verarbeiten.

Soweit so gut. Die Kugel ist zu sehen und Licht-Effekte sieht man auch. Leider scheint OpenGL die Koordinaten der Lichtquelle nicht ordentlich zu verarbeiten. Mittlerweile beginne ich daran zu zweifeln, dass meine GL_PROJECTION Matrix falsch definiert ist, obwohl sie ansonsten keinerlei Probleme bereitet und alles ordnungsgemäß geclipt und projiziert wird.

Ich habe also eine Clip-Matrix und eine Projektionsmatrix. Vor jedem Frame setze ich den Matrixmode auf GL_PROJECTION und lade die Idenditätsmatrix. Dann setze ich die Clip-Matrix und multipliziere dann die Projektions-Matrix. Diese Matrizen könnte man auch mit glFrustum und glProjection erzeugen, was auf's gleiche rauskommen dürfte.
Danach setze ich jedenfalls den Matrix-Mode auf GL_MODEL_VIEW und beginne die Szene zu zeichnen. Wenn ein Licht gezeichnet werden soll, setze ich die Model-View Matrix auf die Identität, da ich Lichter grundsätzlich in Absolut-Koordinaten angebe. Vor dem Rendern eines Shapes setze ich die Model-View-Matrix auf die entsprechende Transformation.

Naja, was dann zu sehen ist, dokumentiert der angehängte Screenshot. Falls das nicht richtig zu erkennen ist: Die Rote Kugel (und damit die Rote Lichtquelle) liegen aus dieser Perspektive deutlich hinter der mittleren Kugel. Aber die Lichteinwirkung ist im vorderen Bereich der großen Kugel zu sehen.

Was mache ich falsch? Irgend eine Idee?

Vielen Dank im Voraus.

Marvin

PS: Falls Ihr weitere Informationen benötigt, liefere ich nach :)


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 23, 2007 23:50 
Offline
DGL Member

Registriert: Di Mär 13, 2007 02:40
Beiträge: 17
Ach ja. Um eins noch klarer auszudrücken: Die Welt-Koordinaten der Lichtquelle entsprechen natürlich genau den durch die Model-View Matrix transformierten Koordinaten der kleinen roten Kugel.

Marvin


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 24, 2007 09:54 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Benutzt du einen Shader für die große Kugel?
Gib mal an paar Größenangaben. Durchmesser Kugel / Koordinaten der Lichtquellen...etc


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 24, 2007 13:40 
Offline
DGL Member

Registriert: Di Mär 13, 2007 02:40
Beiträge: 17
damadmax hat geschrieben:
Benutzt du einen Shader für die große Kugel?


Nein. Keinen Shader. Stinknormale OpenGL statements.

damadmax hat geschrieben:
Gib mal an paar Größenangaben. Durchmesser Kugel / Koordinaten der Lichtquellen...etc


Die große Kugel liegt bei (0,0,0) und hat einen Radius von 1.
Die kleinen Kugeln haben einen Radius von 0.05 und liegen bei (0.0, 0.0, 2.0) (rot) und (0.5, 0.8, 2.0) (grün).
Die Kamera liegt ungefähr bei (-4.2046742, 0.2250152, -2.1287317) und zeigt nach (0.8093706, -0.14607835, 0.5688412). Der Up-Vektor ist die positive Y-Achse.
Die Kamera Vektoren stimmen natürlich nicht 1:1 mit dem Screenshot überein, da ich das eben nachgestellt habe. Aber so in etwa sollte das passen.

Marvin


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 24, 2007 14:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Qudus hat geschrieben:
Falls das nicht richtig zu erkennen ist: Die Rote Kugel (und damit die Rote Lichtquelle) liegen aus dieser Perspektive deutlich hinter der mittleren Kugel.


Deine Kamera befindet sich auf Z- und schaut nach Z+. Also schaust du "von hinten" auf deine Kugel.
Dein rotes Licht setzt du auf Z = +2.
Jetzt verstehe ich was auf deinem Screenshot nicht stimmt: Das Licht sollte eigentlich hinten liegen...

Das Problem habe ich zumindest verstanden, glaub ich :roll:
Hast du berücksichtigt, dass gltranslate, glrotate Befehle sich auch auf die mit glLightfv(GL_LIGHTx, GL_POSITION, ...) gesetzten Licht-Koordinaten auswirkt ?
Was du noch probieren kannst ist, mit glGetLightfv(GL_LIGHTx, GL_POSITION, @pos) die endgültige Lichtposition abzufragen.
Das würde ich am Ende der Render-Procedure aufrufen.

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 24, 2007 14:11 
Offline
DGL Member

Registriert: Di Mär 13, 2007 02:40
Beiträge: 17
MatReno hat geschrieben:
Deine Kamera befindet sich auf Z- und schaut nach Z+. Also schaust du "von hinten" auf deine Kugel.
Dein rotes Licht setzt du auf Z = +2.
Jetzt verstehe ich was auf deinem Screenshot nicht stimmt: Das Licht sollte eigentlich hinten liegen...

Das Problem habe ich zumindest verstanden, glaub ich :roll:


Ja, das stimmt genau.

MatReno hat geschrieben:
Hast du berücksichtigt, dass gltranslate, glrotate Befehle sich auch auf die mit glLightfv(GL_LIGHTx, GL_POSITION, ...) gesetzten Licht-Koordinaten auswirkt ?


Ich verwende nie glTranslate/glRotate/glScale.

MatReno hat geschrieben:
Was du noch probieren kannst ist, mit glGetLightfv(GL_LIGHTx, GL_POSITION, @pos) die endgültige Lichtposition abzufragen.
Das würde ich am Ende der Render-Procedure aufrufen.


Das ist ein toller Tip. Werde ich gleich mal ausprobieren.

Vielen Dank.

Marvin


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 24, 2007 14:35 
Offline
DGL Member

Registriert: Di Mär 13, 2007 02:40
Beiträge: 17
Hab das gerade mal ausprobiert. Und die ausgelesene Position entspricht genau der eingegebenen. Also daran liegt es nicht.

Ich möchte auch noch betonen, dass der Licht-Effekt nicht konstant an der falschen Stelle erscheint, sondern abhängig von der Kamera-Position ist. Wenn ich mich im Raum bewege, wandert der beleuchtete Bereich auf der Kugel auch.

Marvin


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 24, 2007 15:55 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
... dann tausch mal die Reihenfolge Licht setzen <-> Projektion setzen. Ich meine mich erinnern zu können, dass das eine Auswirkung darauf hat, ob das Licht relativ zur Kamera sitzt (und sich damit 'mitbewegt') oder nicht.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 24, 2007 16:14 
Offline
DGL Member

Registriert: Di Mär 13, 2007 02:40
Beiträge: 17
Sidorion hat geschrieben:
... dann tausch mal die Reihenfolge Licht setzen <-> Projektion setzen. Ich meine mich erinnern zu können, dass das eine Auswirkung darauf hat, ob das Licht relativ zur Kamera sitzt (und sich damit 'mitbewegt') oder nicht.


Das ist in meiner Konstellation nicht ganz so einfach. Aber ich habe mal folgendes gemacht:
Vor dem Setzen des Lichtes habe ich

glMatrixMode( GL_PROJECTION );
glPushMatrix();
glLoadIdentity();
glMatrixMode( GL_MODELVIEW );

ausgeführt und danach wieder:

glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );

Wäre das, was Du meinst?

Macht jedenfalls leider keinen Unterschied.

Marvin


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 24, 2007 17:58 
Offline
DGL Member

Registriert: Di Mär 13, 2007 02:40
Beiträge: 17
Nach intensiven Tests habe ich das Problem nun endlich gelöst. Und zwar ist es ein OpenGL Treiber Bug! Ich verwende für die Kugeln indexed-triangle-strip-arrays. Wenn ich das mache, kann ich kein strungentes Triangle-Vertex-Winding mehr einhalten. Zusätzlich hatte ich back-face-culling aktiviert, Wenn man das tut, wird die Licht-Position auf unvorhersehbare Weise beeinflusst.

Also vielleicht ein guter Eintrag in Euer Wiki unter FAQ: Nicht machen! :)

Vielen Dank nochmal für Eure Hilfe.

Marvin


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 15 Queries | GZIP : On ]