2012-03-04 13 views
12

SigTerm's suggestion के बाद, मैं अपने सभी अपारदर्शी बहुभुज को पहले प्रस्तुत करता हूं, और फिर मैं अपने पारदर्शी बहुभुज प्रस्तुत करने से पहले गहराई बफर (glDepthMask(GL_FALSE)) अक्षम करता हूं।गहराई बफर को लिखने को अक्षम करने से लगभग कुछ भी नहीं खींचा जा सकता है?

जैसे ही मैं गहराई बफर अक्षम करता हूं, यह स्क्रीन पर कुछ भी खींचना बंद कर देता है। मैं केवल दुनिया की एक झलक देख सकता हूं क्योंकि मैं कैमरे को चारों ओर ले जाता हूं (केवल छोटे टुकड़े एक दूसरे के लिए दिखाई देते हैं, और फिर जब मैं हिलना बंद करता हूं तो गायब हो जाता है)।

अगर मैं गहराई बफर को पूरे समय सक्षम करता हूं, तो सब ठीक हो जाता है, यह उतना अच्छा नहीं है जितना मैं चाहता हूं (translucent objects obscure other translucent objects)।

मैं इसे ठीक से प्रस्तुत करने के लिए कैसे प्राप्त करूं?

मेरा मुख्य पाश प्रस्तुत करना इस तरह दिखता है:

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

प्रस्तुत करना लूप के दूसरे आधे: glClear() कॉल, या कम से पहले

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

आप के माध्यम से 'glDisable (GL_DEPTH_TEST)' गहराई परीक्षण को निष्क्रिय करने की कोशिश की है? लक्षण यह भी संकेत देते हैं कि आप अपनी गहराई बफर को साफ़ नहीं करते हैं। 'GlClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)' का उपयोग करके रंग और गहराई बफर दोनों साफ़ करें। –

+0

या 'glDepthFunc (GL_ALWAYS)' शायद सेट करें? –

+1

@StevenLu: गहराई परीक्षण को अक्षम करना [बिल्कुल वही है जो मैंने सोचा था] (http://i.imgur.com/iabpz.png)। मुझे गहराई से परीक्षण की आवश्यकता है ताकि यह मेरे अपारदर्शी वस्तुओं के सामने दिखाई न दे। और हाँ, मैं दोनों बफर साफ़ कर रहा हूँ। – mpen

उत्तर

17

आप glDepthMask को पुन: सक्षम कर सकते हैं आपके रेंडर पाश का अंत?

गहराई बफर को लिखने से रोकना इसे सही ढंग से साफ़ करने से रोक देगा।

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

+0

बिंगो! ऐसा लगता है कि यह मुद्दा था। उस बारे में सोचा नहीं होगा। – mpen

संबंधित मुद्दे