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

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:

C++:
  1. const GLfloat plasticoNegroAmb[4] = {0.0f,0.0f,0.0f,1.0f};
  2. const GLfloat plasticoNegroDif[4] = {0.01f,0.01f,0.01f,1.0f};
  3. const GLfloat plasticoNegroSpe[4] = {0.5f,0.5f,0.5f,1.0f};
  4. GLfloat plasticoNegroShi = 32.0f;
  5.  
  6. //Y se deben ajustar asi antes de dibujar la tetera:
  7. //Plastico Negro
  8.    glMaterialfv(GL_FRONT, GL_AMBIENT, plasticoNegroAmb);
  9.    glMaterialfv(GL_FRONT, GL_DIFFUSE, plasticoNegroDif);
  10.    glMaterialfv(GL_FRONT, GL_SPECULAR, plasticoNegroSpe);
  11.    glMaterialf(GL_FRONT, GL_SHININESS, plasticoNegroShi);

COMENTARIOS
  1. Comentario por Anel Lopez Guido .

    exelentes exposiciones en opengl cual sujerencia ami correo


Dejar un comentario

:mrgreen: :| :twisted: :arrow: 8O :) :? 8) :evil: :D :idea: :oops: :P :roll: ;) :cry: :o :lol: :x :( :!: :?: