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