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

Aktuelle Zeit: Mi Mai 15, 2024 06:44

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Sep 19, 2013 01:04 
Offline
DGL Member

Registriert: Fr Feb 15, 2013 21:13
Beiträge: 22
Programmiersprache: Object Pascal
Hallo Leute,

nach längerer Pause habe ich mal wieder Zeit gefunden mich mit OpenGL zu beschäftigen und bin gerade dabei die Einsteiger-Tutorials (nochmal) durchzuarbteiten. Gerade beschäftige ich mich mit dem Thema Licht. Dabei bin ich auf etwas gestoßen, dass ich mir nicht erklären kann.
Ich habe eine diffuse Lichtquelle im Punkt (0,2,0) platziert (auf dem angehängten Screenshot markiert durch die rote Kugel). Meine texturierten Objekte werden auch richtig beleuchtet.
Wie man auf dem Screenshot allerdings sieht, wird meine rote Gitter-Kugel und das weiße Gitternetz quasi von Punkt minus unendlich auf der Z-Achse aus angeleuchtet. Und noch dazu scheint die Beleuchtung schwächer zu werden, obwohl ich nichts dergleichen aktiviert habe.

Das seltsame daran ist, dass ich wirklich nur diese eine Lichtquelle platziert habe welche ich wie folgt initialisiert habe:

Code:
  1. procedure InitLight;
  2. const
  3.   light_ambient: array[0..3] of GlFloat = (0.0, 0.0, 0.0, 0.0);
  4.   light_diffuse: array[0..3] of GlFloat = (1.0, 1.0, 1.0, 1.0);
  5.   light_specular: array[0..3] of GlFloat = (0.0, 0.0, 0.0, 1.0);
  6.   light_position: array[0..3] of GlFloat = (0.0, 2.0, 0.0, 1.0);
  7.   light_direction: array[0..2] of GlFloat = (0.0, 0.0, 0.0);
  8. begin
  9.   glLightfv(GL_LIGHT0, GL_AMBIENT, @light_ambient[0]);
  10.   glLightfv(GL_LIGHT0, GL_DIFFUSE, @light_diffuse[0]);
  11.   glLightfv(GL_LIGHT0, GL_SPECULAR, @light_specular[0]);
  12.   glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  13.   glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, @light_direction[0]);
  14.  
  15.   glEnable(GL_COLOR_MATERIAL);
  16.   glEnable(GL_LIGHTING);
  17.   glEnable(GL_LIGHT0);
  18. end;


Diese Prozedur rufe ich beim Start der Anwendung einmalig auf. Kann mir jemand sagen, wo mein Fehler liegt?

Btw. ist es sehr schade, dass bei betreffendem Tutorial kein Beispiel-Quelltext vorhanden ist, durch den ich mich mal durchfitzeln hätte können.

Ich freu mich auf eure Antworten!
Grüße, BS


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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Sep 19, 2013 09:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Hiho,
Da sind Fehler in den Settings.
GL_SPOT_DIRECTION <- ist eine Normale, die die Richtung des Lichtes an gibt, also ist 0,0,0 falsch.
Um die Stärke des Lichtes fest zu legen hast du folgende Variablen.
GL_CONSTANT_ATTENUATION
GL_LINEAR_ATTENUATION
GL_QUADRATIC_ATTENUATION
Der Link sollte helfen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Sep 19, 2013 09:54 
Offline
DGL Member

Registriert: Fr Feb 15, 2013 21:13
Beiträge: 22
Programmiersprache: Object Pascal
Erstmal danke für die schnelle Antwort! Das hab ich soweit schon verstanden. Dass die Normale jetzt zufällig diesen Wert hat (also quasi nicht vorhanden ist), was womöglich zu seltsamen Dingen führt, liegt daran, dass ich schon ein wenig damit rumprobiert habe... was aber wenn ich mich recht erinnere auch zu keinem anderen Ergebnis geführt hat. Da ich gerade unterwegs bin, kann ich das aber leider nicht überprüfen.
Außerdem habe ich bereits mit der Lichtposition rumgespielt und die texturierten Objekte werden wie es scheint ja trotzdem richtig beleuchtet. Ich schätze mal, das liegt an der Standard-Einstellung des Beleuchtungskegels (180?) sodass die Richtungs-Normale im Prinzip egal sein sollte. Vielleicht ist OpenGL ja schlau und merkt das. ;)
Deswegen glaub ich jedenfalls auch nicht wirklich daran, dass dort der Fehler liegt und werde das morgen im Laufe des Tages mal überprüfen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Sep 19, 2013 17:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Bei dem grauen Gitter, liegt es wahrscheinlich daran, das OpenGl das Licht pro Vertex und nicht pro Pixel berechnet, wenn du das Gitter als Lines von dem einen Ende zum anderen renderst, dann wird immer für die Endpunkte das Licht berechnet und nicht nochmal extra für das dazwischen.

Einfache Lösung: Entweder Quads im Wireframe Mode rendern oder mehrere kleine Linien rendern.

Saubere Lösung: Fragment Shader einprogrammieren.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 20, 2013 07:29 
Offline
DGL Member

Registriert: Fr Feb 15, 2013 21:13
Beiträge: 22
Programmiersprache: Object Pascal
Das klingt erstmal einleuchtend. Wobei mir dann trotzdem nicht klar ist, warum die Eckpunkte in -Z-Richtung dann heller berechnet werden als die in Z-Richtung, wo doch beide den gleichen Abstand zur 360°-Lichtquelle haben...

