У меня есть рендер-буфер (DepthStencil) в FBO, и мне нужно получить текстуру из него. Кажется, у меня не может быть как текстуры DepthComponent, так и рендербуфера DepthStencil в FBO, поэтому мне нужен какой-то способ преобразовать рендер-буфер в текстуру DepthComponent после того, как я закончу с этим для использования позже по конвейеру.
Я испробовал множество методов, чтобы извлечь компонент глубины из рендеринга в течение нескольких недель, но я всегда получаю ненужные вещи. Все, что я хочу в конце, это та же самая текстура, которую я получил бы от FBO, если бы я не использовал буфер визуализации. Может кто-нибудь опубликовать некоторые подробные инструкции или код, который охватывает эту, казалось бы, простую операцию?
РЕДАКТИРОВАТЬ:
Ссылка на извлеченную версию кода http://dl.dropbox.com/u/9279501/fbo.cs
Эффект глубины резкости + FBO - без глубины (!) Http://i.stack.imgur.com/Hj9Oe.jpg
Экранирование без эффекта глубины резкости + FBO - глубина работы отлично http://i.stack.imgur.com/boOm1.jpg
То, что вы спрашиваете, возможно в OpenGL 3.2. Мой FBO выплевывает диффузный цвет на текстуру цвета, нормали на текстуру другого цвета и текстуру глубины на глубину - никаких буферов рендеринга не требуется. На самом деле, рендер-буферы - это просто проблема, потому что вы не можете сэмплировать их, поэтому вам придется использовать
glReadPixels(...)
или каким-либо другим образом копировать данные из RBO и в текстуру на CPU, а не просто поддерживать все в памяти GPU. Так...Если вы действительно этого хотите, вы можете написать код в своем шейдере первого прохода, чтобы вручную выводить такие вещи, как глубина, в отдельное вложение цветовой текстуры в вашем FBO. Это было бы для использования вами в ваших шейдерах post-pass. Для использования OpenGL в его внутреннем тестировании глубины вам дополнительно понадобится либо RBO, либо набор текстур в качестве GL_DEPTH_ATTACHMENT вашего FBO. Но вы можете настроить одну текстуру для обслуживания обоих - это более эффективно и проще в использовании.
Мой код установки текстуры глубины выглядит следующим образом (Java, просто игнорируйте материал ByteBuffer ... и обратите внимание, что я использую "id" для ссылки на целочисленные дескрипторы / указатели, так как эта концепция не очень хорошо работает в Java):
И позже:
Теперь вы можете передать
gBufferDepthTexture
(или что у вас есть) как форму вторым, третьим проходным фрагментным шейдерам. Я думаю, что мы можем с уверенностью предположить, что вы можете сделать то же самое с буфером трафарета.источник
Вы должны быть в состоянии создать текстуру (вместо RenderBuffer), используя формат GL_DEPTH_STENCIL. Я не уверен в точном процессе использования глубины от такой текстуры в шейдерной программе (которую я предполагаю, что вы используете, так как вы используете FBO), но спецификация OpenGL должна указывать, какие цветовые каналы получают какие значения ( я думаю, что R, G и B все установлены на глубину, а A настроен на трафарет).
Сейчас я ориентируюсь на OpenGL 3.2, поэтому вам может потребоваться проверить, что формат текстур подходит для вас. Я никогда не могу вспомнить, какие версии вводят различные функции.
источник