2012-03-04 28 views
12

Sau SigTerm's suggestion, tôi hiển thị tất cả các đa giác mờ của mình trước, sau đó tôi vô hiệu hóa bộ đệm độ sâu (glDepthMask(GL_FALSE)) trước khi tôi hiển thị đa giác mờ của mình.Tại sao việc vô hiệu hóa ghi vào bộ đệm sâu khiến cho hầu như không có gì được vẽ?

Ngay sau khi tôi vô hiệu hóa bộ đệm sâu, mặc dù nó dừng vẽ bất kỳ thứ gì lên màn hình. Tôi chỉ có thể nhìn thấy một cái nhìn thoáng qua của thế giới khi tôi di chuyển máy ảnh xung quanh (chỉ có miếng nhỏ xuất hiện trong một giây, và sau đó biến mất khi tôi ngừng di chuyển).

Nếu tôi để bộ đệm độ sâu được kích hoạt toàn bộ thời gian, mọi thứ sẽ hiển thị tốt, nó chỉ không đẹp như tôi muốn (translucent objects obscure other translucent objects).

Tôi làm cách nào để hiển thị chính xác?

làm cho vòng lặp chính của tôi trông như thế này:

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

Nửa còn lại của vòng lặp 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

Bạn đã cố gắng tắt kiểm tra độ sâu thông qua 'glDisable (GL_DEPTH_TEST)'? Các triệu chứng cũng cho biết bạn không xóa bộ đệm độ sâu của mình. Xóa cả bộ đệm màu và độ sâu bằng cách sử dụng 'glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)'. –

+0

Hoặc đặt 'glDepthFunc (GL_ALWAYS)' có lẽ? –

+1

@StevenLu: Vô hiệu hóa kiểm tra độ sâu thực hiện [chính xác những gì tôi nghĩ rằng nó sẽ] (http://i.imgur.com/iabpz.png). Tôi cần kiểm tra độ sâu để nó không xuất hiện trước các vật thể mờ đục của tôi. Và có, tôi xóa cả hai bộ đệm. – mpen

Trả lời

17

Bạn có thể kích hoạt lại các glDepthMask trước khi gọi glClear(), hoặc ít kết thúc vòng lặp kết xuất của bạn?

Ngăn việc ghi vào bộ đệm sâu sẽ ngăn không cho nó được xóa một cách chính xác.

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

+0

Bingo! Có vẻ như đó là vấn đề. Sẽ không nghĩ về điều đó. – mpen

Các vấn đề liên quan