Как реализуется свет в играх?

В ютубе полно роликов о том как создать свет в unity, но мне хотелось бы разобраться как его сделать в sfml, то есть на низком уровне, возможно ли вообще сделать динамическое освещение в sfml c++ и на подобных фреймворках или же для этого нужно спуститься до OpenGL?

Речь идет о 2D игре


Ответы (1 шт):

Автор решения: Sergei Zhilinski

Я решил немного расширить свой комментарий, чтобы он тянул на ответ и оформить ответ к данному вопросу, т.к. тема не очень освещена в рунете. К сожалению ваш вопрос слишком объёмный и на него крайне сложно ответить в рамках SO. Но я могу вам дать список того, с чего стоит начать рассмотрение данной темы:

  1. Для начала стоит разобраться с теоретическими азами, что такое свет, какой свет бывает и тд. Начать можно вот с этой статьи на хабре (вам нужны первые три раздела).
  2. Вам необходимо разобраться с тем, каким функциям подвержен свет (отражение, преломление, рассеивание итд). Емнип это есть в статье выше.

Освещение в компьютерной графике симулирует взаимодействие света и объектов. Рассчёт освещения - симулирует всеразличные законы физики, связанные с освещением, и распространение света в пространстве. Освещение зависит от перспективы камеры (т.е. наблюдателя), материала объекта и окружающей среды (воздух, туман, вода итд). Для аппроксимации используют нормали к поверхности объекта. В качестве выходной функии любой модели вы получаете интенсивность света (это вектор, направленный от точки прямо в камеру). На рисунке ниже: L - источник света P - точка на поверхности N - Нормаль R - отражённый вектор I - Интенсивность света Модель освещения. B. T. Phong: Illumination for Computer Generated Pictures. Communications of the ACM 18(6), 1975

Для окружающего освещения вам потребуется формула

I = I_a * K_a Где I_a - интенсивность окружения, константа, вектор формата (I_aR, I_aG, I_aB) K_a - Коэффициент отражения объекта, находится в диапазоне от 0 до 1

Обязательно рассмотрите Закон Ламберта, это необходимо для вычисления диффузного отражения для направления света и нормали

И рассмотрите зеркальное отражение. В итоге у нас получается форумла из 3х компонент для интенсивности света (если я правильно помню, это и есть модель по Понгу): Уравнение освещенности

  1. После этого разберите такое понятие как затухание света и самые популярные модели освещения: по Понгу (Phong) и Блинну-Понгу (Blinn-Phong). Обязательно рассмотрите Halfway-Vektor для зеркального отражения света, тоже потребуется для второй модели. По поводу второй модели - вот хороший источник и пример на Web-Gl.

UPD и совсем забыл упомянуть про самую примитивную реализацию света: накладываем поверх всей картинки тёмный фильтр, который выключаем лишь в районе источников света (а там уже делаем один из трёх источников света, которые нам подходят. Про источники света - в первой ссылке).

→ Ссылка