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

Aktuelle Zeit: Di Jul 15, 2025 07:25

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Licht geht nicht
BeitragVerfasst: Fr Dez 16, 2011 17:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

wir solln für die Schule in C++ nen beleuchteten Würfel schreiben. Eigentlich ne total einfache Aufgabe, aber irgendwie will das Licht bei mir nicht richtig. Ich hab es eigentlich genau so gemacht wie ich es aus Delphi gewohnt bin. Aber vlt hab ich irgend nen Kleinigkeit in C++ übersehen. Wäre net wenn da jmd der etwas geübter in C++ ist als ich sein Auge drauf werfen könnte:
Code:
  1.     GLfloat
  2.         *light    = getVector4f(1.0f, 1.0f, 1.0f, 1.0f),
  3.         *ambient  = getVector4f(0.2f, 0.2f, 0.2f, 1.0f),
  4.         *diffuse  = getVector4f(0.7f, 0.7f, 0.7f, 1.0f),
  5.         *specular = getVector4f(0.9f, 0.9f, 0.9f, 1.0f),
  6.         *emission = getVector4f(0.0f, 0.0f, 0.0f, 1.0f),
  7.         *position = getVector4f(1.0f, -4.0f, 2.0f, 0.0f),
  8.         *shininess = new GLfloat(50);
  9.  
  10.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,   ambient);
  11.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,   diffuse);
  12.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,  specular);
  13.     glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION,  emission);
  14.     glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
  15.  
  16.     glLightfv(GL_LIGHT0, GL_AMBIENT,  light);
  17.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  light);
  18.     glLightfv(GL_LIGHT0, GL_SPECULAR, light);
  19.     glLightfv(GL_LIGHT0, GL_POSITION, position);
  20.  
  21.     delete[] light;
  22.     delete[] ambient;
  23.     delete[] diffuse;
  24.     delete[] specular;
  25.     delete[] emission;
  26.     delete[] position;
  27.     delete shininess;
  28.  
  29.     if (_backfaceCulling){
  30.         glEnable(GL_CULL_FACE);
  31.     }else{
  32.         glDisable(GL_CULL_FACE);
  33.         glPolygonMode(GL_BACK, GL_LINE);
  34.     }
  35.  
  36.     glBindBuffer(GL_ARRAY_BUFFER, _arrayBuffer);
  37.     glEnableClientState(GL_VERTEX_ARRAY);
  38.     glVertexPointer(3, GL_FLOAT, 24, (void*)0);
  39.     glEnableClientState(GL_NORMAL_ARRAY);
  40.     glNormalPointer(GL_FLOAT, 24, (void*)12);
  41.  
  42.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _elementArrayBuffer);
  43.     glEnableClientState(GL_INDEX_ARRAY);
  44.     glIndexPointer(GL_UNSIGNED_INT, 0, NULL);
  45.  
  46.     glPushMatrix();
  47.         glScalef(100, 100, 100);
  48.  
  49.  
  50.         if (_drawPoints){
  51.             glDepthFunc(GL_ALWAYS);
  52.             glColor3f(1, 0, 0);
  53.             glPointSize(5);
  54.             glDrawArrays(GL_POINTS, 0, _vertexCount);
  55.             glDepthFunc(GL_LESS);
  56.         }
  57.    
  58.                
  59.         glEnable(GL_LIGHTING);
  60.         glEnable(GL_LIGHT0);
  61.  
  62.         glColor4f(1, 1, 1, 1);
  63.         glPolygonMode(GL_FRONT, _polygonMode);
  64.         glMultiDrawElements(GL_QUAD_STRIP, _vertcount, GL_UNSIGNED_INT, _indices, _vDiv*6);
  65.    
  66.         /*
  67.         glBegin(GL_QUADS);
  68.             glNormal3f(0.0f, 1.0f, 0.0f);
  69.             glVertex3f( 1.0f, 0.0f, 1.0f);
  70.             glVertex3f( 1.0f, 0.0f,-1.0f);
  71.             glVertex3f(-1.0f, 0.0f,-1.0f);
  72.             glVertex3f(-1.0f, 0.0f, 1.0f);
  73.         glEnd();
  74.         */
  75.  
  76.         glDisable(GL_LIGHTING);
  77.  
  78.     glPopMatrix();
  79.  
  80.     glDisableClientState(GL_VERTEX_ARRAY);
  81.     glDisableClientState(GL_NORMAL_ARRAY);
  82.     glDisableClientState(GL_INDEX_ARRAY);
  83.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  84.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

