每片段照明坐标系

时间:2011-07-12 20:24:22

标签: opengl glsl shader coordinate-systems lighting

我正在使用着色器开发一个OpenGL 2.1应用程序,我的每片段光照有问题。当我的场景初始加载时,照明是正确的,但是当我在场景中导航时,灯光会随着“相机”移动,而不是停留在静态位置。例如,如果我将光线照射到右侧,则物体的右侧将被照亮。如果我然后将相机移动到物体的另一侧并指向相反的方向,则光线仍然位于物体的右侧(而不是像现在一样在左侧)。我假设我在错误的坐标系中计算光照,这导致了错误的行为。我正按照以下方式计算照明......

在顶点着色器中......

ECPosition = gl_ModelViewMatrix * gl_Vertex;
WCNormal = gl_NormalMatrix * vertexNormal;

其中vertexNormal是对象/模型空间中的法线。

在片段着色器中......

float lightIntensity = 0.2; //ambient
lightIntensity += max(dot(normalize(LightPosition - vec3(ECPosition)), WCNormal), 0.0) * 1.5; //diffuse

其中LightPosition是,例如,(100.0,10.0,0.0),如上所述,它将光照在世界的右侧。我不确定的部分是gl_NormalMatrix部分。我不确定这个矩阵是什么以及它将我的法线放入什么样的坐标空间(我假设世界空间)。如果将法线放入世界空间,那么我认为问题在于ECPosition在眼睛空间中而LightPosition和WCN在世界空间中。关于这一点似乎不对,但我无法弄清楚。我也尝试将ECPosition放入世界空间我乘以我自己的modelMatrix,它只包含我为使坐标进入世界空间所做的转换,但这不起作用。如果我需要提供有关着色器或代码的其他信息,请与我们联系。

1 个答案:

答案 0 :(得分:6)

gl_NormalMatrix将您的法线转换为眼睛空间(有关详细信息,请参阅this tutorial)。

我认为为了使你的光线处于静止的世界位置,你应该将你的LightPosition转换为眼睛空间,并将它乘以你当前的视图矩阵。

相关问题