GLSL法线具有非标准投影矩阵

在几天后让我的GLSL顶点着色器正确显示顶点后,我现在就开始使用照明了!无论如何,我对openGL照明/法线的理解都不是很好,所以请耐心等待。我不确定我需要将哪些翻译应用于法线以使其正确显示。这是设置我的灯光的应用程序代码:
    final float diffuseIntensity = 0.9f;
    final float ambientIntensity = 0.5f;

    final float position[] = { 0f, 0f, 25000f, 0f};
    gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, position, 0);
    final float diffuse[] = { 0, diffuseIntensity, 0, 1f};
    gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, diffuse, 0);
    final float ambient[] = { ambientIntensity, ambientIntensity, ambientIntensity, 1f};
    gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, ambient, 0);
到目前为止非常标准的东西。现在由于应用程序的要求,这里是(有点奇怪)顶点着色器:
void main()
{   
// P is the camera matrix, model_X_matrices are the relative translation/rotation etc of the model currently being rendered.
vec4 pos = gl_ProjectionMatrix * P * modelTranslationMatrix * modelRotationMatrix * modelScaleMatrix * gl_Vertex;

gl_Position = pos;

gl_TexCoord[0] = gl_MultiTexCoord0;

gl_FrontColor = gl_Color;           
}
据我了解,我需要将ѭ2转换为世界坐标。对于我的着色器,我相信它将是:
vec4 normal = modelTranslationMatrix * modelRotationMatrix * modelScaleMatrix * vec4(gl_Normal);
然后,我需要获取灯光的位置(在世界空间的应用程序代码中已经声明了灯光)。我想我会这样做:
vec3 light_position = gl_LightSource[0].position.xyz;
然后通过找到法线和光源位​​置的点积来找到光源的散射值。 此外,我认为在片段着色器中,我只需要将颜色乘以此漫反射值即可,并且一切都可以正常工作。我只是真的不确定如何正确地转换法线坐标。我的假设是正确的还是我完全脱离了常规? 编辑: 读完法线矩阵(
gl_NormalMatrix
)只是
gl_ModelView
矩阵的3x3逆后,我猜测计算世界空间法线的正确方法是将
gl_Normal
乘以
modelTranslationMatrix * modelRotationMatrix * modelScaleMatrix
的逆。我是否仍需要将其乘以ѭ9矩阵,还是与正常计算无关?     
已邀请:
您应该乘以ѭ8pre,并且只能将其作为单一制服传递。 法线乘以模型视图矩阵的逆转置,有关详细信息,请参见http://www.lighthouse3d.com/tutorials/glsl-tutorial/the-normal-matrix/     
尽管我意识到这是一个古老的问题,但是由于我自己对此一直感到困惑,所以我认为我会分享自己的答案。 opengl中的向量与一个点同义表示(即每轴一个坐标)。这意味着其方向是由原点到这些坐标的平移定义的。 翻译概念数学向量时,您不会改变其方向。当您翻译opengl向量而不翻译其来源时,您就会这样做。 这就是通过模型视图矩阵(或任何自定义矩阵堆栈)转换法向向量的问题所在-一般而言,它将包含旋转和平移(以及问题的缩放比例),但这都不是在这里或那里)。 通过应用平移,您可以更改法线的方向。长话短说:顶点越远,法线越接近于与摄影机顶点矢量平行的位置。 因此,而不是
vec4 normal = modelTransformMatrix * vec4(gl_Normal);
你实际上想要
vec3 normal = mat3(modelTransformMatrix) * gl_Normal;
因此,不包括翻译项,但保留任何旋转,缩放和剪切。 至于使用相机矩阵,则取决于您要执行的操作。重要的是方程中的所有值都在同一坐标空间中。话虽这么说,乘以摄影机的投影可能会引起问题,因为它(可能)设置为从相对于摄影机的3d世界坐标投影到屏幕坐标+深度。 通常,您将计算世界空间中的照明-乘以模型平移,而不是摄影机投影。     

要回复问题请先登录注册