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 :)
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.
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.
Resuelto en: http://www.stratos-ad.com/forums/index.php?topic=12270