【发布时间】:2011-08-31 06:05:36
【问题描述】:
我在 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 矩阵 - 所以普通矩阵是不正确的。
【问题讨论】:
-
能否请您展示用于计算 Modelview 矩阵并为 LightPosition 进行转换的代码?您的转换设置中的某些内容似乎不正确。
-
你真的只使用左上角的 3×3 模型视图作为普通矩阵吗?从技术上讲,这可能有效,只要确保这是正交的;否则你需要使用模型视图的逆转置。