2011-05-23 64 views
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矩阵 - 所以正常矩阵是不正确的。

+0

请您展示与您计算模型变换矩阵和LightPosition做转换的代码?你的转换设置中的某些东西似乎并不正确。 – datenwolf 2011-05-23 18:10:16

+0

你真的只使用左上角的3×3模型视图作为常规矩阵吗?从技术上讲,这可能会起作用,只要确保这是正常的;否则你需要使用模型视图的逆转置。 – datenwolf 2011-05-24 11:03:55

回答

0

正如@datenwolf所说,你计算正常矩阵的方式只有在它不正常时才起作用,即它不包含旋转或缩放。

这是解决这个问题的方式:

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