2016-03-09 34 views
2

我正在Android上的OpenGL ES 2.0中呈現obj文件並啓用了Back-Culling。只有紋理圖像的一部分(脖子上的項鍊)實際上具有alpha。使用具有alpha的紋理圖像使網格'透視'

當渲染只有網格,它看起來罰款:

enter image description here

然而,使質感,我能夠通過網看到到另一邊。您可以在下面看到身體後面的右手也變得可見。任何想法可能會出錯?

enter image description here

編輯:

我曾嘗試以下:

  1. 啓用/禁用背面剔除
  2. 檢查頂點
  3. 檢查的順序,如果法線內的一些點

但似乎沒有任何工作。任何其他方向將不勝感激。

編輯2:

我打開了紋理圖像,並通過將其保存爲在圖像編輯程序沒有alpha層用黑色填充所有的透明區域。這是現在的樣子:

enter image description here

透明度的問題消失了,後來我將無法看到正確的項鍊。

編輯3:可以Alpha-blending and the Z-buffer是一個問題,如鏈接中所述?它聲稱'Z緩衝區不適用於透明多邊形。'

+0

這似乎是一個嚴重的問題。如果您正在使用模擬器,可能是原因,請在設備上嘗試。由於您突然擁有透明度,所以深度測試將會有點不同,因爲透明對象背後的對象仍然必須繪製,以便您可以部分看到它。有可能你的混合函數在某種程度上是奇怪的,也會導致這種情況。 –

+0

@MaticOblak我在設備上。 –

回答

1

深度緩衝區和alpha混合的衝突有很多解決方案。

在你的情況下,它可能是最好簡單地禁用混合並丟棄在片段着色器的像素。

您可能只是在附件的邊框上有一些半透明像素,其餘的是1.00.0。因此,如果alpha < 0.5丟棄,則可以通過其他設置爲1.0的alpha。

另一種方法是簡單地確保這些混合對象是最後繪製的。如果你在場景中只有一個這樣的對象,它應該工作。但是如果你有多個你可能會遇到問題。

+0

你真的認爲這可能是問題,或者你建議我遵循這個解決方案,以防這是真正的問題? –

+1

沒有辦法100%確定,但你可以分析你看到的結果。模型工作正常,沒有透明像素。只要您添加透明度,您不僅可以看到具有透明度的部分是錯誤的,而且整個模型繪製不正確。你所看到的是一個失敗的深度測試。所有這些額外的多邊形都被正確繪製,但並不尊重在它們之前繪製的東西。請注意,即使腿也是錯的。我假定圖形與完全禁用深度緩衝區相同。你可能會嘗試做到這一點,並將其與你的結果進行比較。 –

相關問題