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

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

3.2 Алгоритм реализации "простых" теней и отражения

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

Далее приведен достаточно простой алгоритм для получения этих эффектов. Основным моментом в этом алгоритме является активное использование буфера трафарета (stencil buffer). Этот алгоритм может быть использован с любыми библиотеками, поддерживающими буфер трафарета, т. е. OpenGL любой версии и Direct3D версий не ниже 6.0.

Краткая последовательность действий, выполняемых для вывода изображения на каждом кадре (для простоты предполагаем, площадка, на которую проецируется тень и на которой выводится зеркальное отражение, расположена параллельно плоскости XOZ и находится в центре системы координат):

  1. Установка значений буфера трафарета в некоторое значение, например 1, для всех точек плоскости, на которой мы хотим получить отражение и тени.
  2. Вывод отражения объекта (необходимо установить корректный режим отсечения нелицевых граней).
  3. Вывод плоскости и "нормальных" (неотражённых) объектов. Можно задать различные параметры для нижней и верхней граней плоскости.
  4. Вывод теней. Используются матрицы, рассчитываемые для каждого источника света, для получения проекций тени на заданную плоскость [6]. Для предотвращения артефактов Z-буфера нужно немного "приподнять" тени над плоскостью. Кроме этого, при выводе теней желательно каждый пиксель выводить только один раз для предотвращения нежелательного смешивания цветов более одного раза с цветом тени (можно использовать буфер трафарета).

Недостатком данного метода является катастрофическое падение скорости, если буфер трафарета реализован программно.

Исходные тексты программы, использующей описанные выше эффекты, приведены в приложении А, а её экранная форма приведена на рисунке 3.4.


Рисунок 3.4 - Демонстрация эффектов теней, отражений и тумана с использованием OpenGL