Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema de culling? Deferred Shading

Iniciado por Prompt, 24 de Junio de 2009, 10:46:07 AM

« anterior - próximo »

Prompt

Hola a todos. Rapidamente...

Estoy implementando el Geometry Stage de la tecnica donde se renderiza una geometría y de ella se extrae información en diferentes buffers. En mi caso (y en el de la mayoria) 4:



Se renderiza bien, pero cuando observo que hay en los buffers parece como si funcionara mal el culling, he probado varias cosas como invertir el CCW, CW desactivarlo etc... pero parece que le gusta solo renderizar la parte de atrás... no lo entiendo:



Codigo del draw (imagen 1)

//*///-----------------------------------------------------------------------------------------
void DeferredShader::drawMaterial( )
{
glViewport( 0, 0, m_width, m_height);

GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT/*, GL_DEPTH_ATTACHMENT_EXT*/ };
glDrawBuffers( 4, buffers );
checkFBO( );

glClearColor( 0.0, 0.0, 0.0, 0.0);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glEnable(GL_DEPTH);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glDepthRange(0.0, 1.0); // The default z mapping
glStencilMask(GL_FALSE);

glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
glDisable(GL_TEXTURE_GEN_Q);

glCullFace(GL_BACK);

//glShadeModel(GL_SMOOTH);
//glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_NORMALIZE);
glEnable(GL_TEXTURE_2D);

glEnable(GL_ALPHA_TEST);
glDepthMask(GL_TRUE);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

glPushMatrix( );
// draw raw scene geometry
m_pMRTShader->setUp( m_pMRTShader->getConfiguration( ) );
m_pMRTShader->beginTextures( );

m_pMRTShader->begin( );

// Formato para el shader
static Entity3D xForm;
const Matrix4 mEffectFormat = xForm.getWorldMatrix( ).transpose( );

glMultiTexCoord4fv(GL_TEXTURE1, mEffectFormat[0]);
glMultiTexCoord4fv(GL_TEXTURE2, mEffectFormat[1]);
glMultiTexCoord4fv(GL_TEXTURE3, mEffectFormat[2]);
glutSolidTeapot( 2000.0f );

m_pMRTShader->endTextures( );
m_pMRTShader->end( );
glPopMatrix( );
}



Codigo del test:

       //*///-----------------------------------------------------------------------------------------
