¿Por qué mi color desaparece cuando habilito la iluminación en OpenGL?


Estoy desarrollando una aplicación gráfica en C++ con la API OpenGL y GLUT.

Para agregar iluminación, hice los siguientes cambios en mi matriz modelview:

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

// Create light components.
GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f };
GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat position[] = { 0.0f, 0.0f, 0.0f, 1.0f };

// Assign created components to GL_LIGHT0.
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
glLightfv(GL_LIGHT0, GL_POSITION, position);

Creo que la iluminación funciona en gran medida, pero los colores de mis objetos desaparecen. Todo lo que veo es una silueta en blanco y negro de mi figura general.

Me preguntaba por qué es esto?

Author: genpfault, 2011-12-13

2 answers

Cuando la iluminación está habilitada, el color de un vértice no se determina a partir del color establecido por glColor o glColorPointer, sino por los colores de material establecidos actualmente combinados con los colores de las luces utilizando los cálculos de iluminación.

Por lo tanto, para cambiar el color de un objeto, debe cambiar la configuración de material (que por defecto es un material gris difuso) antes de renderizar, utilizando el glMaterial funciones. Hay esencialmente un color material correspondiente para cada una de las diferentes luces colores (GL_DIFFUSE, ...) junto con algunas propiedades adicionales para aproximar los materiales emisores de luz (GL_EMISSION) y controlar la rugosidad del material (GL_SHININESS). Lea algunos materiales introductorios sobre las características de iluminación de OpenGL para comprender su funcionamiento.

Lo que puede hacer para adaptar rápidamente su código de color plano a la iluminación (o para habilitar las propiedades del material por vértice) es usar material de color. Llamando a glEnable(GL_COLOR_MATERIAL) y estableciendo una asignación apropiada con glColorMaterial puedes configure OpenGL para cambiar un color de material específico, siempre que cambie el color del vértice actual (usando glColor o glColorPointer).

 30
Author: Christian Rau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-19 18:00:36

Intenta glEnable(GL_COLOR_MATERIAL).

Ver Trampa común de OpenGL #14:

  1. Cuidado Al Habilitar el Material de Color

La función de material de color de OpenGL proporciona una forma menos costosa de cambie los parámetros del material. Con color material habilitado, material los colores rastrean el color actual. Esto significa que en lugar de utilizar el relativamente caro glMaterialfv rutina, puede utilizar el glColor3f rutina.

Aquí hay un ejemplo usando el material de color característica para cambiar el color difuso para cada vértice de un triángulo:

glColorMaterial(GL_FRONT, GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
glBegin(GL_TRIANGLES);
    glColor3f(0.2, 0.5, 0.8);
    glVertex3f(1.0, 0.0, 0.0);
    glColor3f(0.3, 0.5, 0.6);
    glVertex3f(0.0, 0.0, 0.0);
    glColor3f(0.4, 0.2, 0.2);
    glVertex3f(1.0, 1.0, 0.0);
glEnd();

Considere la secuencia de código más costosa necesaria si glMaterialfv es usado explícitamente:

GLfloat d1[] = { 0.2, 0.5, 0.8, 1.0 };
GLfloat d2[] = { 0.3, 0.5, 0.6, 1.0 };
GLfloat d3[] = { 0.4, 0.2, 0.2, 1.0 };

glBegin(GL_TRIANGLES);
    glMaterialfv(GL_FRONT,GL_DIFFUSE,d1);
    glVertex3f(1.0, 0.0, 0.0);
    glMaterialfv(GL_FRONT,GL_DIFFUSE,d2);
    glVertex3f(0.0, 0.0, 0.0);
    glMaterialfv(GL_FRONT,GL_DIFFUSE,d3);
    glVertex3f(1.0, 1.0, 0.0);
glEnd();

Si está renderizando objetos que requieren material simple frecuente cambios, trate de utilizar el modo de material de color. Sin embargo, hay un escollo común encontrado al habilitar el modo de material de color. Cuando el material de color está habilitado, OpenGL cambia inmediatamente el material colores controlados por el estado material del color. Considere lo siguiente pieza de código para inicializar un contexto de renderizado OpenGL recién creado:

GLfloat a[] = { 0.1, 0.1, 0.1, 1.0 };
glColor4f(1.0, 1.0, 1.0, 1.0);

glMaterialfv(GL_FRONT, GL_AMBIENT, a);
glEnable(GL_COLOR_MATERIAL); /* WARNING: Ambient and diffuse material latch immediately to the current color. */
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glColor3f(0.3, 0.5, 0.6);

¿En qué estado estarán los colores del material ambiente y difuso del frente? ¿ejecutando el fragmento de código anterior? Mientras que el programador puede tener destinado a que el estado ambiental del material sea (0.1, 0.1, 0.1, 1.0) y el estado material difuso a ser (0.3, 0.5, 0.6, 1.0), que no es bastante lo que pasa.

El estado material difuso resultante es lo que el programador destinado, pero el estado ambiente material resultante es bastante inesperado (1.0, 1.0, 1.0, 1.0). ¿Cómo pasó eso? Bueno, recuerde que el modo de material de color inmediatamente comienza a rastrear el color actual cuando permitir. El valor inicial para la configuración del material de color es GL_FRONT_AND_BACK y GL_AMBIENT_AND_DIFFUSE (probablemente no lo ¡lo esperabas!).

Desde que se habilita el modo de material de color comienza inmediatamente el seguimiento de la color actual, los estados materiales ambiente y difuso son actualizado a ser (1.0, 1.0, 1.0, 1.0). Tenga en cuenta que el efecto de la inicial glMaterialfv se pierde. A continuación, el estado del material de color es actualizado para cambiar el material frontal difuso. Por último, el glColor3f la invocación cambia el material difuso a (0.3, 0.5, 0.6, 1.0). El estado material ambiente termina siendo (1.0, 1.0, 1.0, 1.0).

El problema en el fragmento de código anterior es que el modo de material de color se habilita antes de llamar a glColorMaterial. El modo de material de color es muy eficaz para cambios materiales simples eficientes, pero para evitar lo anterior trampa, siempre tenga cuidado de establecer glColorMaterial antes habilita GL_COLOR_MATERIAL.

 19
Author: genpfault,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-26 17:20:54