【问题标题】:Why does GLSL lighting code shift the light spot with the camera?为什么 GLSL 照明代码会随着相机移动光点?
【发布时间】:2011-09-17 13:01:00
【问题描述】:

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

我的问题是,如果我移动“相机”,灯光位置似乎也会移动。这个解决方案有非常轻微但很明显的移动,灯光位置似乎在它应该在的位置上方。

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

我做错了什么?

【问题讨论】:

  • 几张图片,甚至是问题的 Youtube 视频链接,都可以帮助我们诊断问题。

标签: opengl glsl shader lighting


【解决方案1】:

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

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

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

【讨论】:

  • 哇。再次对片段着色器中的两个变量进行归一化,在顶点着色器中取出gl_Normalgl_Vertex 的否定,它就可以工作了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
相关资源
最近更新 更多