我正在使用着色器开发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,该模型只包含为使坐标进入世界空间而进行的转换,但这没有用。让我知道是否需要提供有关我的着色器或代码的其他信息。
最佳答案
gl_NormalMatrix
将您的法线转换为眼睛空间(有关更多详细信息,请参见this tutorial)。
我认为,为了使光源处于静态的世界位置,您还应该将LightPosition乘以当前的 View 矩阵,从而将LightPosition转换为眼空间。
关于opengl - 每片段照明坐标系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6670638/