void DeferredShader::showTest( )
{
//glColor3f(1.0f, 1.0f, 1.0f);
//glCullFace(GL_FRONT);

//glEnable(GL_TEXTURE_2D);
//glDisable(GL_DEPTH_TEST);

glViewport(0, 0, m_width, m_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrtho(0.0, 1.0, 1.0, 0.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

m_pFBOTestShader->begin( );
m_pFBOTestShader->setUniform1i("FBO", 0);
glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D, m_mrtTexture[0]);
glBegin(GL_QUADS);
glTexCoord2i(0, 1); glVertex2f(0.0f, 0.0f);
glTexCoord2i(1, 1); glVertex2f(0.5f, 0.0f);
glTexCoord2i(1, 0); glVertex2f(0.5f, 0.5f);
glTexCoord2i(0, 0); glVertex2f(0.0f, 0.5f);
glEnd( );

glBindTexture(GL_TEXTURE_2D, m_mrtTexture[1]);
glBegin(GL_QUADS);
glTexCoord2i(0, 1); glVertex2f(0.5f, 0.0f);
glTexCoord2i(1, 1); glVertex2f(1.0f, 0.0f);
glTexCoord2i(1, 0); glVertex2f(1.0f, 0.5f);
glTexCoord2i(0, 0); glVertex2f(0.5f, 0.5f);
glEnd( );

glBindTexture(GL_TEXTURE_2D, m_mrtTexture[2]);
glBegin(GL_QUADS);
glTexCoord2i(0, 1); glVertex2f(0.0f, 0.5f);
glTexCoord2i(1, 1); glVertex2f(0.5f, 0.5f);
glTexCoord2i(1, 0); glVertex2f(0.5f, 1.0f);
glTexCoord2i(0, 0); glVertex2f(0.0f, 1.0f);
glEnd( );

glBindTexture(GL_TEXTURE_2D, m_mrtTexture[3]);
glBegin(GL_QUADS);
glTexCoord2i(0, 1); glVertex2f(0.5f, 0.5f);
glTexCoord2i(1, 1); glVertex2f(1.0f, 0.5f);
glTexCoord2i(1, 0); glVertex2f(1.0f, 1.0f);
glTexCoord2i(0, 0); glVertex2f(0.5f, 1.0f);
glEnd( );

m_pFBOTestShader->end( );
}


Alguna experiencia con algo similar? RENDER -> FBO

Prompt

Bueno este problema ya está solucionado, he acabado por activar el DEPTH ATTACHMENT en vez usar una textura.

Prompt


Hilo en OpenGL.org donde me contesto yo solo:
http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=259493#Post259493

Resultado feliz:


No hace falta renderizar la ultima textura, en DX9 si hace falta ese paso, pero con una extension muy básica en OGL nos podemos ahorrar memoria, aunque bueno, por si acaso ahi tengo la textura, ya veremos mas adelante si me hace falta.

Acabo de terminar por tanto, el Geometry Stage de mi Deferred Rendering | Illumination :O yuju!

tamat

y no necesitaras el Depth en textura para alguno de tus calculos cuando hagas el lighting pass?
Por un stratos menos tenso

Prompt

Si tamat, no necesito realmente la textura pero la estoy generando ahí encodeada para verla. El Geometry Stage está ya solventado, ahora toca la iluminación :)

tamat

por curiosidad, puedes decir cuantos y como estan organizdos tus buffers?
Por un stratos menos tenso

Ruben

Hi,
por si necesitais mas info sobre deferred shading o por si quereis añadir mas info, hay un articulo en la wiki de codepixel con recursos: http://wiki.codepixel.com/index.php/Deferred_Shading.

A ver si os sirve de ayuda!  :D

Un saludo,
Ruben

Prompt

#7
Cita de: Ruben en 25 de Junio de 2009, 02:15:05 PM
Hi,
por si necesitais mas info sobre deferred shading o por si quereis añadir mas info, hay un articulo en la wiki de codepixel con recursos: http://wiki.codepixel.com/index.php/Deferred_Shading.

A ver si os sirve de ayuda!  :D

Un saludo,
Ruben

Estoy siguiendo el paper marcado en negrita como el mejor: http://www710.univ-lyon1.fr/~jciehl/Public/educ/GAMA/2007/Deferred_Shading_Tutorial_SBGAMES2005.pdf

Ciertamente si este paper es de lo mejor, que lo es, el mundo necesita un nuevo paper sin lugar a dudas... Llorens (IL-Engine) está haciendose el Deferred, de hablar con él me piqué y me puse yo. Ya he hablado con el para ver si despues nos hacemos uno mucho más completo y actualizado, porque ciertamente hay agujeros negros en todo lo que leo y veo en código.

Cita de: tamat en 25 de Junio de 2009, 02:09:13 PM
por curiosidad, puedes decir cuantos y como estan organizdos tus buffers?

Con respecto a esto:

RGBA16FcolorAlbedo RAlbedo GAlbedo BAlbedo A
RGBA16FnormalNormal RNormal GNormal BNormal A
RGBA16FtestRGBA
DEPTH24_STENCIL8depthEncoded Depth REncoded Depth GEncoded Depth BStencil

En OpenGL con la extension NV_RENDER_DEPTH_TEXTURE (OpenGL 1.1) no es necesario tener una textura con la informacion del DEPTH y el STENCIL (ver como disponer de ello en posts anteriores). No obstante yo lo pongo para probar la otra forma, como estudio, practica, curiosidad... hay que estudiarlo bien :)
En DX9 hay que gastar una textura para almacenar esa información. En DX10 no es necesario.

