照明和材料颜色问题

时间:2014-05-31 13:49:09

标签: opengl

启用照明后,我无法更改任何对象颜色。

这是我的初始化函数(光和材质的一部分):

glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
GLfloat light_ambient[] = {0.5, 0.5, 0.5, 1.0};
GLfloat light_diffuse[] = {0.0, 0.5, 0.5, 1.0};
GLfloat light_specular[] = {0.0, 0.0, 0.5, 1.0}; 
GLfloat light_position[]={0, -1.0, 0, 0.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

每个对象都有一个颜色矢量。这就是我绘制对象的方式:

float mat_a[] = {0.0, 0.0, 0.0, 1.0};
float mat_d[] = {0.0, 0.0, 0.0, 1.0};
float mat_s[] = {0.0, 0.0, 0.0, 1.0};
...
colors_vect = some_object->getColor();
glDisable(GL_COLOR_MATERIAL);
mat_a[0] = colors_vect.at(0);
mat_a[1] = colors_vect.at(1);
mat_a[2] = colors_vect.at(2);
mat_d[0] = colors_vect.at(3);     //The values are correct.
mat_d[1] = colors_vect.at(4);
mat_d[2] = colors_vect.at(5);
mat_s[0] = colors_vect.at(6);
mat_s[1] = colors_vect.at(7);
mat_s[2] = colors_vect.at(8);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_a);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_d);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_s);
glEnable(GL_COLOR_MATERIAL);

glBegin(GL_POLYGON);
...

此代码不起作用。我试图给垫子一些随机值,但仍然没有任何变化。
我做错了什么?任何帮助,将不胜感激!

1 个答案:

答案 0 :(得分:2)

您的问题是由此行引起的:

glEnable(GL_COLOR_MATERIAL);

这使得功能允许材质属性跟踪当前颜色,即使用常规glColor()调用设置的颜色。如果启用此选项,glColorMaterial()将控制材质参数的哪些部分跟踪当前颜色。默认值为GL_AMBIENT_AND_DIFFUSE,这意味着当前颜色用于环境和漫反射材质参数。

您需要选择如何更新材料属性:

  • 如果您需要经常更改颜色,最有效的方法是启用GL_COLOR_MATERIAL,并使用glColor()更新材料属性。
  • 您可以使用glColorMaterialfv(),这可以让您获得更多控制权,例如允许您为环境和漫反射设置不同的颜色。对于此方法,您需要禁用GL_COLOR_MATERIAL

您使用了这两者的混合,您可以使用glColorMaterialfv()设置材料属性,但也启用了GL_COLOR_MATERIAL。这意味着不使用您设置的环境和漫反射材质属性。而是将当前颜色用于这两个属性。只要您拨打glColor(),这些属性就会发生变化。如果你从不打电话给glColor(),他们会使用当前颜色的默认值,即白色(1.0,1.0,1.0,1.0)。