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

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

3.4 Алгоритм получения полностью программного тумана

Данный алгоритм был предложен Марком Килгардом (Mark J. Kilgard) и может быть использован вместо "стандартного" тумана OpenGL как для повышения производительности, когда туман не поддерживается аппаратно, так и для получения "предсказуемых результатов", когда используется многопроходной рендеринг и использование стандартного тумана искажает результаты предыдущих проходов. Здесь, в демонстрационной программе, он используется совместно с отражениями и тенями, которые генерируются по методам, описанным выше.

Идея состоит в том, чтобы после рендеринга сцены прочитать содержимое Z-буфера а затем вывести эти значения в буфер кадра как компонент альфа. Стандартные механизмы OpenGL используются для смешивания тумана с содержимым буфера кадра. RGB-компонентам присваивается цвет тумана, компонента альфа либо масштабируется и сдвигается (для получения тумана типа GL_LINEAR), или переопределяется с помощью предварительно рассчитанной карты цветов (для тумана типов GL_EXP или GL_EXP2). Результат смешивается с содержимым буфера кадра. Получаются почти идентичные glFog результаты.

Сначала подробно остановимся на достоинствах данного метода.

Во-первых, с использованием этой технологии для получения тумана, время расчёта всегда пропорционально количеству пикселей на экране (размеру буферов глубины и кадра). В противоположность этому, в стандартном тумане обрабатывается вся сцена. Таким образом, при использовании стандартного тумана OpenGL, сцена со "сложностью более 1 по глубине" (т. е. суммарное количество невидимых пикселей больше, чем видимых, выведенных в буфер кадра) потребует обработки гораздо большего числа пикселей, чем реально выводится на экран. И, если туман не поддерживается полностью аппаратно, то этот метод может оказаться быстрее стандартного, несмотря на активный обмен данными по шине (на каждом кадре происходит копирование массивов размером с экран).

Во-вторых, метод даёт более предсказуемые результаты при использовании многопроходного рендеринга, который часто используется для получения теней или отражений.

В-третьих, этот алгоритм, при некоторой доработке, может дать даже лучшие результаты, чем стандартный туман. Так, улучшенная версия алгоритма может быть использована для получения тумана из расчёта расстояния от точки наблюдения до каждого пикселя вместо "просто" глубины точки.

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

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

Использование такого тумана полностью аналогично туману OpenGL. Исходные тексты класса, реализующего описанный алгоритм, приведены в приложении В.