4

我有一个带有两个简单对象(glutSolidCube 和 glutSolidTeapot)的 openGL 3d 场景。当我在启用 GL_COLOR_MATERIAL 的情况下设置灯光时,我得到以下结果:

在此处输入图像描述

哪个好。然后当我像这样设置自己的材料时:

//diffuse light color variables
GLfloat dlr = 0.4;
GLfloat dlg = 0.6;
GLfloat dlb = 0.9;

//ambient light color variables
GLfloat alr = 0.7;
GLfloat alg = 0.7;
GLfloat alb = 0.7;

//ambient light color variables
GLfloat slr = 0.4;
GLfloat slg = 0.4;
GLfloat slb = 0.4;


GLfloat DiffuseLight[]  = {dlr, dlg, dlb}; //set DiffuseLight[] to the specified values
GLfloat AmbientLight[]  = {alr, alg, alb}; //set AmbientLight[] to the specified values
GLfloat SpecularLight[] = {slr, slg, slb}; //set AmbientLight[] to the specified values

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float *)&AmbientLight);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float *)&DiffuseLight);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float *)&SpecularLight);

我得到了这个非常不同的结果,您可以看到它没有被正确着色,它就像 FLAT 着色虽然我将它定义为 SMOOTH (Gouraud)。

在此处输入图像描述

问题可能出在哪里?是在材质定义上吗?

4

2 回答 2

5

你忘了设置镜面反射

glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 12.0f);

将其设置为 10...25,它看起来会更好/更亮。不过,它看起来不如按像素照明好。光泽度的默认值为零,这看起来与您看到的完全一样 - 即丑陋。

于 2012-05-02T13:33:12.867 回答
1

我得到了这个非常不同的结果,您可以看到它没有被正确着色,它就像 FLAT 着色虽然我将它定义为 SMOOTH (Gouraud)。

嗯,你得到了平滑的阴影。然而,OpenGL 固定函数管道仅评估顶点的照明值,然后在面部上执行重心插值。你得到的结果正是预期的结果。

你想要的是每个像素/片段的照明。实现这一点的唯一方法是使用着色器(嗯,也可以通过修补所谓的“纹理组合器环境”,但要让它正常工作是一项艰巨的工作。实现 Phong 照明着色器是一个问题分钟)。

通过更改照明和材质设置,您只是强调了 Gouraud 着色模型的缺点。

于 2012-05-02T13:19:23.920 回答