Ограничение источников света в OpenGL

Когда я читал RedBook, я был совершенно сбит с толку, что в openGL может быть максимум 8 источников света (число зависит от реализации, но должно быть около 8).

Но я могу представить себе множество ситуаций, в которых нужно больше источников света, поэтому я думаю, что в игре Dev есть хитрость.

Например, у вас очень длинная улица с 50 световыми лучами, или вы можете использовать отряд из 20 человек, использующих фонарики. Как вы на самом деле имитируете эти ситуации? Существует проблема, заключающаяся в том, что свет освещает только часть сетки, а не весь конус между источником и объектом, поэтому, если у нас нет 100% чистого воздуха, должна быть также какая-то симуляция. Как это делается, и игра работает гладко? (я также читал, что включение всех 8 источников света может убить FPS)

8
задан genpfault 29 November 2012 в 16:02
поделиться

3 ответа

8 источников света — это ограничение фиксированного конвейера GL, где вы включаете каждый из них, устанавливаете режим, параметры и т. д. Теперь у вас есть пиксельные шейдеры, и освещение выполняется внутри шейдера. Там вы можете использовать большое количество динамических (не встроенных в текстуры) источников света. Вам нужно только предоставить все параметры этих источников света в достаточном количестве (возможно, в текстуре) и проверить, сколько источников света может обработать ваш шейдер. Кроме того, в шейдере вы можете отбрасывать слишком слабые источники света (слишком мало влияющие на значение пикселя) или слишком далекие.

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

11
ответ дан 5 December 2019 в 08:21
поделиться

Одним из приемов, которые будут использоваться в играх, является имитация света с помощью текстуры.

Таким образом, в вашем примере с уличным освещением «освещенные» области на самом деле будут более ярким текстурным изображением. Только ближайшие огни будут источниками света для получения правильных эффектов.

Существуют аналогичные подходы, когда полупрозрачные текстуры или текстуры с прозрачным конусом накладываются на сцену для получения того же эффекта.

Не забывайте, что вычисление теней и т. д. в реальном времени означает, что сцена должна быть визуализирована с точки зрения света, чтобы вычислить интенсивность света в любом заданном месте. Таким образом, для 8 источников света вы визуализируете сцену (или части сцены) до 8 раз , прежде чем фактически отобразите сцену для отображения. Даже если это делается на графическом процессоре, а не на процессоре, это очень дорого.

4
ответ дан 5 December 2019 в 08:21
поделиться

Освещение — очень сложная тема в компьютерной графике.

Что действительно важно, так это освещение объекта, имитирующее реальное освещение или эффект, на который мы нацелены. Окружение освещения может быть составлено из множества источников, чтобы приблизиться к реальному эффекту, которого мы пытаемся достичь.

Реализация освещения OpenGL представляет собой динамическое освещение, представляющее собой абстракцию точки освещения, которая позволяет «освещать» (то есть придавать цвет) визуализируемым вершинам (которые используются для визуализации треугольников). ...вершина освещена, получаем вклад цвета для каждого источника света.

Как вы упомянули, процесс рендеринга занимает больше времени, чем больше света мы включили. Чтобы минимизировать это, у вас есть разные возможности.

  • Отбор света (исключите источники света, которые мало влияют на изменение цвета), и это определяется с помощью свойств света (расстояние, конус, затухание, точка зрения и мешающие объекты).
  • Статическое освещение, использующее текстуры для имитации освещения неподвижных объектов.

Фиксированное освещение OpenGL вносит свой вклад в цвет вершин, который интерполируется с другими цветами вершин для растеризации треугольника. В случае, если геометрия состоит из нескольких треугольников, вы не можете увидеть световой конус внутри каждого треугольника, потому что цвет его фрагмента является результатом интерполяции трех цветов (трех вершин).

Для достижения более точного освещения программа должна определять цвет каждого фрагмента (пикселя) (освещение пикселя) таким же образом, как вершина окрашивается источниками света, но, как вы понимаете, пикселей может быть больше, чем вершин. Подход состоит в том, чтобы вычислить (используя шейдеры или расширение OpenGL) вклад света для каждого пикселя геометрии на этапе растеризации или определить цвет пикселя с помощью отложенного освещения.

Отложенное освещение использует несколько текстур (соответствующих области просмотра) для хранения параметров освещения для каждого отображаемого пикселя. Таким образом, вы выполняете вычисление света после создания изображения, определяя долю света пикселя один раз для каждого пикселя, а не один раз для каждого пикселя геометрии.

5
ответ дан 5 December 2019 в 08:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: