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

Opengl 为什么GLSL照明代码会随相机移动光点?,opengl,glsl,shader,lighting,Opengl,Glsl,Shader,Lighting,我正在尝试制作一个自定义灯光着色器,并且随着时间的推移尝试了很多不同的事情。 我发现有些解决方案效果更好,有些更糟。对于这个问题,我使用的是迄今为止效果最好的解决方案 我的问题是,如果我移动“相机”,灯光的位置似乎也在移动。此解决方案中有非常轻微但明显的移动,灯光位置似乎高于其应位于的位置 默认的OpenGL照明(不带任何着色器)工作良好(稳定的灯光位置),但我需要用于多纹理的着色器,并且我计划在其工作后使用其部分用于照明效果 顶点源: varying vec3 vlp, vn; void m

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

我的问题是,如果我移动“相机”,灯光的位置似乎也在移动。此解决方案中有非常轻微但明显的移动,灯光位置似乎高于其应位于的位置

默认的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;
}

我做错了什么?

我不能肯定这些都是问题所在,但它们可能会导致问题

首先,您需要规范化逐顶点
vn
vlp
(顺便说一句,尝试使用更具描述性的变量名。
viewLightPosition
vlp
更容易理解)。我知道您在顶点着色器中对它们进行了规格化,但是片段着色器插值将对它们进行反规格化


其次,这与其说是错误的,倒不如说是多余的<代码>vec3(gl_光源[0]。位置.xyz)。“position.xyz”已经是一个vec3,因为swizzle掩码(“.xyz”)只有3个组件。你不需要再将它投射到vec3上。

几张图片,甚至一个问题的Youtube视频链接,都可以帮助我们诊断问题。哇。再次规范化片段着色器中的两个变量,取出顶点着色器中
gl_Normal
gl_Vertex
的否定项,它就工作了。谢谢!