Использование OpenGL

3 РАЗРАБОТКА АЛГОРИТМОВ

3.5 Использование многопроходного рендеринга для имитации освещения Фонга

Получение реалистичного освещения с помощью доступных аппаратных и программных средств является одной из основных задач, которые приходится решать при написании приложений 3D графики реального времени. Естественно, что, с одной стороны, трассировка лучей и другие аналогичные алгоритмы, применяемые в таких пакетах, как 3DS Max, LightWave, SoftImage, PovRay и др., не могут быть использованы из-за низкой скорости работы. С другой стороны, для закраски треугольников можно воспользоваться алгоритмами Фонга и Гуро. Алгоритм Гуро принципиально не может быть использован для получения правдоподобного блика, особенно, когда количество треугольников модели недостаточно велико. Возможными вариантами решения проблемы являются либо увеличение числа треугольников, что, естественно может привести к резкому падению производительности, либо использование алгоритма Фонга. Однако, если алгоритм Гуро уже реализован во всех аппаратных 3D акселераторах, то алгоритм Фонга практически не используется в связи со своей значительно более высокой сложностью, кроме этого, он также требует выполнения дополнительных шагов на этапе геометрической обработки, которая в настоящее время выполняется исключительно силами центрального процессора (за исключением Hi-End акселераторов, недоступных на платформе Intel).

Все перечисленные факты заставляют разработчиков идти на компромисс между скоростью и качеством: чаще всего в случаях, когда необходимо получение качественного освещения, используют различные варианты многопроходного рендеринга. При этом на одном проходе сцена выводится с включёнными текстурами и без освещения, а на другом - с освещением, которое получают с помощью текстурирования по определённой текстуре. При таком подходе возможно получение достаточно правдоподобных бликов и других эффектов, связанных с освещением. Кроме того, если используемая библиотека поддерживает мультитекстурирование, то простые эффекты можно получить даже за один проход (для OpenGL - библиотека должна поддерживать расширение GL_SGIS_multitexture или GL_ARB_multitexture, а для установки координат каждой текстуры должны использоваться функции glMultiTexCoord*SGIS или glMultiTexCoord*ARB) [7].

Далее рассмотрен простой пример получения изображения объекта с бликом на нём от источника света с помощью использования предварительно рассчитываемой текстуры (средствами OpenGL).

Последовательность действий для получения желаемого эффекта можно условно разбить на два этапа:

Исходный текст приведен в приложении Г, а последовательность наложения текстур - на рисунках 3.5 - 3.7.


Рисунок 3.5 - Сфера без освещения

Рисунок 3.6 - Имитация блика

Рисунок 3.7 - Результат        
Далее кратко рассмотрим необходимую последовательность действий.

3.5.1 Генерирование текстуры для освещения

    Последовательность шагов:
  1. Сохранение текущих матриц видового преобразования, проекции, атрибутов буферов кадра и глубины.
  2. Установка свойств видового преобразования, параллельной проекции и области отсечения для получения проекции сферы заданных размеров, освещённой заданным источником света.
  3. Включение освещения и установка параметров источника света.
  4. Установка параметров поверхности сферы:
  5. Вывести сферу.
  6. Восстановить установки области отсечения, параметры матриц и сохранённые биты буферов цвета и глубины.
  7. Прочитать полученное изображение в массив в памяти (получение нужной текстуры) и присвоить идентификатор созданной текстуре.

3.5.2 Вывод объекта

    Последовательность шагов:
  1. Проверить, изменилось ли положение источника света. Если да, то заново рассчитать текстуру, соответствующую данному источнику света.
  2. Включить освещение и вывести объект с "нормальной" текстурой (или без неё). Освещение должно быть разрешено только для диффузной составляющей света.
  3. Разрешить режим смешения цветов (GL_BLEND) и автогенерации координат текстуры. Установить режим буфера глубины GL_LEQUAL (в противном случае блик не буден выведен). Установить текущей полученную на первом этапе текстуру.
  4. Вывести объект.
  5. Восстановить параметры текстуры, буфера глубины и смешения цветов.