Licht in OpenGL



  • Hey
    Ich habe schon ne ganze Weile gesucht aber finde leider nichts dass das Problem in meinem Programm löst.

    Ich erstelle in Main mit Folgendem eine Lichtquelle:

    void initPosLight(){
    
    	glEnable(GL_DEPTH_TEST);
    	glEnable(GL_LIGHTING); //Enable lighting
    	glEnable(GL_LIGHT0); //Enable light #0	
    	glEnable(GL_NORMALIZE); //Automatically normalize
    
    	glColorMaterial ( GL_FRONT, GL_AMBIENT_AND_DIFFUSE ) ;
    
    	GLfloat lightColor0[] = {1.0f, 1.0f, 1.0f}; 
    	GLfloat LightAmbient[] = {0.0f, 0.0f, 0.0f, 1.0f}; 
    	GLfloat lightPos0[] = {0,210,0}; 
    	GLfloat lightSpec[] = {1,1,1,1};
    
    	glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0f);
    	glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.2f);
    	glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 1.08f);
    
    	glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
    	glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor0);
    	glLightfv(GL_LIGHT0, GL_POSITION, lightPos0);
    	glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpec);
    	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    
    	//o+=1.1f;
    	//i+=1.1f;
    
        glEnable ( GL_COLOR_MATERIAL ) ;
    
        GLfloat mat_ambient[] = { 1.0, 1.0, 1.0, 1.0 };
        GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    
    }
    

    Der Aufruf erfolgt immer am Anfang jedes Frames:

    ...
    
    		glColor3f(1.0f, 1.0f, 1.0f); 
    
    		initPosLight();
    
    		glPushMatrix();
    		glMatrixMode(GL_MODELVIEW);		
    		glLoadIdentity();
    
    		Camera->tick();
    
    		Draw();
    
    		glPopMatrix();
    ...
    

    Das Problem ist dass die Beleuchtung einfach keinen Effekt hat.
    Weder die Veränderung der Position der Lichtquelle noch die der Stärke der Diffuse Einstellung machen einen Unterschied.
    Die Szene wird nur durch Aktivieren (Also Werte größer 0) des AmbientAnteils des Lichts aufgehellt.
    Ich wollte eine Punktlichtquelle erstellen mit der ich sozusagen nur begrenzte Teile der Szene beleuchten kann (Direkt über der Spielfigur)
    Ich habe auch nichts gefunden dass die Reichweite der Lichtquelle regelt.
    Gibt es soetwas in OGL überhaupt? ( Ich kenne nur die Lichtquellen von D3D)
    Ich hatte erst die Vermutung dass die Reihenfolge der Aufrufe eine Rolle spielen könnte, jedoch bleibt das Ergebnis das Gleiche egal wo ich die initPosLight() aufrufe:
    Die Szene ist schwach erleuchtet und kein Anzeichen davon dass es sich um eine Punktlichtquelle handelt (also kein erkennbarer Umkreis)

    Daher die Frage: Wo könnte der Fehler liegen?

    Alles was ich bisher gefunden habe, betrifft zwar oberflächlich das Thema Lichtquelle und Co - aber kaum etwas über Texturen + Licht bzw genauere Beschreibungen dazu. (Reichweite, Positionierung,...)

    EDIT: In Draw rendere ich einige Models auf diese Weise:

    glPushMatrix();
    			glTranslatef(px,py,pz);
    		//	glRotatef(u+=0.01f, 0.0f, 1.0f, 0.0f);	
    			Models[id]->Render();
    			glPopMatrix();
    

    px,py,pz steht dabei für die Position der Models.

    Kann sich dadurch vlt schon ein Fehler mit der Positionierung der Lichtquelle eingeschlichen haben?

    Wäre echt super wenn ihr mir da helfen könntet!



  • Keiner eine Idee?



  • Das Problem ist dass die Beleuchtung einfach keinen Effekt hat.
    Weder die Veränderung der Position der Lichtquelle noch die der Stärke der Diffuse Einstellung machen einen Unterschied.

    Hat Deine Geometrie Normalenvektoren?

    GLfloat lightPos0[] = {0,210,0};

    Positionen sind 4D.

    Ich habe auch nichts gefunden dass die Reichweite der Lichtquelle regelt.

    Benutzt Du doch schon (GL_..._ATTENUATION), schau mal hier rein.


Anmelden zum Antworten