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矩阵,还是与正常计算无关?
没有找到相关结果
已邀请:
2 个回复
断跑胺弄萎
亥套惟间连
你实际上想要
因此,不包括翻译项,但保留任何旋转,缩放和剪切。 至于使用相机矩阵,则取决于您要执行的操作。重要的是方程中的所有值都在同一坐标空间中。话虽这么说,乘以摄影机的投影可能会引起问题,因为它(可能)设置为从相对于摄影机的3d世界坐标投影到屏幕坐标+深度。 通常,您将计算世界空间中的照明-乘以模型平移,而不是摄影机投影。