2015-12-17 57 views
0

我有一個GLViewWidget,在這裏我添加不同的對象(GLMeshItem)設置這些屬性,以使透明度:啓用3D透明度 - pyopengl

 opt = { 
      GL_DEPTH_TEST: True, 
      'glBlendFunc': (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), 
      } 
     obj.setGLOptions(opt) 

這幾乎是工作,在下面的意義: 如果我有兩個對象obj1和obj2,並按照這個順序將它們添加到小部件中,我會在obj1的後面看到obj2,但不是相反。

我試圖以不同的順序添加對象,但顯然我會在obj2後面看到obj1,而不是相反。我怎樣才能使這個工作對所有的對象漠不關心?

+0

您必須將它們排序並按正確順序繪製。 – BDL

+0

但正如我所說,這兩個對象都是透明的,所以我希望它們的行爲方式相同,即obj2顯示在obj1後面的obj1和obj1後面,具體取決於我正在觀察的點。 – charles

+0

除了順序無關透明度之外,唯一的方法是根據每個框架中的對象的當前位置對它們進行排序並將它們拉回前面。 – BDL

回答

2

深度測試和透明度不能很好地結合在一起。

假設我們繪製半透明物體obj1。這也會將其深度寫入深度緩衝區。 現在假設我們想繪製第二個對象obj2,它具有更大的深度。我們預計我們會看到obj2obj1,因爲obj1是半透明的。

但是,由於obj2的深度較大,因深度測試失敗而不會繪製重疊像素,因此我們只會看到obj2的部分不與obj1重疊。

深度測試不考慮透明度。因此,爲了讓它工作,正如BDL在評論中所說的那樣,您將不得不手動排序對象並按正確的順序繪製它們。

+0

禁用深度測試不是必需的。只有當物體從後向前抽出時才能實現正確的混合,這意味着深度測試不再是問題。即使未進行排序,也必須至少啓用深度測試並禁用深度寫入。否則透明對象不會被不透明的對象隱藏。 – BDL

+1

你是對的,沒有必要禁用它。編輯它。我的意思是說可能不再需要啓用它。 – Reigertje

+0

所以假設我首先在笛卡爾座標(0,0,0)處繪製obj1,然後在笛卡爾座標(2,0,0)處繪製obj2。如果我用x軸指向屏幕看場景,我會在透明obj2後面看到obj1,這是正確的。但是如果我旋轉場景,並用屏幕內部的x軸來查看它,我是否應該再次對對象進行排序,以便在透明obj1後面顯示obj2? – charles