【问题标题】:glsl Vertex Lighting Shaderglsl 顶点光照着色器
【发布时间】:2011-08-31 06:05:36
【问题描述】:

我在 glsl 着色器中遇到了一些简单的顶点光的问题。

我仍然对在哪个坐标空间中进行照明感到困惑。

现在我正在通过模型视图转换位置,并通过上部 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 矩阵 - 所以普通矩阵是不正确的。

【问题讨论】:

  • 能否请您展示用于计算 Modelview 矩阵并为 LightPosition 进行转换的代码?您的转换设置中的某些内容似乎不正确。
  • 你真的只使用左上角的 3×3 模型视图作为普通矩阵吗?从技术上讲,这可能有效,只要确保这是正交的;否则你需要使用模型视图的逆转置。

标签: opengl-es glsl


【解决方案1】:

正如@datenwolf 所说,您计算法线矩阵的方式只有在正交矩阵的情况下才有效,也就是说,它不包含旋转或缩放。

这是解决此问题的方法:

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

【讨论】:

    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多