glsl Vertex Lighting Shader

时间:2011-05-23 15:20:48

标签: opengl-es glsl

我在glsl着色器中遇到一些简单的顶点光源问题。

我仍然对用于照明的坐标空间感到困惑。

现在我正在通过模型视图转换位置,通过上部3x3模型视图(无转换)转换法线。我也正在通过视图矩阵转换灯光,使其进入同一个空间。

问题是相机移动时灯光位置会移动。

void main()  {
attribute vec4 position;
attribute vec3 normal;
attribute vec2 texcoord0;

varying vec4 colorVarying;
varying vec2 texOut0;

uniform mat4 Projection;
uniform mat4 Modelview;
uniform mat3 NormalMatrix;//this is the upper 3x3 of the modelview
uniform vec3 LightPosition; //already transformed by view matrix

vec3 N = NormalMatrix * normal;
vec4 P = Modelview * position;  //no view    
vec3 L = normalize(LightPosition - P.xyz);
float df = max(0.0, dot(N, L.xyz));
vec3 final_color = AmbientMaterial + df * DiffuseMaterial;
colorVarying = vec4(final_color,1);
gl_Position = Projection * Modelview * position;
}

我弄清楚了我的错误 - 我正在使用es 2.0并通过

发送我的普通矩阵
glUniformMatrix3fv(gVertexLightingShader->Uniforms[UNIFORM_NORMALMATRIX], 1, 0, m_modelview.data());

但是m_modelview是一个4x4矩阵 - 所以普通矩阵不正确。

1 个答案:

答案 0 :(得分:0)

正如@datenwolf所说,你计算正常矩阵的方式只有在它是正常的时候才有效,也就是说,它不包含旋转或缩放。

这是解决此问题的方法:

var normalMatrix = mat3.create();
mat4.toInverseMat3(mvMatrix, normalMatrix);
normalMatrix = mat3.toMat4(normalMatrix);
mat4.transpose(normalMatrix);