c++ - 在 OpenGL 中为不同的对象设置单独的 Material 属性

标签 c++ opengl

如何为在 OpenGL 中绘制的不同对象设置单独的 Material 属性? 我做了以下代码,显然只显示了后来的颜色:

//************** 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 个对象具有单独的 Material 属性,以便它们可以显示为不同的颜色,而不是在整个场景中只显示一种颜色?

最佳答案

你应该放:

glEnable(GL_COLOR_MATERIAL);

作为渲染函数中的第一件事,然后设置光照参数:

glDisable(GL_COLOR_MATERIAL);
glPushMatrix();

然后设置 Material 的属性,调用对象。从现在开始,所有对象都将具有此属性,如果您想在另一个对象上使用另一种 Material ,只需键入:

glDisable(GL_COLOR_MATERIAL);

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

关于c++ - 在 OpenGL 中为不同的对象设置单独的 Material 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7735203/

相关文章:

c++ - 在 C++ 中将两个具有相同长度的 int vector 转换为一个由 int 对组成的 vector

c++ - n 选择 k 有条件的实现

c++ - QOpenGLWidget 不在整个小部件中呈现

c++ - 如何在 C++ OpenGL 应用程序中播放 FLV 文件?

c++ - 如何为点云赋予纹理?

c++ - 如何定义依赖于模板参数的 typedef 的 typedef

python - 错误 : stray '\' in program in macro definition

C++ Persistent Vector,用文本文件中的数据填充 vector

opengl - 实现制作片状法线贴图纹理

python - 找不到匹配的 GLX 视觉