GLSL — Пытаетесь добавить несколько источников света?

У меня есть простой фрагментный шейдер, который имитирует 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 что это не работает Но я в замешательстве? Как бы я накапливал интенсивность света на конкретном пикселе?

0

Решение

Light light1;
light0.pos = iMouse.xy;
light0.spread = 500.0;
light0.size = 200.0;

Вы не инициализируете light1 здесь. Возможно, спред равен нулю, и вы производите NaN при делении на него.

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]