2011-10-12 24 views
5

¿Cómo puedo tener propiedades de materiales separadas para diferentes objetos dibujados en OpenGL? Hice el siguiente código, que al parecer sólo se muestra el color más tarde:Establecer propiedades de materiales separadas para diferentes objetos en OpenGL

//************** Object 1 ************** 
glEnable(GL_COLOR_MATERIAL); 
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 
glColor4f(149.0/255.0, 78.0/255.0, 22.0/255.0, 1.0); 
float mat_specular[] = {0.992157, 0.941176, 0.807843, 1.0}; 
float shininess = 10; 

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 
glMaterialf(GL_FRONT, GL_SHININESS, shininess); 

glPushMatrix(); 
glTranslatef(0, 3.0, 0); 
drawSphere(0.1, 0.1, 0.1); 
glRotatef(10, 1, 0, 0); 

glDisable(GL_COLOR_MATERIAL); 


//************** Object 2 ***************** 
glEnable(GL_COLOR_MATERIAL); 
glColorMaterial(GL_FRONT, GL_DIFFUSE); 
glColor4f(48.0/255.0, 48.0/255.0, 48.0/255.0, 1.0); 
float mat_specular_2[] = {0.992157, 0.941176, 0.807843, 1.0}; 
float shininess_2 = 10; 

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular_2); 
glMaterialf(GL_FRONT, GL_SHININESS, shininess_2); 

glPushMatrix(); 
glTranslatef(-0.6, 0.2, 1.6/2.0); 
drawSphere(0.1, 0.1, 0.1); 
glPopMatrix(); 

glDisable(GL_COLOR_MATERIAL); 

Cuando se representa, el color establecido para el objeto 2 se utiliza para toda la escena. Por lo tanto, el objeto 1 también se representa en el color del objeto 2 a pesar de tener su propio conjunto de colores.

¿Cómo puedo tener los 2 objetos que tienen propiedades de material separadas de manera que se pueden mostrar como diferentes colores en lugar de sólo uno de los colores de toda la escena?

+1

¿Podemos ver drawSphere() por favor? – Calvin1602

Respuesta

1

Primero, su código de ejemplo parece razonable y sus objetos deberían tener materiales diferentes.

Pero hay que tener en cuenta que sólo cambia el color del material difuso para su segundo objeto, tal como se establece exactamente los mismos colores especulares y los valores de brillo para ambos objetos. Y el ambiente del segundo objeto también es el mismo que para el primero, ya que solo habilita el material de color para el canal difuso, por lo que el ambiente no cambia desde el primer objeto, como OpenGL es una máquina de estado.

Así que la única diferencia importante entre los objetos es su color difuso y esta diferencia es (101, 30, 26). Entonces, ¿puede ser que esta diferencia solo sea superada por los términos ambiente y especular que son completamente iguales y, por lo tanto, es demasiado pequeña para que usted lo note? Pruebe materiales completamente diferentes y vea si realmente no hay diferencia.

0

Parece que ha perdido una glPopMatrix después de dibujar el primer objeto. No sé cómo eso cambiaría las cosas.

+2

Parece que no entiendes para qué se utiliza 'glPopMatrix()'. Su respuesta no ayuda a resolver el problema en absoluto. –

3

se debería poner:

glEnable(GL_COLOR_MATERIAL); 

A medida que la primera cosa en su función de representar, a continuación, establecer los parámetros de la luz:

glDisable(GL_COLOR_MATERIAL); 
glPushMatrix(); 

continuación, establezca las propiedades del material y llamar al objeto. Todos los objetos a partir de ahora tendrán esta propiedad, si desea utilizar otro material en otro objeto sólo tiene que escribir:

glDisable(GL_COLOR_MATERIAL); 

nuevo, antes de modelar el segundo objeto y así sucesivamente. Si todavía tiene preguntas, solo pregunte.

Cuestiones relacionadas