为什么GLSL照明代码会使相机移动光点?

Cob*_*ast 7 opengl shader lighting 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;
} 
Run Code Online (Sandbox Code Playgroud)

片段来源:

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;
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Nic*_*las 5

我无法确定这些问题是什么,但它们可能导致问题.

首先,您需要规范化每个顶点vnvlp(顺便说一句,尝试使用更多描述性变量名称.viewLightPosition比理解起来要容易得多vlp).我知道你在顶点着色器中对它们进行了标准化,但是片段着色器插值会使它们非规范化.

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