Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проекционные тени, проблема при отключении буфера глубины.

23K
10 января 2011 года
Spice
37 / / 10.07.2008
Приветствую всех. С прошедшими праздниками!

Программирую 3d графику с использованием OpenGL. Решил добавить реалистичности при помощи теней и для их построения использовал метод "проективных теней".
Реализовывал теорию из этой статьи. В целом все получилось.

Но осталась одна неразрешенная проблема.
Перед отрисовкой самой тени необходимо выключить тест глубины, а затем снова включить. Делается это, насколько я понял, для того чтобы тень и затеняемая поверхность, находясь "на одной глубине", отображались корректно. Но последствием этой операции является отображение тени на поверхностях, находящихся между тенью и камерой, но на которых эта тень отображаться не должна. Если объяснил запутанно, вот скрины.
Выглядит корректно:

Перемещаем камеру, выглядит некорректно:


Насколько я понимаю, проблема связанна именно с отключением буфера глубины, поэтому тени отображаются в порядке отрисовки, а не расположения. Отсюда вытекает вопрос: как с этой проблемой бороться? Очень бы не хотелось самостоятельно рассчитывать последовательность расположения полигонов относительно камеры и отрисовывать их в рассчитанном порядке. Ведь тем самым будет дублироваться работа буфера глубины.

Просьба ко всем разбирающимся в вопросах компьютерной графики помочь в поиске решения этой проблемы. Особенно благодарен был бы отзывам людей, имеющих опыт работы с методом "проективных теней". Или же проще использовать такие методы как теневые объемы?
6.0K
10 января 2011 года
artyom-tyanutov
107 / / 10.07.2006
А зачем именно такая техника?
ИМХО, если таргет-гпу поддерживает расширение GL_ARB_shadow - то прямая дорога к картам теней.
7
10 января 2011 года
@pixo $oft
3.4K / / 20.09.2006
[QUOTE=свойств файла]150 x 116 пикселей[/QUOTE]Мы разобрали,что там изображено,конечно же
23K
11 января 2011 года
Spice
37 / / 10.07.2008
Цитата: @pixo $oft
Мы разобрали,что там изображено,конечно же



Перезалил. А что-нибудь по существу? :-)

23K
11 января 2011 года
Spice
37 / / 10.07.2008
Цитата: artyom-tyanutov
А зачем именно такая техника?
ИМХО, если таргет-гпу поддерживает расширение GL_ARB_shadow - то прямая дорога к картам теней.



В принципе я согласен, что если данная карточка позволяет реализовать тени без лишних заморочек, то проще этой возможностью воспользоваться. Но все же я предлагаю не отвлекаться и рассмотреть вопрос именно в том русле, в котором он поставлен.
То есть, используется именно этот метод. И какие есть решения?

p.s. клепаю программку на работе, когда есть свободное время. Карточка древняя. Расширение не поддерживает (OpenGL 1.3).

23K
12 января 2011 года
Spice
37 / / 10.07.2008
Вопрос решил сам)

Все оказалось проще некуда, надо было только чуток сосредоточится и подумать.

Я по ни внимательности вместо написанного в третьем пункте "задаем запись в S-буфер значения 1 при прохождении теста глубины:
glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE); glStencilFunc(GL_ALWAYS,1,1);"
В программе написал: glStencilOp(GL_REPLACE,GL_REPLACE,GL_REPLACE);

Потом уже дошло в чем дело. Думал ошибка в статье, посмотрел - а там все правильно)

Ничего сложного, но объясню подробнее, может кому и пригодится.
В моем случаи запись в буфер трафарета производилась всегда, а необходимо было ее производить только в случаи когда и тест трафарета и тест глубины были пройдены. В этом случаи тень перестает выводится поверх полигонов, которые находятся ближе к камере, так как тест глубины в данном случаи не был бы пройден, и как следствие далее при отрисовке тени, она бы не прошла тест буфера трафарета, так как там были бы нули.

Все спасибо, всем удачи :-)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог