2011-03-01 10 views
6

A veces deshabilito la escritura del buffer de profundidad a través de glDepthMask(GL_FALSE) durante la representación de un fotograma. Eso funciona perfectamente bien en algunas GPU (como el PowerVR de Motorola Droid), pero en el EVO de HTC con la GPU Adreno, por ejemplo, termino con el buffer de cuadro como basura completa (veo rastros de las mallas que imprimí en algún lugar, pero el toda la pantalla está en gran parte destruida).glDepthMask (GL_FALSE) traspasa el búfer de trama en algunas GPU

Si forzo que glDepthMask sea cierto todo el tiempo, todo funciona bien.

Necesito glDepthMask para estar apagado durante partes de la representación alfabética. ¿Qué puede hacer que el framebuffer se destruya al desactivar la escritura de profundidad?

+0

¿Cuál es su pregunta? –

+1

Ehm ... ¿por qué está dañado el framebuffer cuando deshabilito glDepthMask? – EboMike

+0

También nos pasó a nosotros en cada Adreno GPU que pudimos tener en nuestras manos (Nexus One, HTC Incredible 2 y XPeria Play). Nuestra solución fue hacer un glClear (GL_DEPTH_BUFFER_BIT) al comienzo de cada cuadro. Lo curioso es que ¡ni siquiera tenemos un búfer de profundidad! Android es tan adorable ... – hasvn

Respuesta

6

El problema fue que glDepthMask debe ser verdadero al llamar al glClearDepth. Aparentemente, esto solo se aplica a las GPU Adreno, no a las GPU PowerVR.

+2

Estaba teniendo el mismo problema; pero en realidad nunca invoco glClearDepth(). En cambio, me aseguré de que glDepthMask fuera verdadero al final de cada fotograma, y ​​la escena dejó de ser destruida. Esto parece un error en Android o en el controlador de GPU; ha ocurrido en 3 dispositivos Android diferentes para mí. –

1

No estoy seguro si esto ayudará, pero me pregunto si todavía necesita borrar el búfer de profundidad, especialmente antes de desactivar glDepthMask. Creo que glDepthMask solo habilita/deshabilita las escrituras, no las pruebas de profundidad. Tal vez la implementación de GL todavía está probando contra la información del viejo búfer de profundidad de un pase de renderizado previo y, por lo tanto, solo dibuja en parte de su pantalla. Entonces parece sucio. Algunas implementaciones pueden borrar el buffer de profundidad, otras no? Siéntase indiferente si esta sugerencia falta totalmente a la marca.

De todos modos, espero que ayude de alguna manera pequeña.

+0

Sí, lo estoy limpiando antes de renderizar el marco. Configuré todo en 1.0, comencé a renderizar objetos opacos con escritura de profundidad habilitada, luego hice objetos mezclados alfa con escritura de profundidad desactivada. Las pruebas de profundidad están en casi todo el tiempo. – EboMike

0

Simulador de iPhone4/iOS. Si no pongo glDepthMask en true antes del glClear, mi renderización quedará en la basura. Pasé dos días con este problema, volcando framebuffers en el disco, investigando la traza de todo el fotograma, entrando en el código ... Esto fue lo único que funcionó.

NEVERMIND. Soy estúpido. Estaba ejecutando un glClear (COLOR | DEPTH) con depth mask = false, por lo que el buffer de profundidad no se borró en absoluto. Mi primera respuesta fue causada por un día completo de depuración:/

Cuestiones relacionadas