Выдавливать теневые объемы до бесконечности

Я хочу использовать алгоритм сбоя глубины, чтобы сделать теневые объемы, и все отлично работает, но я не могу понять, как выдавить квадраты теневого объема на бесконечность.

Цель состоит в том, чтобы создать теневой объем для треугольника, освещенного точечным источником света. У меня есть красный, что я сначала должен изменить матрицу перспективы, чтобы она не имела дальней панели клипа, и установить координату w в 0. Но каковы тогда координаты x,y,z?

Пример был бы очень полезен, но я также хочу понять, как это делается.

1 ответ

Решение

Эта ссылка показывает пример проекционной матрицы. Имеет вид:

    a   0   b              0
A = 0   d   e              0
    0   0   -(f+n)/(f-n)   -2fn/(f-n)
    0   0   -1             0

f это дальний самолет, и вы хотите f -> infinity,

limit f -> infinity of (f+n)/(f-n) = limit f -> infinity of (1+n/f)/(1-n/f)

а также

limit f -> infinity of 2fn/(f-n) = limit f -> infinity of 2n/(1-n/f)

поскольку

f -> infinity => n/f -> 0

ваша матрица с f -> infinity становится

    a   0   b    0
B = 0   d   e    0
    0   0   -1   -2n
    0   0   -1   0

если ты преобразуешь свой (x,y,z,w=0) с B ты получишь

x' = ax + bz
y' = dy + ez
z' = -z
w' = -z

и перспективное деление дает

x' = -ax/z - b
y' = -dy/z - e
z' = 1

В то время как x' а также y' такие же как трансформирующиеся (x,y,z,w=0) с A, z' теперь является константой, которая всегда равна дальней плоскости в нормализованных координатах устройства.

В этой статье показана эффективная реализация теневых томов с ограничением на бесконечность.

Другие вопросы по тегам