在OpenGL中为不同的对象设置单独的材质属性
Setting separate material properties for different objects in OpenGL
我如何在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的颜色渲染,尽管它已经有了自己的颜色集。
我怎么能有两个对象有单独的材料属性,使他们可以显示为不同的颜色,而不是只有一个颜色在整个场景?
你应该写:
glEnable(GL_COLOR_MATERIAL);
作为渲染函数的第一件事,然后设置灯光参数:
glDisable(GL_COLOR_MATERIAL);
glPushMatrix();
然后设置材质的属性并调用对象。从现在开始,所有的对象都有这个属性,如果你想在另一个对象上使用另一个材质,只需键入:
glDisable(GL_COLOR_MATERIAL);
再次,在对第二个对象建模之前,以此类推。如果你还有问题,尽管问。
首先,您的示例代码看起来合理,并且您的对象确实应该具有不同的材质。
但是请记住,您只更改第二个对象的漫射材质颜色,因为您为两个对象设置了完全相同的高光颜色和亮度值。第二个对象的环境也与第一个对象相同,因为你只为漫射通道启用颜色材料,所以环境与第一个对象相同,因为OpenGL是一个状态机。
所以物体之间唯一的材质差异是它们的漫射颜色,这个差异是(101,30,26)。所以会不会是,这个差别被环境和镜面所抵消了它们是完全相等的,所以太小了,你注意不到?尝试完全不同的材料,看看是否真的没有区别。
在绘制第一个对象后,您似乎错过了glPopMatrix
。我不知道这会有什么改变
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在C++中从两个单独的for循环中添加两个数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 用C++在单独的头文件中完成函数体
- 如何在自删除后将对象设置为nullptr
- 类模板的成员功能的定义在单独的TU中完全专业化
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- 如何将 2 个类分成单独的 .h 文件并正确设置它们
- Cmake:为 C 设置警告级别,并为 MSVC 单独设置C++代码(Visual C++)
- 是否可以在单独的线程中将 QObject 设置为 QML 上下文属性?
- 如何将一个类的两个单独实例设置为彼此相等的 c++
- 在单独的类上设置WinEvent
- 将指针设置为一个值加上一个单独的值
- 在qt单元测试中是否可以用单独的方法设置测试数据?
- Setstylesheet没有单独设置属性
- 在OpenGL中为不同的对象设置单独的材质属性