2012-03-28 18 views
9

tengo frame buffer, con el componente de profundidad y 4 accesorios de color con 4 texturasOpenGL, cómo utilizar depthbuffer del uso de este dispositivo como buffer de profundidad habitual

que dibujo un poco de materia en él y desenlazar el búfer después, por medio de 4 texturas para fragment shader (iluminación diferida). Más tarde quiero dibujar algunas cosas más en la pantalla, usando el buffer de profundidad de mi framebuffer, ¿es posible?

Intenté volver a unir el framebuffer y especificar glDrawBuffer (GL_FRONT), pero no funciona.

Respuesta

10

Como ya dijo Nicol, no se puede usar un búfer de profundidad de FBO como búfer de profundidad del framebuffer predeterminado directamente.

Pero se puede copiar buffer de profundidad de la OBF hacia el uso de este dispositivo por defecto utilizando el EXT_framebuffer_blit extensión (que debería ser central desde GL 3):

glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, 
        GL_DEPTH_BUFFER_BIT, GL_NEAREST); 

Si no se admite esta extensión (que dudo cuando ya tiene FBO), puede usar una textura de profundidad para el archivo adjunto de profundidad del FBO y renderizarlo en el framebuffer predeterminado usando un cuadrante texturizado y un sombreador de fragmentos de paso simple que escriba en gl_FragDepth. Aunque esto podría ser más lento que simplemente ceñirlo.

+0

yah, la función Blit funciona bien, gracias – ShPavel

2

No se pueden adjuntar imágenes (color o profundidad) al framebuffer predeterminado. Del mismo modo, no puede tomar imágenes del framebuffer predeterminado y adjuntarlas a un FBO.

7

Acabo de experimentar que copiar un búfer de profundidad desde un buffer de representación al búfer de profundidad principal (proporcionado por el contexto) es muy poco confiable cuando se usa glBlitFramebuffer. Solo porque no puedes garantizar que el formato coincida. Usar GL_DEPTH_COMPONENT24 como mi formato interno de textura de profundidad simplemente no funcionaba en mi AMD Radeon 6950 (último controlador) porque Windows (o el controlador) decidieron usar el equivalente a GL_DEPTH24_STENCIL8 como el formato de profundidad para mi front/backbuffer, aunque No solicité ninguna precisión de plantilla (los bits de la galería de símbolos están configurados en 0 en el descriptor de formato de píxel). Al usar GL_DEPTH24_STENCIL8 para la textura de profundidad de mi framebuffer, el Blitting funcionó como se esperaba, pero tuve otros problemas con este formato. El primer intento funcionó bien en las tarjetas de NVIDIA, así que estoy bastante seguro de que no estropeé las cosas.

Lo que funciona mejor (en mi experiencia) se copia a través de shader:

El-Programa Fragmento (también conocido como Pixel Shader) [GLSL]

#version 150 

uniform sampler2D depthTexture; 
in vec2 texCoords; //texture coordinates from vertex-shader 

void main(void) 
{ 
    gl_FragDepth = texture(depthTexture, texCoords).r; 
} 

El código C++ para copiar el aspecto siguiente:

glDepthMask(GL_TRUE); 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
glEnable(GL_DEPTH_TEST); //has to be enabled for some reason 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 
depthCopyShader->Enable(); 
DrawFullscreenQuad(depthTextureIndex); 

sé que el hilo es viejo, pero fue uno de mis primeros resultados cuando googeling mi problema, por lo que quiero mantenerlo lo más consistente posible.

+0

Gracias, resolvió el problema con mis gráficos intel integrados. – joesmoe891

+1

¿Hay alguna manera de obtener el formato de buffer predeterminado después de su creación y usarlo para crear el fbo? –

+0

También me pregunto lo mismo que @LukeB. ya que permitiría blitting entre dos framebuffers sabiendo que los formatos coinciden. Eso también funcionaría para el caso cuando queremos blit desde el framebuffer predeterminado que no podemos hacer con un shader, ya que el buffer de profundidad no es accesible. –

Cuestiones relacionadas