启用照明后,我无法更改任何对象颜色。
这是我的初始化函数(光和材质的一部分):
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);
...
此代码不起作用。我试图给垫子一些随机值,但仍然没有任何变化。
我做错了什么?任何帮助,将不胜感激!
答案 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)。