【发布时间】:2014-01-19 12:41:25
【问题描述】:
更新: 是的,我解决了。有人告诉我在 ModelView 矩阵处于活动状态时使用 gluLookAt()。现在我将它与投影矩阵一起使用,矩阵计算可以正常工作。
我正在 GLSL 上编写简单的光照着色器。
代码: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 的世界空间定向光。
【问题讨论】:
-
你的相机是想要世界空间定向光还是定向“头灯”?
标签: opengl matrix glsl normals