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

我的问题是,如果我四处移动“相机”,灯光位置似乎也会四处移动。该解决方案在其中具有非常轻微但明显的运动,并且照明位置似乎在其应有的位置之上。

默认的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,因为毛刺 mask (“.xyz”)只有3个成分。您无需再次将其转换为vec3。

关于opengl - 为什么GLSL照明代码会用相机移动光点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6392167/

10-11 21:05