Ограничение света в OpenGL - PullRequest
       2

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

7 голосов
/ 27 августа 2010

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

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

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

Ответы [ 3 ]

11 голосов
/ 27 августа 2010

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

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

5 голосов
/ 31 августа 2010

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

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

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

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

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

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

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

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

4 голосов
/ 27 августа 2010

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

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

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

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

...