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);

它没有做我期望它做的事情,而是给我照明,就好像相机所在的地方有一盏灯一样!每个表面都有相同的照明!

我究竟做错了什么?

谢谢你,我很感激。

4

2 回答 2

2

首先要做的是确保你glEnable(GL_LIGHTING);在某个时候打电话。除此之外,首先要检查的是您的法线是否正确。为了使照明正常工作,您需要为您绘制的每个顶点设置一个法线集。如果您已经设置了法线,则应确保它们都是单位长度。如果它们的长度不为 1,则照明的行为可能会很奇怪。如果这就是它应该的全部,您应该记住,当您设置灯光的位置时,它会被当前的 Modelview 矩阵修改,就好像它是一个顶点一样。如果这些事情都不相关,我会看看我是否可以进一步考虑。

于 2010-11-03T01:18:03.047 回答
0

设置变换后设置灯光位置GL_MODELVIEW,因为它受当前变换矩阵的影响。否则你会得到你发现的“前照灯”效果。

于 2010-11-03T02:25:30.580 回答