Como se ve... aun no estoy usando el G-Buffer para frikear a tope, cuando llegue a la parte de post-proceso empezará la fiesta. Como encodear en un RGBA8 el HDR o quitar cosas innecesarias como el Alpha.

Ruben

CitarEstoy siguiendo el paper marcado en negrita como el mejor: http://www710.univ-lyon1.fr/~jciehl/Public/educ/GAMA/2007/Deferred_Shading_Tutorial_SBGAMES2005.pdf

Ciertamente si este paper es de lo mejor, que lo es, el mundo necesita un nuevo paper sin lugar a dudas... Llorens (IL-Engine) está haciendose el Deferred, de hablar con él me piqué y me puse yo. Ya he hablado con el para ver si despues nos hacemos uno mucho más completo y actualizado, porque ciertamente hay agujeros negros en todo lo que leo y veo en código.

Genial. Si lo haceis no se os olvide actualizar el articulo de la wiki y asi le echamos un ojo :)

tamat

la normal con cuatro componentes? hay trucos para encodearla en 2.
Por un stratos menos tenso

Prompt

Cita de: tamat en 25 de Junio de 2009, 03:46:21 PM
la normal con cuatro componentes? hay trucos para encodearla en 2.

Lo se, lo se :), bueno 4... en realidad es solo RGB, pero en vez de poner Empty he puesto Normal A. Ya me llegará el momento de los truquitos. Lo que no se, es porque nadie mete la tangente y la binormal. Que tambien se pueden calcular en GPU pero oye... si sobra! :P

El caso es que en cuanto llegue al paso de post-procesos seguro que se me acaban y empiezo a encodear y demás. Hay que darse cuenta que el consumo de memoria es notable, no obstante esperemos que haya un gran cambio y que veamos pronto graficas con 4GB 6...16.. xD (halaa! cachondeo!)

tamat que pasa? andas trasteando con un deferred también o q?

tamat

lo tengo pendiente pero he leido bastante sobre el tema. Por el tema de tener muchas luces, de hecho este año llevaré el PFC de un compañero de curro que portará el motor del departamento en el que curro de forward rendering a deferred.

Mantenme al corriente de tus progresos, siempre es bueno conocer la problematica.
Por un stratos menos tenso

Prompt

Cita de: tamat en 25 de Junio de 2009, 05:49:23 PM
lo tengo pendiente pero he leido bastante sobre el tema. Por el tema de tener muchas luces, de hecho este año llevaré el PFC de un compañero de curro que portará el motor del departamento en el que curro de forward rendering a deferred.

Mantenme al corriente de tus progresos, siempre es bueno conocer la problematica.

La gente divirtiendose en sus empresas y yo aqui aburrido... necesito un curro nuevo que me motive mentalmente :)
Malditos salarios!!

Shaitan

Después de revolver bastante, he encontrado una página bastante interesante para los que esteis con el tema de deferred, eso si, es en XNA (pero ahi estan los shaders): http://www.catalinzima.com/?page_id=14
Ahh y un ejemplo basado en esto para hacer el deferred con sombras: http://www.gameprojects.com/project/?id=3778c45da4
De todas formas, creo que una aproximación más interesante al tema de deferred es la utilizada por Wolfgang Engel con su 'light prepass' :
http://diaryofagraphicsprogrammer.blogspot.com/ (ahi unos cuantos posts sobre el tema ahí, además esta su articulo en el shader X 7).

Ya dirás que resultados vas obteniendo!

:-D
<º))))><.·´¯`·.Shaitan´¯`·.¸.·´¯`·._.·

Prompt

Esa aproximación te crea otros problemas adicionales. No obstante una vez tenga la tecnica base, lo estudiaré pero no termino de ver que sea la mejor opción.






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.