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