我在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矩阵 - 所以普通矩阵不正确。
答案 0 :(得分:0)
正如@datenwolf所说,你计算正常矩阵的方式只有在它是正常的时候才有效,也就是说,它不包含旋转或缩放。
这是解决此问题的方法:
var normalMatrix = mat3.create();
mat4.toInverseMat3(mvMatrix, normalMatrix);
normalMatrix = mat3.toMat4(normalMatrix);
mat4.transpose(normalMatrix);