2012-03-04 12 views
12

Después de SigTerm's suggestion, renderizo todos mis polígonos opacos primero, y luego deshabilito el búfer de profundidad (glDepthMask(GL_FALSE)) antes de renderizar mis polígonos translúcidos.¿Por qué deshabilitar la escritura en el búfer de profundidad no hace casi nada para dibujarse?

Tan pronto como desactivo el búfer de profundidad, deja de dibujar nada en la pantalla. Solo puedo ver el mundo a medida que muevo la cámara (solo aparecen pequeñas piezas por un segundo y luego desaparecen cuando dejo de moverme).

Si dejo el buffer de profundidad habilitado todo el tiempo, todo funciona bien, simplemente no es tan bueno como me gustaría (translucent objects obscure other translucent objects).

¿Cómo puedo hacer que se visualice correctamente?

Mi bucle principal hacer que se parece a esto:

protected void RenderTerrain() 
{ 
    GL.Enable(EnableCap.DepthTest); 
    GL.Enable(EnableCap.CullFace); 

    _bfShader.Use(); 
    _bfProjUniform.Mat4(_viewMat * _bfProjMat); 
    _bfTex.Bind(); 

    GL.DepthMask(true); 
    GL.Disable(EnableCap.Blend); 
    _blendUniform.Set1(false); 
    _bfVao.Bind(); 
    GL.DrawElementsInstancedBaseVertex(BeginMode.TriangleStrip, SharedData.FaceIndices.Length, DrawElementsType.UnsignedInt, IntPtr.Zero, _bfInstBuf.Length, 0); 

    GL.DepthMask(false); 
    GL.Enable(EnableCap.Blend); 
    _blendUniform.Set1(true); 
    _transVao.Bind(); 
    GL.DrawElementsInstancedBaseVertex(BeginMode.TriangleStrip, SharedData.FaceIndices.Length, DrawElementsType.UnsignedInt, IntPtr.Zero, _bfTransBuf.Length, 0); 
} 

La otra mitad del bucle de render:

protected override void OnRenderFrame(FrameEventArgs e) 
{ 
    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 
    lock(_renderQueue) 
    { 
     while(_renderQueue.Count > 0) 
     { 
      _renderQueue.Dequeue().Invoke(); 
     } 
    } 
    RenderTerrain(); 
    RenderHUD(); 
    SwapBuffers(); 
} 
+3

Ha intentado desactivar las pruebas de profundidad a través de 'glDisable (GL_DEPTH_TEST)'? Los síntomas también indican que no está borrando su buffer de profundidad. Borre el búfer de color y profundidad usando 'glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)'. –

+0

O configure 'glDepthFunc (GL_ALWAYS)' ¿quizás? –

+1

@StevenLu: Desactivar la prueba de profundidad hace [exactamente lo que pensé que sería] (http://i.imgur.com/iabpz.png). Necesito la prueba de profundidad para que no aparezca frente a mis objetos opacos. Y sí, estoy limpiando ambos buffers. – mpen

Respuesta

17

¿Puede volver a activar la glDepthMask antes de llamar glClear(), o por lo el final de tu ciclo de render?

La prevención de escrituras en el búfer de profundidad evitará que se borre correctamente.

http://www.opengl.org/wiki/FAQ#Masking

+0

¡Bingo! Parece que fue el problema. No hubiera pensado en eso. – mpen

Cuestiones relacionadas