У меня есть простой шейдер фрагмента, который имитирует 2D-освещение, например:
struct Light
{
vec2 pos; // Light position
float spread; // Light spread
float size; // Light bulb size
};
void main(void)
{
Light light0; // Define the light
light0.pos = iMouse.xy; // Set the position to mouse coords
light0.spread = 500.0;
light0.size = 200.0;
float x_dis = light0.pos.x - gl_FragCoord.x;
float y_dis = light0.pos.y - gl_FragCoord.y;
float intensity = sqrt(pow(x_dis, 2.0) + pow(y_dis, 2.0))-light0.size; // Pythagorean Theorem - size
if(intensity < 0.0)
intensity = 0.0;
else
intensity /= light0.spread; // Divide the intensity by the spread
gl_FragColor = vec4(1.0-intensity, 1.0-intensity, 1.0-intensity, 1.0);
}
Это накладывает один свет на экран. (Вы можете просмотреть его здесь https://www.shadertoy.com/view/XsX3Wl)
Я подумал: "Эй, это было очень легко! Я просто сделаю цикл и объединим интенсивность света!"
Итак, что я сделал:
struct Light
{
vec2 pos; // Light position
float spread; // Light spread
float size; // Light bulb size
};
void main(void)
{
Light lights[2];
Light light0;
light0.pos = iMouse.xy;
light0.spread = 500.0;
light0.size = 200.0;
Light light1;
light0.pos = iMouse.xy;
light0.spread = 500.0;
light0.size = 200.0;
float intensity = 0.0;
for(int i = 0; i < 2; i++)
{
float x_dis = lights[i].pos.x - gl_FragCoord.x;
float y_dis = lights[i].pos.y - gl_FragCoord.y;
float sub_ints = sqrt(pow(x_dis, 2.0) + pow(y_dis, 2.0))-lights[i].size; // Intensity relative to this light
if(sub_ints < 0.0)
sub_ints = 0.0;
sub_ints /= lights[i].spread; // Divide the intensity by the spread
intensity += sub_ints;
}
gl_FragColor = vec4(1.0-intensity, 1.0-intensity, 1.0-intensity, 1.0);
}
Вы можете видеть по https://www.shadertoy.com/view/4dX3Wl, что это не работает. Но я в замешательстве? Как бы я накапливал интенсивности огней на определенном пикселе?
Light light1;
light0.pos = iMouse.xy;
light0.spread = 500.0;
light0.size = 200.0;
Здесь вы не инициализируете light1. Может быть, распространение равно нулю, и вы производите NaN при делении на него.
Я знаю, что ошибки копирования и вставки происходят, но это легко заметить. Вы должны серьезно проанализировать свой код, прежде чем публиковать его на SO.