Почему код освещения GLSL сдвигает световое пятно с помощью камеры? - PullRequest
7 голосов
/ 18 июня 2011

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

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

Стандартное освещение 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;
}

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

1 Ответ

5 голосов
/ 18 июня 2011

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

Во-первых, вам нужно нормализовать вашу вершину vn и vlp (Кстати, попробуйтеиспользуйте более описательные имена переменных. viewLightPosition намного легче понять, чем vlp).Я знаю, что вы нормализовали их в вершинном шейдере, но интерполяция фрагментного шейдера их денормализует.

Во-вторых, это не так уж и неправильно, как избыточно.vec3(gl_LightSource[0].position.xyz).«Position.xyz» уже является vec3, так как маска swizzle («.xyz») имеет только 3 компонента.Вам не нужно снова приводить его в vec3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...