Проекционные тени, проблема при отключении буфера глубины.
Программирую 3d графику с использованием OpenGL. Решил добавить реалистичности при помощи теней и для их построения использовал метод "проективных теней".
Реализовывал теорию из этой статьи. В целом все получилось.
Но осталась одна неразрешенная проблема.
Перед отрисовкой самой тени необходимо выключить тест глубины, а затем снова включить. Делается это, насколько я понял, для того чтобы тень и затеняемая поверхность, находясь "на одной глубине", отображались корректно. Но последствием этой операции является отображение тени на поверхностях, находящихся между тенью и камерой, но на которых эта тень отображаться не должна. Если объяснил запутанно, вот скрины.
Выглядит корректно:
Перемещаем камеру, выглядит некорректно:
Насколько я понимаю, проблема связанна именно с отключением буфера глубины, поэтому тени отображаются в порядке отрисовки, а не расположения. Отсюда вытекает вопрос: как с этой проблемой бороться? Очень бы не хотелось самостоятельно рассчитывать последовательность расположения полигонов относительно камеры и отрисовывать их в рассчитанном порядке. Ведь тем самым будет дублироваться работа буфера глубины.
Просьба ко всем разбирающимся в вопросах компьютерной графики помочь в поиске решения этой проблемы. Особенно благодарен был бы отзывам людей, имеющих опыт работы с методом "проективных теней". Или же проще использовать такие методы как теневые объемы?
ИМХО, если таргет-гпу поддерживает расширение GL_ARB_shadow - то прямая дорога к картам теней.
[QUOTE=свойств файла]150 x 116 пикселей[/QUOTE]Мы разобрали,что там изображено,конечно же
Цитата: @pixo $oft
Мы разобрали,что там изображено,конечно же
Перезалил. А что-нибудь по существу? :-)
Цитата: artyom-tyanutov
А зачем именно такая техника?
ИМХО, если таргет-гпу поддерживает расширение GL_ARB_shadow - то прямая дорога к картам теней.
ИМХО, если таргет-гпу поддерживает расширение GL_ARB_shadow - то прямая дорога к картам теней.
В принципе я согласен, что если данная карточка позволяет реализовать тени без лишних заморочек, то проще этой возможностью воспользоваться. Но все же я предлагаю не отвлекаться и рассмотреть вопрос именно в том русле, в котором он поставлен.
То есть, используется именно этот метод. И какие есть решения?
p.s. клепаю программку на работе, когда есть свободное время. Карточка древняя. Расширение не поддерживает (OpenGL 1.3).
Все оказалось проще некуда, надо было только чуток сосредоточится и подумать.
Я по ни внимательности вместо написанного в третьем пункте "задаем запись в S-буфер значения 1 при прохождении теста глубины:
glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE); glStencilFunc(GL_ALWAYS,1,1);"
В программе написал: glStencilOp(GL_REPLACE,GL_REPLACE,GL_REPLACE);
Потом уже дошло в чем дело. Думал ошибка в статье, посмотрел - а там все правильно)
Ничего сложного, но объясню подробнее, может кому и пригодится.
В моем случаи запись в буфер трафарета производилась всегда, а необходимо было ее производить только в случаи когда и тест трафарета и тест глубины были пройдены. В этом случаи тень перестает выводится поверх полигонов, которые находятся ближе к камере, так как тест глубины в данном случаи не был бы пройден, и как следствие далее при отрисовке тени, она бы не прошла тест буфера трафарета, так как там были бы нули.
Все спасибо, всем удачи :-)