打开GL照明问题

时间:2010-11-03 00:32:42

标签: c++ opengl lighting

我已经在游戏引擎上工作了一个月了,我已经完成了基本的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 个答案:

答案 0 :(得分:2)

要做的第一件事是确保在某个时候调用glEnable(GL_LIGHTING);。过去,首先要检查的是你的法线是否正确。要使光照正常工作,您需要为每个绘制的顶点设置一个法线集。如果您已经设置了法线,则应确保它们都是单位长度。如果它们的长度不是一个,则照明可能会很奇怪。如果这一切都是应该的那样,你应该记住,当你设置灯光的位置时,它会被当前的Modelview矩阵修改,就像它是一个顶点一样。如果这些事情都不相关,我会看看我是否能够进一步思考。

答案 1 :(得分:0)

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