我现在第三天拉着头发试图解决一个简单的任务我想。很简单,对于一个大师,不是像我这样的初学者。
我有一个非常简单的三维模型,有平滑法线。
使用书籍和网络上随处可见的标准每顶点定向照明方法渲染模型。
继承我的顶点着色器:
uniform mat4 mvpMatrix;
uniform mat4 normalMatrix;
uniform vec3 lightPosition;
uniform vec4 diffuseColor;
attribute vec4 vertexPosition;
attribute vec3 vertexNormal;
varying vec4 vertexColor;
void main()
{
vec3 eyeNormal = normalize(normalMatrix * vertexNormal);
float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition)));
vertexColor = diffuseColor * nDotVP;
gl_Position = mvpMatrix * vertexPosition;
}
uniform mat4 mvpMatrix;
uniform mat4 normalMatrix;
uniform vec3 lightPosition;
uniform vec4 diffuseColor;
attribute vec4 vertexPosition;
attribute vec3 vertexNormal;
varying vec4 vertexColor;
void main()
{
vec3 eyeNormal = normalize(normalMatrix * vertexNormal);
float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition)));
vertexColor = diffuseColor * nDotVP;
gl_Position = mvpMatrix * vertexPosition;
}
现在这完全符合预期。当我开始翻译模型矩阵时,问题就开始了。变换本身再次完美无缺,只是我的GLSL照明没有按预期工作。似乎模型矩阵的转换不会以某种方式被用于光扩散计算(仅转换为旋转和缩放工作正常)。
E.g。我渲染相同的模型两次,两者之间的唯一区别是在Z dir中由-1.0转换的模型矩阵。两种模型都可以在预期位置渲染,正确旋转,缩放和平移。但是,两者都会点亮相同。光不是在整个场景中插值,而是均匀地应用于每个模型,即不考虑模型转换。
现在我想我可以放弃phong平滑法线并使用平面阴影法线来解决这个问题,但锋利的边缘看起来非常糟糕。另一种解决方案可能是切换到片段着色器中的每像素照明,这是我真正想要避免的。
任何想法上面的数学有什么问题?
谢谢