В совсем недавнем прошлом в подавляющем числе 3D-игр эффекты взрывов реализовывались с помощью простейших текстурированных полигонов, ориентированных параллельно плоскости экрана. Подобная технология весьма проста в реализации и не требует чрезмерных вычислительных ресурсов. Основной минус подобной технологии – "врезание" вспышки взрыва в поверхности. Есть еще масса других недостатков (типа плоского внешнего вида и малой натуралистичности). Это, кстати, хорошо заметно и в движках Q3A, Return To Castle Wolfenstein, Serius Sam и т.п. (Рис. 1).

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

Рис.2 Объемный взрыв.

Рис.3. Здесь заштрихованная область – область взрыва.
Окончательный визуальный эффект достигается повторным рендерингом полигонов уже с учетом эффекта взрыва. Скелет алгоритма следующий:
For every rendered polygon in scene do //Каждый закрашиваемого полигона в сцене
If polygon visible through explosion then //Если полигон виден сквозь взрыв, то
Project explosion texture onto polygon //Проецируем текстуру взрыва на полигон
Modulate intensity of polygon depending
on distance from explosion //Задаем интенсивность полигона в
//зависимости от расстояния до взрыва
Render polygon //Рендеринг полигона
End If
End For
В общем и целом нам надо выполнить три этапа вычислений: проверка на видимость, проекция текстуры и модуляция интенсивности луча. Каждый из этих этапов можно выполнить или в экранном пространстве, или в пространстве объектов.

Рис.4. Текстура взрыва, использованная в Рис.1 и 2.
Наши расчеты оперируют объемом, аппроксимированным усеченной пирамидой, используемой в типовых расчетах видимого объема с передней отсекающей плоскостью, расположенной в точке на сфере взрыва, лежащей ближе к камере. Задняя отсекающая плоскость взрыва совпадает с дальней отсекающей плоскостью всей сцены. Если проверка на видимость производится в мировом пространстве, тогда необходимо проверить на видимость каждый полигон, находящийся в объеме, определенном шестью отсекающими плоскостями. Проверка на видимость в экранном пространстве – значительно более простой процесс, поскольку проекция взрыва на плоскость экрана – круг (в случае использования конического объема) или квадрат (при использовании усеченной пирамиды). Необходимо заметить, что в случае проекции с соотношением количества пикселей по вертикали и горизонтали, отличным от 1:1, результатом на экранной плоскости будет эллипс или прямоугольник (в зависимости от типа используемого объема отсечения – конус или пирамида).
Опять же, производить вычисления в экранном пространстве намного проще, поскольку масштаб радиуса взрыва придется рассчитать лишь единожды.
Вот уравнения для этих расчетов:

Где u и v - координаты текстуры,
c – центр взрыва (в экранном пространстве)
V - текущая вершина (в экранном пространстве)
Rad – масштабируемый радиус взрыва
У нас получатся значения в диапазоне [0...1] для точек в объеме взрыва. Точкам за пределами объема взрыва присваиваются значения <0 и >1. Это можно выполнить отсечением полигонов по граням объема (вообще-то, этот вариант не рекомендуется, поскольку он чреват некачественным рендерингом) или подгонкой режима отсечения текстуры в соответствии с настройкой отсечения плоскостями. В этом режиме пикселю, чьи координаты текстуры выходят за пределы диапазона [0...1], присваивается величина цвета 0 или 1 соответственно. Отсечение необходимо только для тех полигонов, чьи координаты текстур лежат за пределами максимума диапазона, определяемого API (Direct3D ограничивает координаты текстуры в диапазоне [-128...+127]).Отсечению подвергаются также те полигоны, которые находятся между передней и тыльной сторонами камеры.
Заметьте, что интенсивность вычисляется по-разному в зависимости от того, используется аддитивное или модуляционное смешивание в приложении при рендеринге по второму проходу. При аддитивном смешивании цвет вершины варьируется от белого до черного, изменять мы его можем с помощью альфа-компоненты.
Алгоритм наиболее просто реализуется в экранном пространстве. Это значит, что вся геометрия преобразуется всего один раз и уже обработанная используется для получения эффекта взрыва. Не требуется никаких дополнительных преобразований (разве что преобразование некоторых референсных точек на объеме взрыва в экранное пространство). К сожалению, существует несколько потенциальных проблем при использовании этой методики (они разобраны в следующем разделе).
Второй путь оптимизации - использование гибридного алгоритма. Его суть состоит в размещении основания взрыва на плоскости с максимальной интенсивностью в объеме взрыва. Если мы будем считать, что центр взрыва обладает максимальной интенсивностью, то основание надо разместить в центре взрыва. Это позволяет ограничить объем нашего взрыва только пространством между передней частью взрыва и его основанием.

- Матрица Проекции

- Матрица Z-преобразования

Второе ограничение – для нормальной работы с мировым и экранным пространствами необходимо, чтобы область, видимая сквозь взрыв, была бы предварительно отрендерена с полигонами полностью. Причина в том, что при закраске взрыва не видно области экрана, закрашенные плоским цветом – Рис. 5.

Рис. 5. Одно из ограничений "истинного" метода.
В статье использованы идеи и мысли девелоперов, "витающие в воздухе", на различных форумах и конференциях. Реализация была опробована на видеокарте GeForce2MX 400.