GLSL ES Clip Vertex на дальнюю плоскость - PullRequest
2 голосов
/ 29 октября 2011

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

Поскольку gl_ClipVertex недоступно в GLSL ES, как я могу обрезать gl_Position.z, чтобы находиться в дальней плоскости? Я уже пытаюсь использовать gl_Position.z = gl_Position.w, но результат неправильный, и объем тени, похоже, соответствует направлению камеры. Есть ли другой способ сделать это?

1 Ответ

1 голос
/ 20 января 2012

для того, чтобы теневые объемы работали, вам, вероятно, следует избегать обрезания крышки дальним самолетом.Чтобы сделать это, либо увеличьте диапазон глубины (отодвиньте дальнюю плоскость подальше), либо уменьшите степень выдавливания.

Существует много техник теневого объема, некоторые из которых разработаны специально, чтобы избежать ограничения глубины.Мой фаворит - обратная сторона Кармака, которая работает хорошо, если вы знаете ограничивающую рамку вашей геометрии (Кармак использует деревья BSP, так что ему легко), потому что тогда вы точно знаете, как далеко нужно выдавливать теневой объем.Кроме того, может потребоваться некоторое ограничение, если источник света находится очень близко к объекту, отбрасывающему тень (в противном случае это не дальняя крышка, но углы объема окажутся отсеченными).Хотя это легко объяснить, это довольно сложно реализовать.Есть также некоторые другие алгоритмы, лучше подходящие для простой реализации на GPU (см. Здесь http://www.nvidia.com.br/object/robust_shadow_volumes.html).

Надеюсь, это поможет вам, не стесняйтесь комментировать, если вам потребуется дополнительная помощь.

...