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