为什么GLSL照明代码会随相机移动光斑



我正在尝试制作一个自定义的灯光着色器,随着时间的推移,我尝试了很多不同的东西。我发现的一些解决方案效果更好,另一些则更糟。对于这个问题,我使用的是迄今为止效果最好的解决方案。

我的问题是,如果我移动"相机",光线的位置似乎也会移动。这个解决方案中有非常轻微但明显的移动,光线位置似乎高于它应该在的位置

默认的OpenGL照明(不带任何着色器)工作正常(稳定的灯光位置),但我需要着色器来进行多重纹理,我计划在它工作后使用它的一部分来获得照明效果。

顶点来源:

varying vec3 vlp, vn;
void main(void)
{
    gl_Position = ftransform();
    vn = normalize(gl_NormalMatrix * -gl_Normal);
    vlp = normalize(vec3(gl_LightSource[0].position.xyz) - vec3(gl_ModelViewMatrix * -gl_Vertex));
    gl_TexCoord[0] = gl_MultiTexCoord0;
} 

片段来源:

uniform sampler2D baseTexture;
uniform sampler2D teamTexture;
uniform vec4 teamColor;
varying vec3 vlp, vn;
void main(void)
{
    vec4 newColor = texture2D(teamTexture, vec2(gl_TexCoord[0]));
    newColor = newColor * teamColor;
    float teamBlend = newColor.a;
    // mixing the textures and colorizing them. this works, I tested it w/o lighting!
    vec4 outColor = mix(texture2D(baseTexture, vec2(gl_TexCoord[0])), newColor, teamBlend);
    // apply lighting
    outColor *= max(dot(vn, vlp), 0.0);
    outColor.a = texture2D(baseTexture, vec2(gl_TexCoord[0])).a;
    gl_FragColor = outColor;
}

我做错了什么?

我不能确定其中任何一个是问题,但它们可能会导致问题。

首先,您需要规范化每个顶点的vnvlp(顺便说一句,尽量使用更具描述性的变量名。viewLightPositionvlp更容易理解)。我知道你在顶点着色器中对它们进行了规范化,但片段着色器插值会对它们进行反规范化。

其次,这并不是特别错误,而是多余的。vec3(gl_LightSource[0].position.xyz)。"position.xyz"已经是vec3,因为swizzle掩码(".xyz")只有3个组件。您不需要再次将其强制转换为vec3。

最新更新