OpenGL + Glut

[Principal] [Índice de artículos] [Capítulo 1] [Capítulo 2] [Capítulo 4]

Capítulo 3: Pequeñas mejoras e iluminación básica.

Hay algunas funciones que podemos usar para que los objetos desplegados es pantalla se vean mejor, para esto crearemos una función que llamaremos void inicializar(), y dentro de ésta pondremos todo estos códigos.

Los valores difuso (luz o material) es el color del objeto, el ambiente, el color del lugar más oscuro, especular el color del lugar con mayor luz, y shininess, la concentracion de puntos luminosos.

GLfloat luzdifusa[]= { 1.0, 1.0, 1.0, 1.0 };	// Definimos valores de luz difusa, máxima intensidad de luz blanca
GLfloat luzambiente[]= { 0.5, 0.5, 0.5, 1.0 };	// Definimos valores de luz ambiente
GLfloat luzspecular[]= { 0.0, 0.0, 0.0, 0.0};	// Definimos el valor specular de la luz
GLfloat luzemision[]= { 0.0, 0.0, 0.0, 0.0};	// Definimos el valor de emisión de la luz
GLfloat posicion[]= { 1.0, 1.0, 1.0 , 0.0};	    // La posición de la luz
GLfloat brillo = 10;				// Definimos el brillo de la luz (exponente de una ecuación)
 
void inicializar() {
	glShadeModel(GL_SMOOTH);	// Esto hace que al dibujar las sombras en los objetos, 
								// se vean mas parejas haciendo que se vean mejor.
	glClearColor(0.0, 0.0, 0.0, 0.0);	// Pondremos acá la función glclearcolor
	// Las 3 líneas siguientes hacen que el depth buffer ordene los objetos que deben 
    // ser puestos primero en pantalla y los que deben ser dibujados después dependiendo 
	// de cuan cerca están de la cámara.
	glClearDepth(1.0);	
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// Esto hace que opengl calcule las 
														// perspectivas de la mejor forma, 
														// quita un poco de rendimiento, pero 
														// hace que las perspectivas se vean 
														// un poco mejor.
	// Ahora vamos a inicializar las luces.
	glLightfv(GL_LIGHT0, GL_DIFFUSE, luzdifusa);	// Ponemos valores a la luz 0
	glLightfv(GL_LIGHT0, GL_AMBIENT, luzambiente);	// Ponemos valores a la luz 0
	glLightfv(GL_LIGHT0, GL_SPECULAR, luzspecular); // Ponemos valores a la luz 0
	glLightfv(GL_LIGHT0, GL_EMISSION, luzemision);	// Ponemos valores a la luz 0
	glLightfv(GL_LIGHT0, GL_SHININESS, brillo);	    // Ponemos valores a la luz 0
	glLightfv(GL_LIGHT0, GL_POSITION, posicion);	// Ponemos la posición para gl_light1
	glEnable(GL_LIGHTING);				// Activamos la iluminación.
	glEnable(GL_LIGHT0);				// Ahora ponemos la luz que ya definimos
}

Para probar la luz y las correcciones, vamos a dibujar algunos objetos 3D, usando los predefinidos de la librería GLUT, como glutSolidTeapot. Se puede probar cambiando los valores de cada variable que define a la luz, y hay que decir que no son obligatorios todos los parámetros, si se quiere luz, por lo menos hay que definir la posición y después usar glEnable(GL_LIGHT0) y glEnable(GL_LIGHTING).

Ahora para darle colores a los objetos bajo luz, hay que definirles un material, esta definición es parecida a la definición de luz, las variables son parecidas, y se implementan con glMaterialfv.

GLfloat material_difuso[]={1.0, 1.0, 0.5, 0.0};		// Definición de un material
GLfloat material_ambiente[]={0.0, 0.0, 0.0, 0.0};	// Definición de un material
GLfloat material_specular[]={1.0, 1.0, 0.0, 0.0};	// Definición de un material
GLfloat material_emission[]={0.0, 0.0, 0.0, 0.0};	// Definición de un material
GLfloat brillo=90;									// Definición de un material

Y luego los llamamos antes de dibujar el objeto al cual le queremos poner esta materia.

glMaterialfv(GL_FRONT, GL_DIFFUSE, material_difuso);
glMaterialfv(GL_FRONT, GL_AMBIENT, material_ambiente);
glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, material_emission);
glMaterialfv(GL_FRONT, GL_SHININESS, brillo);

Y efectuamos los dibujos.

[Anterior] [Siguiente]