0
我在glsl着色器中遇到了一些简单的顶点光源问题。glsl Vertex Lighting Shader
我仍然什么坐标空间做照明混淆。
现在我转换由模型视图的位置,上位的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矩阵 - 所以正常矩阵是不正确的。
请您展示与您计算模型变换矩阵和LightPosition做转换的代码?你的转换设置中的某些东西似乎并不正确。 – datenwolf 2011-05-23 18:10:16
你真的只使用左上角的3×3模型视图作为常规矩阵吗?从技术上讲,这可能会起作用,只要确保这是正常的;否则你需要使用模型视图的逆转置。 – datenwolf 2011-05-24 11:03:55