OpenGL照明问题

3
我已经开始开发一个游戏引擎一个月了,完成了基本的OpenGL工作。然而,有一件事情我无法按照期望运行,那就是光照。 (注意:这是我第一次认真使用OpenGL)
我希望实现接近真实的光照模拟 - 面向光源的表面比远离光源的表面更亮等。基本光应该有位置和颜色。这是我认为它可以被实现的方式:
float lightv[4]; // populated with (0.6, 0.6, 0.6, 1)
float positionv[4]; // populated with (0, 10, 0, 1)
int lightID = GL_LIGHT0;
int attenuationType = GL_LINEAR_ATTENUATION;
float attenuationValue = 1;
glLightf(lightID, attenuationType, attenuationValue);
glLightfv(lightID, GL_DIFFUSE, lightv);
glLightfv(lightID, GL_POSITION, positionv);
glEnable(lightID);

与我预期的不同,它给我提供了像相机所在处有灯光一样的照明!每个表面都有相同的照明!

我做错了什么?

谢谢,感激不尽。

2个回答

2
首先要做的是确保您在某个时刻调用了glEnable(GL_LIGHTING);。除此之外,第一件要检查的事情是您的法线是否正确。为了使光照正常工作,您需要为每个绘制的顶点设置一个法线。如果您已经设置了法线,则应确保它们都具有单位长度。如果它们的长度不为1,则光照可能会表现出奇怪的效果。如果一切正常,您应该记住,当您设置光的位置时,它会像顶点一样受到当前Modelview矩阵的修改。如果以上这些都不相关,我会想看看是否还有其他问题。

0
在设置GL_MODELVIEW变换之后,设置光源的位置,因为它受当前变换矩阵的影响。否则,你会遇到你发现的“车头灯”效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接