Ich dachte zuerst, das ich nen Fehler in den VBO Daten hab, aber mit dem auskommentierten QUAD geht es auch nicht. Also liegt der Fehler hochstwarscheinlich irgendwo in diesem Codeschnipsel.

€: das Ambient-Licht geht (zumindest kann ich da die Farbe anpassen)

MfG & Thx Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Licht geht nicht
BeitragVerfasst: Fr Dez 16, 2011 17:17 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Ich weiß ja nicht genau was dein Problem ist aber du solltest vllt die w-Koordinate der Lichtposition auf 1.0 setzen.
Bei mir wird sonst alles einheitlich grau, mit w=1.0 wird es dann auch ein wenig "beleuchtigter".


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Licht geht nicht
BeitragVerfasst: Fr Dez 16, 2011 17:22 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Es soll aber ein Parallel-Licht sein, da muss das auf 0 stehen. Siehe hier unter GL_POSITION...

€: mit 1 gehts aber genauso wenig ^^

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Licht geht nicht
BeitragVerfasst: Fr Dez 16, 2011 17:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Vielleicht ist es das:
Du hast zwar

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

dabei aber es fehlt

glEnable(GL_COLOR_MATERIAL);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Licht geht nicht
BeitragVerfasst: Fr Dez 16, 2011 17:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Bin gerade zu Müde um mich damit wirklich auseinander zu setzen, aber vielleicht hilft dir ein Vergleich mit unserem Code.

Besonders hinzuweisen sei auf die Tatsache, dass GL_POSITION erst nach dem setzen des Kamerateils der Modelviewmatrix erfolgt.

greetings
ps: das GL_COLOR_MATERIAL könnte auch helfen. Übrigens: Schön dich mal wieder im Forum zu sehen, Traude!

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Licht geht nicht
BeitragVerfasst: Fr Dez 16, 2011 18:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich schau eigentlich jeden Tag bei Euch rein, aber geschrieben habe ich in letzter Zeit nichts mehr. Ich freu mich aber trotzdem auch, was von Dir zu hören. - Tschuldigung fürs Off-Topic


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Licht geht nicht
BeitragVerfasst: Fr Dez 16, 2011 18:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

ich versteh nicht inwiefern mit das GL_COLOR_MATERIAL helfen könnte. Ich hab die Werte doch vorher alle mit glMaterial festgelegt. Und ändern will ich sie auch nicht mehr. Ich hab es zum Test einfach mal mit rein genommen. Wie erwartet wird der Würfel jetzt weiß gezeichnet. Wenn ich das glColor vor dem zeichnen des Würfels auf (0.1, 0.1, 0.1, 1.0) setze hab ich das gleiche Ergebnis wie ohne GL_COLOR_MATERIAL.
Wenn ich die Position des Lichtes vor der Camera-Bewegung setze, dann dreht sich mein Lichtvektor für das Prallel-Licht mit, er soll aber fest stehen bleiben. Also ist der da schon richtig positioniert. Aber auch hier hab ich es zum Test mal vor die Camera verlegt und dabei hab ich festgestellt, das die Flächen des Würfels sich minimal in ihrere Farbe unterscheiden. Also hab ich das Diffuse Licht mal auf (7, 7, 7, 1) gesetzt und siehe da, die beleuchteten Fläschen werden deutlich heller. Aber 7 ist doch kein normaler Wert für Farben?!

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Licht geht nicht
BeitragVerfasst: Fr Dez 16, 2011 19:59 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Das mit dem gerichteten Licht ist mir schon klar, aber ich weiß ja nicht genau wie es aussehen soll und wie es gerade bei dir aussieht.

Zur Lichtposition:
beim Aufruf von glLightfv(GL_LIGHTi, GL_POSITION, light_position); wird die Position mit der Modelviewmatrix multipliziert und in Augenkoordinaten gespeichert. Du musst daher bei einem festen Licht bei Positionswechsel die Lichtposition erneut übergeben um sie erneut berechnen zu lassen.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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 ]