Выдавливать теневые объемы до бесконечности
Я хочу использовать алгоритм сбоя глубины, чтобы сделать теневые объемы, и все отлично работает, но я не могу понять, как выдавить квадраты теневого объема на бесконечность.
Цель состоит в том, чтобы создать теневой объем для треугольника, освещенного точечным источником света. У меня есть красный, что я сначала должен изменить матрицу перспективы, чтобы она не имела дальней панели клипа, и установить координату 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'
теперь является константой, которая всегда равна дальней плоскости в нормализованных координатах устройства.
В этой статье показана эффективная реализация теневых томов с ограничением на бесконечность.