2012-03-04 12 views
12

Dopo il SigTerm's suggestion, eseguo prima il rendering di tutti i miei poligoni opachi, quindi disattivo il buffer di profondità (glDepthMask(GL_FALSE)) prima di eseguire il rendering dei miei poligoni traslucidi.Perché la disabilitazione della scrittura nel buffer di profondità non consente di disegnare quasi nulla?

Non appena disabilito il buffer di profondità, tuttavia, interrompe il disegno sullo schermo. Posso solo vedere un assaggio del mondo mentre muovo la cinepresa (solo piccoli pezzi si presentano per un secondo, e poi scompaiono quando smetto di spostarmi).

Se lascio il buffer di profondità abilitato per tutto il tempo, tutto funziona correttamente, non è bello come vorrei (translucent objects obscure other translucent objects).

Come si ottiene il rendering in modo corretto?

Io sono il principale anello di rendering appare così:

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); 
} 

L'altra metà del ciclo di rendering:

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

Hai provato a disabilitare il test di profondità tramite 'glDisable (GL_DEPTH_TEST)'? I sintomi indicano anche che non si sta eliminando il buffer di profondità. Cancella sia il colore che il depth buffer usando 'glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)'. –

+0

Oppure impostare 'glDepthFunc (GL_ALWAYS)' forse? –

+1

@StevenLu: Disabilitare il test di profondità fa [esattamente quello che pensavo che sarebbe] (http://i.imgur.com/iabpz.png). Ho bisogno del test di profondità in modo che non appaia di fronte ai miei oggetti opachi. E sì, sto cancellando entrambi i buffer. – mpen

risposta

17

Puoi riattivare il glDepthMask prima di chiamare glClear(), o la fine del tuo ciclo di rendering?

Prevenire le scritture nel buffer di profondità impedirà che venga cancellato correttamente.

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

+0

Bingo! Sembra che fosse il problema. Non ci avrei pensato. – mpen

Problemi correlati