Простейшее 2D освещение в GLSL - PullRequest
0 голосов
/ 12 апреля 2020

Привет, я хочу реализовать простую технику 2D-освещения в GLSL. Моя матрица проекций настроена таким образом, чтобы верхний левый угол окна был (0, 0), а нижний правый - (window.width, window.height). У меня есть одна равномерная переменная в фрагментном шейдере uniform vec2 lightPosition;, которая в настоящее время установлена ​​в положение мыши (опять же, в той же системе координат). Я также рассчитал расстояние от света до пикселя.


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


Я был бы очень признателен за помощь. Мне кажется, что это довольно простой для реализации код (и мне стыдно, что я его не знаю).

1 Ответ

0 голосов
/ 14 апреля 2020

почему бы не увеличить расстояние до <0..1> диапазона, разделив его и максимально увеличив на некоторое максимальное расстояние видимости vd так:

d = min( length(fragment_pos-light_pos) , vd ) / vd;

, которое должно дать вам диапазон <0..1> для расстояния фрагмента к свету. Теперь вы можете по желанию выполнить простую нелинейность, если хотите (используя pow, который не меняет диапазон ...)

d = pow(d,0.5);

или

d = pow(d,2.0);

в зависимости от того, что, по вашему мнению, выглядит лучше (вы можете играть с показателем степени ...) и, наконец, вычислить цвет:

col = face_color * ((1.0-d)*0.8 + 0.2);

, где 0.8 - ваша сила источника света, а 0.2 - окружающее освещение.

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