我試圖繪製兩個紋理到包含透明度的三維空間。當他們不重疊,它們很好地工作:透明度與opengl/lwjgl問題
然而,當一個紋理重疊其他的透明度意味着你可以通過後面的一見:
我用GL_SRC_ALPHA
和初始化混合時的GL_ONE_MINUS_SRC_ALPHA
。
我試圖繪製兩個紋理到包含透明度的三維空間。當他們不重疊,它們很好地工作:透明度與opengl/lwjgl問題
然而,當一個紋理重疊其他的透明度意味着你可以通過後面的一見:
我用GL_SRC_ALPHA
和初始化混合時的GL_ONE_MINUS_SRC_ALPHA
。
你需要或者深度排序或使用alpha測試:
glEnable(GL_ALPHA_TEST);
glAlphaTest(GL_GREATER, 0.0f);
這隻會得出具有比0F更多的阿爾法值的像素。但是,這對混合透明像素不起作用。 Andon的解決方案就是我使用的解決方案,儘管我使用2D工作,並且必須具有煙霧效果的透明度。
一種可能性是在片段着色器中使用discard
關鍵字,因爲alpha測試不再適用於我們。這具有對象的別名邊緣的缺點。
另一種可能性是對對象進行深度排序並回到前面。明顯的缺點是必須首先執行轉換和排序。如果可以靜態確定物體的順序(當相機變化不大時),這有時可以避免。另一個缺點是通過不同的東西對陰影像素進行透視,從而導致性能下降。
最後,您可以使用alpha-to-coverage,其中antialiassing硬件用於照顧透明度。這不需要排序並使對象的邊緣平滑。缺點是每個渲染上下文都可以啓用,並且可能無處不在。
確保你有glEnable(GL_BLEND); – Balk
@Balk我不認爲你理解這個問題:P – Ryxuma
你需要從背對背對你的半透明精靈進行深度排序。不透明物體應該先被繪製,理想情況下它們將被前後拖拽(但是深度緩衝區可以有效地用於這個目的,並且您不需要***來對不透明物體進行分類)。如果您先前繪製不透明的對象(它有助於深度緩衝區優化技術),您通常會獲得更好的性能,但不值得花時間手動對它們進行排序。對於半透明的物體,你別無選擇 - 要進行適當的混合,你絕對必須對它們進行分類。 –