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.
© Mayo de 2.001, Con Clase, webmaster@conclase.net