Почему Код освещения GLSL смещает световое пятно с помощью камеры?

Я пытаюсь создать собственный шейдер света и с течением времени пробовал много разных вещей. Некоторые решения, которые я нашел, работают лучше, другие - хуже. Для этого вопроса я использую решение, которое до сих пор работало лучше всего.

Моя проблема в том, что если я перемещаю «камеру», кажется, что положение источников света тоже меняется. Это решение имеет очень небольшое, но заметное движение, и положение источника света кажется выше, чем должно быть.

Освещение OpenGL по умолчанию (без каких-либо шейдеров) работает нормально (устойчивые положения света), но мне нужен шейдер для мультитекстурирования и я планирую использовать его части для световых эффектов, когда он заработает.

Vertex Source:

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;
} 

Fragment Source:

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;
}

Что я делаю не так?

7
задан Cobra_Fast 17 June 2011 в 21:43
поделиться