2010-09-13 14 views
7

¿Cómo puedo hacer un prepass de buffer Z con OpenGL?pase de buffer Pre Z con OpenGL?

Me'v intentado esto:

glcolormask(0,0,0,0); //disable color buffer 

//draw scene 

glcolormask(1,1,1,1); //reenable color buffer 

//draw scene 

//flip buffers 

Pero no funciona. después de hacer esto, no veo nada. ¿Cuál es la mejor manera de hacer esto?

Gracias

+0

¿Estás tratando de hacer esto sólo con la tubería de función fija? Es probablemente mucho más fácil usar sombreadores. –

Respuesta

13
// clear everything 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

// z-prepass 
glEnable(GL_DEPTH_TEST); // We want depth test ! 
glDepthFunc(GL_LESS);  // We want to get the nearest pixels 
glcolormask(0,0,0,0);  // Disable color, it's useless, we only want depth. 
glDepthMask(GL_TRUE);  // Ask z writing 

draw() 

// real render 
glEnable(GL_DEPTH_TEST); // We still want depth test 
glDepthFunc(GL_LEQUAL); // EQUAL should work, too. (Only draw pixels if they are the closest ones) 
glcolormask(1,1,1,1);  // We want color this time 
glDepthMask(GL_FALSE); // Writing the z component is useless now, we already have it 

draw(); 
0

si consigo que la derecha, que están tratando de desactivar la profundidad de la prueba realizada por OpenGL para determinar sacrificio. Estás usando funciones de color aquí, lo cual no tiene sentido para mí. Creo que está intentando hacer lo siguiente:

glDisable(GL_DEPTH_TEST); // disable z-buffer 

// draw scene 

glEnable(GL_DEPTH_TEST); // enable z-buffer 

// draw scene 

// flip buffers 

No olvide borrar el búfer de profundidad al comienzo de cada pasada.

+0

Bueno, básicamente, estoy tratando de hacer un prepass Z para tratar de evitar dibujar ciertas cosas. – jmasterx

+0

En realidad eso es exactamente lo opuesto a lo que está pidiendo. Un Z prepass se usa para * solo * probar la profundidad sin calcular ninguna iluminación. La idea es que puedes rechazar muchos objetos ocluidos temprano usando una prueba de profundidad económica y guardar los costosos cálculos de iluminación solo para la geometría que se verá. –

+0

Entonces, ¿cómo hago eso entonces ?: p – jmasterx

3

Está haciendo lo correcto con glColorMask.

Sin embargo, si no está viendo nada, es probable porque está utilizando la función de prueba de profundidad incorrecta. Necesita GL_LEQUAL, no GL_LESS (que es el valor predeterminado).

glDepthFunc(GL_LEQUAL); 
Cuestiones relacionadas