Получение реалистичного освещения с помощью доступных аппаратных и программных средств является одной из основных задач, которые приходится решать при написании приложений 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 - Результат         |