Der letzte macht das Licht aus...
-
... aber was mache ich, wenn meine OpenGL-Szene irgendwie die Lichtparameter des letzten Frames gespeichert hat? Hintergrund: Ich möchte per Radiobutton die Lichtquelle abschalten und die Normalen entfernen. Aber irgendwie speichert er da etwas im Hintergrund. Die Lichtquelle ich zwar aus, aber wenn ich die Kamera um das Objekt bewege, ändert sich die Helligkeit der Polygone, als wenn die Normalen noch da wären. Ich benutze dazu eine Membervarible, die entweder 1=an oder 0=aus ist. Nur wenn ich eine 1 habe wird die Lichtquelle definiert und aktiviert und die Normalen berechnet, ansonsten überspringt er diese Teile. Hier die Lichtquelle:
if (m_cLight==1) { GLfloat specular [] = { 0.0, 0.0, 0.0, 0.0 }; GLfloat shininess [] = { 25.0 }; GLfloat position [] = { 0.0, 0.0, 5.0, 0.0 }; // Define material properties of specular color and degree of // shininess. Since this is only done once in this particular // example, it applies to all objects. Material properties can // be set for individual objects, individual faces of the objects, // individual vertices of the faces, etc... glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess); // Set the GL_AMBIENT_AND_DIFFUSE color state variable to be the // one referred to by all following calls to glColor glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); // Create a Directional Light Source glLightfv(GL_LIGHT0, GL_POSITION, position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); }Kann ich irgendwie das Licht direkt per Befehl abschalten?
-
hm... also das kommt mir bekannt vor,mein Bruder sagt,dass:
Er den ganzen Quellcode sehen will,da du irgendetwas falsch gemacht hast,also vielleicht da noch eine else,also poste mal den ganzen code
-
Nur das wichtigste:
void COpenGLCtrl::InitGL() { // set camera for draw mode 0 (Graph) if (m_intDrawType==0) { m_fPosX = 0.0f; // X position of model in camera view // -0.4 m_fPosY = -0.3f; // Y position of model in camera view -0.6 m_fZoom = 2.2f; // Zoom on model in camera view 1.3 m_fRotX = 10.0f; // Rotation on model in camera view 20.0 m_fRotY = 25.0f; // Rotation on model in camera view 35.0 } // build font BuildFont(); // Build The Font (NEW) glEnable(GL_COLOR_MATERIAL); }void COpenGLCtrl::OnPaint() { glLoadIdentity(); if (m_cLight==1) { GLfloat specular [] = { 0.0, 0.0, 0.0, 0.0 }; GLfloat shininess [] = { 25.0 }; GLfloat position [] = { 0.0, 0.0, 5.0, 0.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glLightfv(GL_LIGHT0, GL_POSITION, position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } glTranslatef(0.0f, 0.0f, -m_fZoom); glTranslatef(m_fPosX, m_fPosY, 0.0f); glRotatef(m_fRotX, 1.0f, 0.0f, 0.0f); glRotatef(m_fRotY, 0.0f, 1.0f, 0.0f); PAINTSTRUCT paintInfo; CRect windowRect; GetWindowRect(&windowRect); memset(&paintInfo, 0, sizeof(PAINTSTRUCT)); paintInfo.hdc = dc->m_hDC; paintInfo.fErase = FALSE; paintInfo.rcPaint = windowRect; BeginPaint(&paintInfo); openGLDevice.makeCurrent(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); switch (m_intDrawType) { case 0: DrawGraph(); break; case 1: DrawCubes(); break; } SwapBuffers(dc->m_hDC); EndPaint(&paintInfo); }void COpenGLCtrl::DrawCubes() { [...] GLpoint p1,p2,p3; GLpoint n; [...] glBegin(GL_QUADS); [p1-p3 berechnen...] if (m_cLight==1) { ComputeFaceNormal(&p1,&p2,&p3,&n); glNormal3f(n.x,n.y,n.z); } glVertex3f(p1.x,p1.y,p1.z); glVertex3f(p2.x,p2.y,p2.z); glVertex3f(p3.x,p3.y,p3.z); glVertex3f((float)((scale*x)-(scale*0.5)),(float)-((scale*y)-(scale*0.5)),(float)(zscale*zArray[(XCHIPSIZE*y)+x])); glEnd();
-
das ist ja alles durcheinander,also wenn du des zusammentust vertragt sich das ja net

den ganzen code oder wir lassen es
-
Das midde ganzen Code is schwachsinnig, wenn man etwas nicht aus der Aufgabenstellung herauslesen kann dann müssen halt Tips zum debuggen oder Screenshots angefordert werden, aber net doch der ganze SourceCode.
Ansonsten würde ich dir mal empfehlen einen else Teil deiner if Anweisung zu machen mit
glDisable statt glEnable des Ligthings
-
Tja Martin...
Greetz, Swordfish
-
Dachte ich es mir doch, den ganzen Code kann man auch nicht posten. Ausserdem war meine Kernfrage, wie man das Licht per Befehl ausschalten kann. Das glDisable wurde danach ja genannt, danke

Aber die Frage nach den Normalen bleibt: Speichert OpenGL die Normalen von einem zum anderen Frame? So wie das bei mir jetzt läuft müsste die Antwort "ja" lauten. Wie kann ich die wieder zurücksetzen?
EDIT: Ok, Thema erledigt. Das glDisable(LIGHTING) schaltet auch die Normalen aus. Danke!
-
Nur mal so zum Nachtrag, hab zwar keine Ahnung von OpenGl und Co (is zu lange her)
Aber die normalen musst du jedesmal angeben, allerdings sieht man diese natürlich nicht. Wenn du sie angibst werden sie allerdings in die Lichtberechnung mit einbezogen.
Also mach dir keine Sorgen darüber das die normalen gespeichert werden über Frames hinaus, das wäre garnicht möglich.
glDisable Lighting schaltet einfach nur das Licht aus, was du ja nicht getan hast ...Wenn du zwischendurch nichts anderes renderst dann reicht es wenn du in deiner if abfrage jediglich glEnable und disable lighting machst, der Rest der Licht initialisierung wird gespeichert und brauch nicht jedesmal gesetzt werden.