GLSL ES Clip Vertex на дальнюю плоскость
Я играю с теневым объемом на моем iPhone, и все работает за исключением того, что ограничитель теневого объема обрезается на дальней плоскости.
поскольку gl_ClipVertex
недоступно в GLSL ES, как я могу обрезать gl_Position.z
быть на дальнем плане? Я уже пытаюсь использовать gl_Position.z = gl_Position.w
, но результат неправильный, и объем тени, похоже, соответствует направлению камеры. Есть ли другой способ сделать это?
1 ответ
Для того, чтобы теневые объемы работали, вам, вероятно, следует избегать обрезания крышки дальним самолетом. Для этого либо увеличьте диапазон глубины (отодвиньте дальнюю плоскость подальше), либо уменьшите объем выдавливания.
Существует много техник теневого объема, некоторые из которых разработаны специально, чтобы избежать ограничения глубины. Мой фаворит - это обратная сторона Кармака, которая работает хорошо, если вы знаете ограничивающую рамку вашей геометрии (Кармак использует деревья BSP, так что ему легко), потому что тогда вы точно знаете, как далеко нужно выдавливать теневой объем. Кроме того, может потребоваться некоторое ограничение, если источник света находится очень близко к объекту, отбрасывающему тень (в противном случае это не дальняя крышка, но углы объема окажутся отсеченными). Хотя это легко объяснить, это довольно сложно реализовать. Есть также некоторые другие алгоритмы, лучше подходящие для простой реализации на GPU (см. Здесь http://www.nvidia.com.br/object/robust_shadow_volumes.html).
Я надеюсь, что это поможет вам, не стесняйтесь комментировать, если вам нужна дополнительная помощь.