Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





FBO, Depth Buffer -> textura

Iniciado por Prompt, 23 de Junio de 2009, 07:04:35 PM

« anterior - próximo »

Prompt

Hola que tal!

Resulta que estoy haciendo Deferred Shading y uno de los pasos es tener la componente z guardada en una "textura". Aparentemente hay una manera directa de tener esos datos en OpenGL sin tener que usar el early-z de Carmak (Doom3) o la manera de DX que es creando una capa del deferred donde almacenar la componente Z.

Basicamente estoy atascado en visualizar el depth buffer
Lo que yo hago es:

    * Generar un render buffer
    * attach del render buffer al FBO
    * bind del FBO
    * renderizar escena (yo lo hago con un simple cubo)
    * unBind FBO
    * ejecutar filtro para ver mi G-Buffer

        // create color texture
        glGenTextures( 1, &m_mrtTexture[0] );
        glBindTexture( GL_TEXTURE_2D, m_mrtTexture[0] );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
        glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA16F, m_width, m_height, 0, GL_RGBA, GL_FLOAT, NULL );
       
        glGenTextures( 1, &m_mrtTexture[1] );
        glBindTexture( GL_TEXTURE_2D, m_mrtTexture[1] );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
        glTexImage2D   ( GL_TEXTURE_2D, 0, GL_RGBA16F, m_width, m_height, 0, GL_RGBA, GL_FLOAT, NULL );
       
        glGenTextures( 1, &m_mrtTexture[2] );
        glBindTexture( GL_TEXTURE_2D, m_mrtTexture[2] );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
        glTexImage2D   ( GL_TEXTURE_2D, 0, GL_RGBA16F, m_width, m_height, 0, GL_RGBA, GL_FLOAT, NULL );

        // create depth texture
        /*
        glGenTextures( 1, &m_mrtTexture[3] );
        glBindTexture( GL_TEXTURE_2D, m_mrtTexture[3] );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE ) ;
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL );
        glTexParameteri( GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE );
        */
               
        // initialize depth renderbuffer
        glGenRenderbuffersEXT( 1, &m_depthFBO );
        glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, m_depthFBO );
        glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, m_width, m_height );
        checkFBO( );

        glGenFramebuffersEXT( 1, &m_mrt );
        glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_mrt );
        glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthFBO );
        glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT  , GL_TEXTURE_2D, m_mrtTexture[0], 0 );
        glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT  , GL_TEXTURE_2D, m_mrtTexture[1], 0 );
        glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT2_EXT  , GL_TEXTURE_2D, m_mrtTexture[2], 0 );
        checkFBO( );

       
        // bind G-buffer for rendering
        mrtBindRender( );

        glViewport( 0, 0, m_width, m_height);
       
        GLenum buffers[] = { GL_DEPTH_ATTACHMENT_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT };
        glDrawBuffers( 4, buffers );

        glClearColor( 0.0, 0.0, 0.0, 0.0);
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
       
        // draw raw scene geometry
        m_pMRTShader->begin( );
        glColor3f(1.0, 1.0, 1.0);
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_TEXTURE_2D);

        drawBox( );
        m_pMRTShader->end( );

        // unbind the G-buffer
        mrtUnbindRender( )    // Aqui hago el filtro y miro las texturas



-------------------

En el filtro....

glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, m_depthFBO);
m_pTempShader->setUniform1i("fbo0", 0);



Shader m_pMRTShader

    //gl_FragData[0] = vec4(0.0, 1.0, 0.0, 0.0);
    gl_FragData[1] = vec4(0.0, 1.0, 0.0, 0.0);
    gl_FragData[2] = vec4(1.0, 0.0, 0.0, 0.0);
    gl_FragData[3] = vec4(0.7, 0.2, 1.0, 0.0);


Lo reyeno de colores para probar que estan bien, aparentemente si, pero no consigo pintar el depth. Necesito hacer early-z? que hago mal con el RenderBuffer?

Me funciona bien, pero soy incapaz de poder ver la "textura" del depth buffer, hay algo mal?

Gracias :)

Prompt

Bueno... a ver si hoy adjunto algo más de mis pruebas, creo que ya lo tengo. Pero de momento voy a calcular yo el Z de cada pixel y guardarlo.

tamat

no soy un experto en esto pero si la Z no está linealizada rara vez se ve algo, para ello lo mejor es guardarla manualmente en un buffer ignorando el depth buffer.
Por un stratos menos tenso







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.