应用材料时结果不良

时间:2012-05-02 11:04:59

标签: opengl

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

enter image description here

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

//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)。

enter image description here

问题出在哪里?它是在材料定义上吗?

2 个答案:

答案 0 :(得分:5)

您忘了设置specular shininess

glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 12.0f);

将它设置为10 ... 25,它看起来会更好/更有光泽。但它看起来不如每像素照明那么好。光泽的默认值为零,看起来与你看到的完全一样 - 即丑陋。

答案 1 :(得分:1)

  

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

嗯,你有光滑的阴影。但是,OpenGL固定功能管道仅在顶点处评估照明值,然后在面上执行重心插值。你得到的结果正是期待的结果。

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

通过改变你的灯光和材质设置,你只需要强调Gouraud阴影模型的缺点。