在OpenGL中为不同对象设置单独的材质属性

时间:2011-10-12 04:16:47

标签: c++ opengl material

如何在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);

渲染时,对象2的颜色集用于整个场景。因此,尽管已经拥有自己的颜色集,但对象1也以对象2的颜色呈现。

如何让2个对象具有单独的材质属性,以便它们可以在整个场景中显示为不同的颜色而不只是一种颜色?

3 个答案:

答案 0 :(得分:3)

你应该把:

glEnable(GL_COLOR_MATERIAL);

作为渲染功能的第一件事,然后设置灯光参数:

glDisable(GL_COLOR_MATERIAL);
glPushMatrix();

然后设置材质的属性并调用对象。从现在开始,所有对象都将具有此属性,如果要在另一个对象上使用其他材质,只需键入:

glDisable(GL_COLOR_MATERIAL);

再次,在建模第二个对象之前,依此类推。如果您仍有疑问,请询问。

答案 1 :(得分:1)

首先,您的示例代码看起来合理,您的对象确实应该有不同的材料。

但请记住,您只需更改第二个对象的漫反射材质颜色,因为您为两个对象设置了完全相同的镜面反射颜色和光泽值。并且第二个对象的环境也与第一个对象的环境相同,因为您只为漫反射通道启用了颜色材质,因此环境与第一个对象保持不变,因为 OpenGL是状态机

因此,对象之间唯一的物质差异是它们的漫反射颜色,这种差异是(101,30,26)。那么,这种差异只会被完全相同的环境和镜面条件所超越,因此它们太小而无法注意到吗?尝试完全不同的材料,看看是否真的没有区别。

答案 2 :(得分:0)

在绘制第一个对象后,您似乎错过了glPopMatrix。我不知道这会改变什么。