Superfices e Iluminacion en OpenGL

MATERIAL

En OpenGL es posible especificar el un material por cada lado de un polígono. Para determinar cual es el “derecho” y el “revés” de un polígono es necesario inicializar el winding (CCW o CW). Adicionalmente a suministrar los vértices de la primitiva es ahora necesario suministrar una normal a la superficie dentro de glBegin/glEnd:

void glNormal3{bsifd}( T coords );
void glNormal3{bsifd}v( T coords );

Para aquellos que no han visto o se saltaron los cursos de matemática vectorial una normal a un plano es un vector 3d perpendicular a este y la normal de una superficie en un punto determinado es un vector 3d perpendicular al plano tangente de la superficie de este punto. Para el caso del plano (triangulo, rectángulo o cualquier polígono plano) el cálculo de la normal es trivial ya que corresponde al producto cruz de dos vectores cualquier (no paralelos) que se encuentren en el plano así:

Producto cruz

Es recomendable entregar a OpenGL estos vectores nomalizados (norma 1), aunque es posible entregarlos de cualquier magnitud y dejar que el API realice el respectivo proceso de escala activando el estado GL_NORMALIZE , aunque esto puede afectar ligeramente el rendimiento.

Es posible especificar una normal diferente para cada vértice y OpenGL se encarga de interpolar estos valores a lo largo de la primitiva. Esto es bastante útil, especialmente a la hora de simular superficies curvas utilizando pocos polígonos. En técnicas mas avanzadas como “normal maps” se utiliza una textura completa que indica como se deben elaborar normales per-pixel.

De la misma manera en que en la luz era necesario especificar los parámetros de emisión difusos, ambientales y de brillo, en el caso de los materiales es necesario especificar estos mismos, solo que ahora son de “absorción”. Esto se hace mediante el llamado a las funciones:

void glMaterial{if}( enum face, enum pname, T param );
void glMaterial{if}v( enum face, enum pname, T params );

  • enum face : Indica la cara en que se esta cambiando la propiedad del material, los valores pueden ser GL_FRONT, GL_BACK y GL_FRONT_AND_BACK.
  • enum pname : Indica la propiedad a cambiar, los valores son GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR Y GL_SHININESS. Este ultimo parámetro corresponde a un numero flotante entre 0.0 y 128.0 e indica que tan amplio debe ser el brillo sobre la superficie, un valor pequeño indica que el brillo será sobre zonas reducidas.
  • T params : Corresponde a los parámetros, pueden variar desde 1 hasta 4.

Tetera Luz

download


Descargar:	superficies.zip
Version:	0.1
Actualizado:	December 22, 2009
Tamaño:		93.42 KB

Este demo muestra algunos materiales sobre la famosa tetera, todos están bajo una luz con w=0, blanca y de intensidad media. Los diferentes parámetros con que fueron creados se encuentran en el código fuente del ejemplo. El primer material (plástico negro) corresponde a las propiedades:

const GLfloat plasticoNegroAmb[4] = {0.0f,0.0f,0.0f,1.0f};
const GLfloat plasticoNegroDif[4] = {0.01f,0.01f,0.01f,1.0f};
const GLfloat plasticoNegroSpe[4] = {0.5f,0.5f,0.5f,1.0f};
GLfloat plasticoNegroShi = 32.0f;

//Y se deben ajustar asi antes de dibujar la tetera:
…
//Plastico Negro
   glMaterialfv(GL_FRONT, GL_AMBIENT, plasticoNegroAmb);
   glMaterialfv(GL_FRONT, GL_DIFFUSE, plasticoNegroDif);
   glMaterialfv(GL_FRONT, GL_SPECULAR, plasticoNegroSpe);
   glMaterialf(GL_FRONT, GL_SHININESS, plasticoNegroShi);

1 2 3

Compartir esta entrada

DiggReddit
  • http://yahoo.com Anel Lopez Guido

    exelentes exposiciones en opengl cual sujerencia ami correo

  • Kriss

    :roll: ummm no entendi :(

  • isaac

    gracias por los ejemplos me han servido de mucho

  • carlos

    men sabees utilizarlo en java?

  • Pingback: Superfices e iluminacion en opengl | Curso Manual Tutorial()

  • http://dejuv3d.es.tl 6mon

    men, ¿como no hay un parametro para la intensidad de la luz? o ¿como hago para que los objetos que se alejan de la luz se oscurescan, y los que se acercan se aclaren?

  • Transtor

    Gracias me sirvio salu2 desde Puebla…

  • http://black-byte.com Jotatsu

    Saludos 😀