2017-01-25 4 views
0

Я работаю над 2D-освещением в GLSL, но, похоже, у меня есть ошибка, которую я не могу исправить. Мои огни производят эти странные «слои», которые перекрываются, когда на сцене есть несколько источников света. You can see the problem around the lightsWeird Lighting in GLSL

Мой шейдер код очень прост:

uniform vec2 lightLocation[6]; 
uniform vec3 lightColor[6]; 
uniform float lightRadius[6]; 
uniform sampler2D texture0; 

void main() { 

    float distance; 
    float attenuation; 
    vec4 color; 
    vec4 finalColor = vec4(0, 0, 0, 1); 
    for (int i = 0; i < 6; ++i) { 
     distance = length(lightLocation[i] - gl_FragCoord.xy); 
     attenuation = 4.0/(1.0 + 10.0*(distance/lightRadius[i])); 
     color = vec4(attenuation, attenuation, attenuation, pow(attenuation, 3)) * vec4(lightColor[i], 1); 
     finalColor = finalColor + color; 
    } 

    gl_FragColor = finalColor * texture(texture0, gl_TexCoord[0].st); 
} 

ли ayone знать, что является причиной этой проблемы?

+0

Возможно, попробуйте зажать свое затухание после заданного расстояния? – Zouch

+0

На самом деле я не могу воспроизвести вашу проблему, я попробовал [что-то подобное в shadertoy] (https://www.shadertoy.com/view/MlySzd), но нет ничего похожего на то, что вы здесь показываете. Что находится в 'texture0'? И почему вы используете альфу в своем цвете? Вы делаете какое-то смешение? – Zouch

+0

@Zouch Спасибо за то, что решили и попытались воспроизвести проблему. Texture0 - это мой лист спрайтов, который включает в себя плитки для моей игры. Я привязываю spritesheet и выдаю ~ 200 плиток за кадр. Альфа в моем цвете была ошибкой с моей стороны, и я удалил ее. Я отредактировал ваш код, чтобы быть ТОКОМ таким же, как и мой, и он работал безупречно, что заставляет меня поверить, что это не проблема шейдеров. Вы хотите, чтобы я опубликовал любой другой код? Большое спасибо за вашу помощь! EDIT: Отключение текстур также не устраняет проблему. – TheDarkShado

ответ

1

Оказывается, проблема была НЕ в шейдерах (спасибо Zouch за то, что вы поняли это, используя Shadertoy).

Я случайно дважды зажег свет, а не один раз.