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

Aktuelle Zeit: Fr Jul 18, 2025 17:45

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



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glLight: Lichtkreis abgeschnitten
BeitragVerfasst: So Mai 27, 2007 01:05 
Offline
DGL Member

Registriert: Do Feb 15, 2007 22:26
Beiträge: 3
Hallo!

Ich habe mir einen kleinen Heightmap Renderer geschrieben und wollte dort eine Lichtquelle einbauen.
Das Terrain hat 128x128 Tiles, ein Tile ist 2.0 OpenGL Einheiten groß (TER_*SCALE), die Höhe wird auf 8.0 Einheiten skaliert.
Die Lichtquelle soll sich in der Mitte des Terrains befinden.

Das Problem ist allerdings, dass das Licht nur in eine Richtung (z=-1) scheint, wie auf folgenden Screenshots denke ich gut zu erkennen ist. (Mit verschiedenen Attenuations aufgenommen.)
http://img.rootzilla.de/img/7d4bbee0e53 ... de43dc.png
http://img.rootzilla.de/img/9b00ce3cd3a ... 775be5.png
http://img.rootzilla.de/img/0f8c71b1fc7 ... 3c2776.png
http://img.rootzilla.de/img/679d1754913 ... 5a9512.png

Zur Lichtberechnung habe ich die OpenGL Primitivbeleuchtung via glLight gewählt.
Dass die meisten Leute lieber Shader basiertes Licht benutzen habe ich auch schon vernommen, allerdings habe ich quasi keine Ahnung von Shadern und wollte ihnen auch noch eine Weile fern bleiben, bis ich mit "normalem" OpenGL etwas mehr Erfahrung habe.
Desweiteren wurmt mich dieses Problem ziemlich, weshalb ich gerne den Fehler finden würde.

Ich habe schon an den verschiedenen Arten der Attenuation geschraubt, sie ganz weggelassen, die Spot direction verändert, usw. Leider ohne Erfolg.
SPOT_CUTOFF auf einen Wert ungleich 180 zu setzen lässt das Licht dann wie erwartet abhängig von der Betrachterposition in eine bestimmte Richtung scheinen.
Für die Lichtposition w auf 0.0 zu setzen hat auch das erwartete Resultat.

Wenn ich nun aber w auf einen Wert zwischen 0.9 oder 0.1 setze, dann vergrößert sich der ausgeleuchtete Bereich. Die Lichtkante verschiebt sich ein wenig in Richtung z=1. Dieser Effekt wird mit fallendem w verstärkt, allerdings wird damit auch die Lichtintensität schwächer, bis bei w = 0.1 quasi nichts mehr zu sehen ist, aber nahezu das komplette Terrain ausgeleuchtet ist. Für Werte größer 1.0 verschiebt sich die Lichtkante in die andere Richtung (z=-1) und auch hier scheint die Intensität abzunehmen, allerdings nur minimal.

Der Code ist in C99 geschrieben, hier die wichtigsten Teile:
Code:
  1.  
  2. static const GLfloat LightAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
  3. static const GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  4. static const GLfloat LightPosition[] = { 64.0f * TER_WIDTHSCALE, 20.0f, 64.0f * TER_HEIGHTSCALE, 1.0f };
  5. static const GLfloat LightLinearAttenuation = 0.01f;
  6.  
  7. void iV_renderTerrain(void)
  8. {
  9.     [...]
  10.     glMatrixMode(GL_MODELVIEW);
  11.    
  12.     glLoadIdentity();
  13.  
  14.     glRotatef( player.y, 0.0f, 1.0f, 0.0f );
  15.     glTranslatef( player.x, 0.0f, player.z ); // Move camera into position
  16.  
  17.     glColor3f(1.0f, 1.0f, 1.0f);
  18.  
  19.     glTranslatef( 0.0f, -5.0f, 0.0f ); // Move terrain into position
  20.  
  21.     glTranslatef( -64.0f * TER_WIDTHSCALE, 0.0f, -64.0f * TER_HEIGHTSCALE); // Move us in the mid of the terrain
  22.  
  23.     glLightfv(GL_LIGHT0, GL_POSITION, LightPosition); // Put the light onto the terrain
  24.  
  25.     // Draw terrain
  26.  
  27.     [...]
  28. }
  29.  
  30. void iV_init(void)
  31. {
  32.     [...]
  33.  
  34.     glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
  35.     glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
  36.     glLightfv(GL_LIGHT0, GL_POSITION,LightPosition);
  37.     glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, LightLinearAttenuation);
  38.     glEnable(GL_LIGHT0);
  39.     glEnable(GL_LIGHTING);
  40.  
  41.     [...]
  42. }
  43.  


Den Rest kann ich auf Anfrage posten, das Forum scheint Quellcode/Textdateien nicht als Attachment zu akzeptieren.

Kann mir jemand sagen wo der Fehler ist?

Vielen Dank schonmal im Voraus,
Darth


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 27, 2007 16:02 
Offline
DGL Member

Registriert: Do Feb 15, 2007 22:26
Beiträge: 3
Ich habe inzwischen den Fehler gefunden, nachdem ich festgestellt habe, dass ein selbstgezeichnetes Quad anscheinend korrekt beleuchtet wird.

Auflösung:
Ich hatte beim Auslesen der Normalen aus der Bilddatei 2 Fehler gemacht:
a) libpng liest die Farbinformationen als unsigned char aus, wohingegen ich natürlich für x und z ein Vorzeichen brauche.
b) Das GIMP Plugin, was ich zum Erzeugen der Normalmap benutzt hatte, speichert die z Komponente im G Kanal und die y Komponente im B Kanal, wohingegen OpenGL die beiden ja in der umgekehrten Reihenfolge erwartet.

Nachdem ich diese Fehler korrigiert habe sieht die Beleuchtung wie gewünscht aus.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 25 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.042s | 17 Queries | GZIP : On ]