Реализовано путем отброса пикселей с прозрачностью ниже порогового значения при рендеринге частиц в теневую карту. Конечно, такая техника не позволяет рендерить прозрачные тени от дыма, но и такой результат все же лучше, чем полное отсутствие теней или, тем более, тени в виде квадратиков.
shadows
Тени с учетом карты высот
vec4 shadowCoord = shadowMatrix * vec4(eyePosition + eyeNormal * height * 0.3, 1.0);
Таким образом, мы создаем фейковую точку, расположенную выше реальной поверхности, и тень для нее будет рассчитываться как если бы поверхность была действительно рельефной. Эффект особенно заметен на краях тени, углах и скруглениях — там, где при обычном расчете теневых координат была бы сплошная тень, появляются освещенные участки:
Главный недостаток метода — расчет теневых координат происходит пофрагментно, а не повершинно, но на современном железе это не слишком большая жертва.
Не знаю, использовалась ли такая техника раньше, и как она называется — может быть, что-то вроде height-corrected shadow mapping?
Dagon 0.2.0
- Система частиц с поддержкой векторных полей
- Шейдерный бэкенд для материалов
- Экспериментальная поддержка теневых карт
- Демонстрационный пример Dagon также обновлен — в сцену с механикой от первого лица добавлены тени.

Улучшенные тени
Все изменения в DGL, связанные с тенями, кстати, уже доступны в репозитории проекта.
Новая демка Atrium
Скачиваем новую демку с тенями:
Для Windows (2,36 МБ)
Для Linux (3,89 МБ)
Под Windows запускайте с параметром --enableShadows=1
, либо используйте прилагающийся bat-файл, в котором этот параметр уже указан.
Репозиторий Atrium на GitHub также будет обновлен в ближайшее время.