Tengo un renderbuffer (DepthStencil) en un FBO y necesito obtener una textura de él. Parece que no puedo tener una textura DepthComponent y un DepthStencil renderbuffer en el FBO, así que necesito alguna forma de convertir el renderbuffer en una textura DepthComponent después de haber terminado con él para usarlo más adelante en la tubería.
He probado muchas técnicas para obtener el componente de profundidad del buffer de renderizado durante semanas, pero siempre salgo con basura. Todo lo que quiero al final es la misma textura que obtendría de un FBO si no estuviera usando un buffer de renderizado. ¿Alguien puede publicar algunas instrucciones completas o un código que cubra esta operación aparentemente simple?
EDITAR:
Enlace a una versión extraída del código http://dl.dropbox.com/u/9279501/fbo.cs
Screeny del efecto de profundidad de campo + FBO - sin profundidad (!) Http://i.stack.imgur.com/Hj9Oe.jpg
Screeny sin efecto de profundidad de campo + FBO - profundidad trabajando bien http://i.stack.imgur.com/boOm1.jpg
Lo que está preguntando es posible en OpenGL 3.2. Tengo mi FBO escupiendo color difuso a una textura de color, normal a otra textura de color y profundidad a una textura de profundidad, no se necesitan buffers de renderizado. De hecho, los renderbuffers son solo un problema, ya que no puede probarlos, por lo que debería usar
glReadPixels(...)
o copiar de alguna manera los datos del RBO y en una textura en la CPU, en lugar de simplemente mantener todo en la memoria de la GPU. Entonces...Si realmente lo desea, puede escribir código en su sombreador de primer paso para generar manualmente cosas como profundidad, en un archivo adjunto de textura de color separado en su FBO. Eso sería para que usted lo use en sus sombreadores de postpaso. Para el uso de OpenGL en su prueba de profundidad interna, también necesitará un conjunto de RBO o textura como GL_DEPTH_ATTACHMENT de su FBO. Pero puede configurar una textura única para servir a ambos : esto es más eficiente y más fácil de usar.
Mi código de configuración de textura de profundidad se ve así (Java, simplemente ignore las cosas de ByteBuffer ... y tenga en cuenta que uso "id" para referirme a los controladores / punteros enteros, ya que ese concepto realmente no se siente bien en Java):
Y después:
Ahora puede pasar
gBufferDepthTexture
(o lo que tenga) como uniforme a sus sombreadores de fragmentos de segundo, tercer paso. Creo que podemos suponer con seguridad que puede hacer exactamente lo mismo con el búfer de plantilla.fuente
Debería poder crear una textura (en lugar de un RenderBuffer) utilizando el formato GL_DEPTH_STENCIL. No estoy seguro del proceso exacto para usar la profundidad de dicha textura en un programa de sombreado (que supongo que estás usando, ya que estás usando FBO), pero la especificación OpenGL debería especificar qué canales de color obtienen qué valores ( Supongo que R, G y B se configuran en profundidad y A se configura en plantilla).
Me dirijo a OpenGL 3.2 en estos días, por lo que es posible que deba verificar que el formato de textura sea viable para usted. Nunca puedo recordar qué versiones presentan diferentes características.
fuente