我正在使用着色器开发 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 和 WCNormal 在世界空间中。关于这件事的某些事情似乎不对,但我无法弄清楚。我还尝试将 ECPosition 放入世界空间,将它乘以我自己的 modelMatrix,该模型矩阵仅包含我为将坐标放入世界空间所做的转换,但这不起作用。如果我需要提供有关我的着色器或代码的其他信息,请告诉我。