Einfache Lösung: Werde ich gleich mal testen. ;)

Saubere Lösung: Ich schätze mal, dafür muss ich mir noch ein paar mehr Tutorials anschauen... *lach*


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 20, 2013 10:55 
Offline
DGL Member

Registriert: Fr Feb 15, 2013 21:13
Beiträge: 22
Programmiersprache: Object Pascal
Sooo...

Der Ansatz mit den Rechtecken statt Linien hat zwar nicht zur Lösung des Problems geführt, jedoch dazu, dass ich dieses jetzt besser beschreiben kann. Ich habe nämlich vergessen die Rechtecke nur als Rahmen zu zeichnen, was glücklicherweise den Verlauf des Lichtes besser sichtbar machte... daraufhin ein bisschen mit der Position, der Richtung und dem Öffnungswinkel rum gespielt und folgende neue Erkenntnisse erlangt:

1. Das Licht funktioniert bei meinen texturierten Würfeln genau wie es sollte.
2. Untexturierte Zeichenobjekte werden partout im Bereich Z>(z-Koordinate der Lichtquelle) nicht beleuchtet!!!
3. Umso kleiner der Winkel zwischen Lichtstrahl und z-Achse, deso heller ist dieser auf untexturierten Objekten (auch wenn die Lichtrichtung NICHT parallel zur z-Achse verläuft -> asymetrisch heller Lichtkegel!!!)

Hat irgendjemand eine Ahnung, woran das liegen könnte?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 20, 2013 11:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Das sieht ziehmlich stark nach einen Fehler bei den Vertexdaten aus. Meistens passiert das wenn man die Matrizen nicht richtig mit einbezieht. Aber dafuer muesste man mal etwas mehr vom Code sehen. Kannst du den eventuell Posten?

Btw: ein Shader wird dir hier nicht weiterhelfen, da der selbe Fehler auftauchen wird!

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 20, 2013 12:40 
Offline
DGL Member

Registriert: Fr Feb 15, 2013 21:13
Beiträge: 22
Programmiersprache: Object Pascal
Ich weiß leider nicht, welchen Teil des Quelltextes du genau meinst, deswegen hänge ich mal die ganz Unit dran... Ich hab mir bei der Strukturierung und beim Auskommentieren Mühe gegeben, also hoffe ich, dass du findest wonach du suchst.


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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 20, 2013 13:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Naja hab jetzt nur grob ueberflogen, bin ja auch schliesslich auch kein pascal Mensch (gleich fliegen Steine oder? :) ). Man muesste sich halt auch mal UnitDraw anschauen um genaueres Feedback zu geben.
Du solltest aber auf jedenfall mal deine Kameraposition und Rotation in die Modelview reinpacken (AdjustCam also hinter das LoadIdentity).

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 20, 2013 13:30 
Offline
DGL Member

Registriert: Fr Feb 15, 2013 21:13
Beiträge: 22
Programmiersprache: Object Pascal
In der UnitDraw sind nur Sachen drin wie: >Zeichne einen Würfel< oder >zeichne ein Gitternetz<. Das sollte alles so funktionieren. (Ich hängs trotzdem mal mit dran, falls dus dir anschauen willst.)
Das mit der Kamperaposition ist sone Sache... Die hatte ich auch bei GL_MODELVIEW drin - geändert hat das nichts. Sehen tu ich nämlich genau dasselbe, egal ob ich AdjustCam bei GL_PROJECTION oder GL_MODELVIEW drin habe. Sollte mich jemand erleuchten wollen was den Unterschied angeht, sage ich nicht nein. ;)


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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 20, 2013 15:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
naja mag sein das es jetzt noch keinen Unterschied macht ob du es in die Projection oder Modelview packst.... naja dein Bier.

Bei deiner UnitDraw fallen mir auch so ein paar Dinge auf:
- die Normale wird nicht gesetzt. Da der default 0,0,1 ist, kommt wohl auch das beschriebene Verhalten zustande:
Zitat:
Z>(z-Koordinate der Lichtquelle) nicht beleuchtet!!!

da (x,y, negativer Wert) * (0,0,1) < 0 ist.

- Deine Prozedur fuer den Wuerfel ist an sich nicht schlecht gedacht (jedenfalls fuer fixed function) aber die vielen push & pops bringen dich frueher oder spaeter in Teufels Kueche. Ganz abgesehen davon das es ohne auch schneller wird.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Sep 26, 2013 16:39 
Offline
DGL Member

Registriert: Fr Feb 15, 2013 21:13
Beiträge: 22
Programmiersprache: Object Pascal
Die Sache ist die, dass mir der Unterschied an dieser Stelle einfach nicht klar ist. Soviel meine ich verstanden zu haben: Bei Variante Projection bewege ich mich durch den Raum, bei Variante Modelview bewegt sich der Raum um mich. Das Ergebnis sollte aber doch das gleiche sein, oder nicht?! Ô_o Sollte die Erklärung jetzt den Rahmen sprengen, werde ich mich zu einem späteren Zeitpunkt nochmal damit beschäftigen und nötigenfalls ein extra Thread dazu erstellen.

Aber zurück zum eigentlich Thema: Mit den Normalen hast du wohl recht, werde das bei gleich mal beheben. Ich schätze mal, das wird die Lösung des ganzen Problems sein. Großes Danke dafür! :)

Die Würfelprozedur war eh nur zu Testzwecken gedacht und ich wollte mir ein bisschen Arbeit ersparen. Aber danke für den Hinweis!


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.050s | 17 Queries | GZIP : On ]