Как записать в буфер глубины OpenGL - PullRequest
4 голосов
/ 08 апреля 2010

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

Так, например, если у вас есть изображение комнатыс некоторыми проводами, свисающими с потолка на переднем плане, им присваивается небольшое значение глубины в карте глубины, и при правильной визуализации персонаж может идти «позади» проводов, но перед другими объектами в комнате.

До сих пор я пытался создать текстуру глубины, используя:

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, Image.GetWidth(), Image.GetHeight(), 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, pixels);

Затем просто связал ее с квадом и отрендерил ее по экрану, но она не записывает глубинузначения из текстуры.

Я также пробовал:

glDrawPixels(Image.GetWidth(), Image.GetHeight(), GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, pixels);

Но это замедляет мою частоту кадров примерно до 0,25 кадров в секунду ...

Я знаю, что вы можете сделать это в пиксельном шейдере, установив gl_fragDepth на значение из текстуры, но я хотел знать, смогу ли я добиться этого с аппаратным обеспечением без пиксельного шейдера?

Ответы [ 3 ]

0 голосов
/ 11 апреля 2010

После попытки заставить текстуру глубины работать, я попробовал расширение ARB_fragment_program, чтобы посмотреть, смогу ли я написать очень простой (и, следовательно, широко совместимый со старым оборудованием) фрагментный шейдер сборки GPU, чтобы сделать свое дело, но в конце концов я просто решил использовать GLSL, так как расширения ARB_fragment_program, похоже, устарели или, по крайней мере, в настоящее время их использование не одобряется.

0 голосов
/ 28 апреля 2010

Вы можете попробовать использовать объекты кадрового буфера, чтобы делать то, что вы хотите.

Создайте fbo1 и прикрепите буфер цвета и глубины. Рендеринг или установка сцены для фона.

Создайте fbo2 и прикрепите буфер цвета и глубины.

Используйте блики кадрового буфера при каждом обновлении, чтобы перебрасывать буферы цвета и глубины с fbo1 на fbo2.

Отобразить остаток в fbo2

.

Сделать полноэкранный блик цветового буфера fbo2 в основной буфер дисплея.

0 голосов
/ 09 апреля 2010

Отключить запись в цветной буфер (используйте: glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE), затем визуализируйте полигоны, представляющие ваше "переднее" изображение, с соответствующей Z-координатой.

...