Licht

In deze handleiding laat ik je zien hoe je je wereld kunt verlichten. Het enigste wat ik hier laat zien is hoe je lichten kunt plaatsen in je scene en ik zal niet elk soort licht dat je kunt gebruiken bespreken. Je kunt dus het beste zelf wat experimenteren door andere waardes in te vullen. Voor deze handleiding maak ik gebruik van het programma uit het vorige hoofdstuk met een paar kleine aanpassingen.


///////////////////////////////////////////////////////////////////////////
//Voorwerp Box
///////////////////////////////////////////////////////////////////////////
void box(float xpos,float ypos,float zpos)
{
	glPushMatrix();
		glTranslatef(xpos,ypos,zpos);
				
		glBegin(GL_QUADS);
		// Front Face
		glNormal3f(0.0,0.0,1.0);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);	
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);	
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);	
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);	
		// Back Face
		glNormal3f(0.0,0.0,-1.0);
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);	
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);	
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);	
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);	
		// Top Face
		glNormal3f(0.0,1.0,0.0);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);	
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);	
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);	
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
		// Bottom Face
		glNormal3f(0.0,-1.0,0.0);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);	
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);	
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);	
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);	
		// Right face
		glNormal3f(1.0,0.0,0.0);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);	
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);	
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);	
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);	
		// Left Face
		glNormal3f(-1.0,0.0,0.0);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);	
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);	
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);	
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);	
	glEnd();

	glPopMatrix();
}
In de code van de "box" komen we eerst een nieuwe functie tegen die erg belangrijk is voor als je lichten wilt toevoegen. Het gaat dus om de glNormal3f() functie die de normaal van de vertex bepaalt waardoor OpenGL onderandere de goede invalshoek kan bepalen. Hoe je de normaal van een vertex bepaalt is voor en box nog niet zo moeilijk, de normaal van de bovenkant wijst naar boven dus (0.0,1.0,0.0) en voor de onderkant (0.0,-1.0,0.0). De normaal staat dus loodrecht op het vlak.

///////////////////////////////////////////////////////////////////////////
//initialisatie van opengl
///////////////////////////////////////////////////////////////////////////
void initgl()
{
	glClearColor(0.0f,0.0f,0.0f,0.0f);
	glShadeModel(GL_SMOOTH);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_CULL_FACE);
	glEnable(GL_TEXTURE_2D);
	glEnable(GL_LIGHTING);

	float ambientlight[]={0.5f,1.0f,0.5f,1.0f};

	float position[]={2.0f,3.0f,3.0f,1.0f};
	float direction[]={0.0f,0.0f,-1.0f};

	float matspecular[]={1.0f,1.0f,1.0f,1.0f};

	glLightfv(GL_LIGHT0, GL_AMBIENT, ambientlight);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, ambientlight);

	glLightfv(GL_LIGHT0, GL_POSITION, position);

	glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 40.0f);
	glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 30.0f);
	glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction);

	glEnable(GL_LIGHT0);

	glEnable(GL_COLOR_MATERIAL);
	glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

	glMaterialfv(GL_FRONT, GL_SPECULAR, matspecular);
	glMaterialf(GL_FRONT, GL_SHININESS, 10.0f);
	
}
Bij de initialisatie van OpenGL maak ik ook het licht door eerst glEnable(GL_LIGHTING) op te roepen, als je nu je programma uitprobeert merk je dat het helemaal donker zodat je ook geen voorwerpen meer ziet dus zul je nu licht toe moeten voegen. Eerst maken we 4 array's waar we waarden in kunnen zetten die we voor het instellen van licht nodig hebben. Met de functie glLightfv() kunnen we nu lichten maken tot een maximum van 8. De eerste parameter die glLightfv ontvangt is het nummer van het licht, dus GL_LIGHT0 t/m GL_LIGHT7. Met de tweede parameter van glLightfv kun je instellingen maken voor onderandere het soort licht, de straal hoek, en de positie. Je kunt hier een beetje mee experimenteren om te zien wat ze doen en voor een complete lijst met mogelijkheden moet je maar even bij de referenties kijken. Als we het licht dan hebben ingesteld moeten we deze nog even aanzetten door glEnable(GL_LIGHT0) op te roepen. De laatste regels die je ziet zijn in principe gelijk an die van de licht instellingen alleen dan voor de materiaal instellingen. Ik raad je aan om zelf een beetje te experimenteren met lichten en materialen zodat je hier wat bekender mee wordt.

Succes

Vampire,