更新: 是的,我解决了。有人告诉我使用gluLookAt()和ModelView矩阵激活。现在我将它用于投影矩阵,矩阵计算可以正常工作。
我正在GLSL上写简单的lighing着色器。
代码:http://pastebin.com/vdzyGVBS
/// VERTEX
//uniform mat4 gl_ProjectionMatrixTranspose;
//uniform mat4 gl_ModelViewProjectionMatrixTranspose;
//uniform mat4 gl_ModelViewMatrixTranspose;
uniform mat4 gl_ModelViewMatrix;
uniform mat4 gl_ProjectionMatrix;
uniform mat3 gl_NormalMatrix;
varying vec3 norm;
varying vec4 color;
void main()
{
//norm = normalize(gl_Normal) * mat3(gl_ModelViewMatrix); // It should work, but result is very weird
//norm = normalize(gl_Normal) * transpose(mat3(gl_ModelViewMatrix)); // I don't know why, but it transforms normals to camera/eye coordinates
norm = normalize(gl_Normal); // Light level is constant, event when model is rotating
color = gl_Color;
gl_Position = ftransform();
}
和
/// FRAGMENT
const float dirlight_factor = 1.0;
const float amblight_factor = 0.2;
const float ambshad_factor = 0.1;
varying vec3 norm;
varying vec4 color;
void main()
{
float shade;
float nz = normalize(norm).z;
if (nz > 0)
{
shade = amblight_factor + (nz * (dirlight_factor-amblight_factor));
}
else
{
shade = ambshad_factor + ((nz + 1) * (amblight_factor-ambshad_factor));
}
gl_FragColor = vec4(color.rgb * shade, color.a);
}
一切正常,但是当我尝试使用ModelView旋转模型时,矩阵多边形不会改变它们的亮度。似乎法线不受ModelView矩阵变换的影响。我尝试了很多矩阵转换,但没有一个工作。 那么,我如何将法线转换为全局坐标系? 那么,我如何将光线方向和法线转换为相同的坐标系(世界空间或眼睛/相机空间)?
更新
是否意图拥有世界空间定向灯或定向"前灯"来自你的相机?
我刚刚意识到(我只关注正常的转换部分),你没有将任何类型的光参数传递给着色器。难怪你没有看到适当的照明。
我没有通过任何光参数,因为我不需要更改它们。 我试图做一个总是从+ Z到-Z的世界空间定向光。
答案 0 :(得分:0)
它将法线转换为眼睛坐标,因为您将它们乘以模型视图矩阵。模型矩阵将坐标转换为世界空间,然后视图矩阵将坐标转换为眼睛空间。如果要将法线转换为世界空间,则必须单独传递两个矩阵,然后必须在着色器中将它们相乘。
答案 1 :(得分:0)
切线空间(法线是局部切线空间基础的一部分)不会通过常规模型视图矩阵进行变换。相反,它们必须通过模型视图矩阵的转置逆进行转换。
在您编写的代码中
// It should work, but result is very weird
//norm = normalize(gl_Normal) * mat3(gl_ModelViewMatrix);
不,它应该而且不会起作用,因为法线不会转换为与位置相同的规则。操作顺序的重要性和反转乘法的顺序只会转换结果,但它会错过反转部分;但是预感告诉我,你没有在乘法的左侧写出法线向量来转换整个事物。
如前所述,法线是局部空间坐标系基础的一部分。你已经拥有那件制服gl_NormalMatrix
,而且很可能包含这个。
所以你的代码应该是
norm = normalize(gl_NormalMatrix * gl_Normal);
我刚刚意识到(我只关注正常的转换部分),你没有将任何类型的光参数传递给着色器。难怪你没有看到适当的照明。