2010-11-28 104 views
0

我試圖渲染帶alpha的紋理到帶有alpha的幀緩衝。我需要紋理的透明度由它自己的alpha和alpha渲染到幀緩衝區的組合來控制。OpenGL與源和目標alpha的混合

即:

普通透明度:

(src_colour * src_alpha)+(dst_colour * 1-src_alpha)

要求透明性:

(src_colour * src_alpha * dst_alphe)+( dst_colour * 1-(src_alpha * dst_alpha))

任何人都可以弄清楚如何做到這一點?

我一直工作在這9個小時,現在:-)

我使用OpenGL 1.0與GL11ExtensionPack在Android上,所以我有機會獲得glBlendFunc和glBlendFuncSeparate。我不想用着色器去GLES20路由,因爲這需要很多代碼才能被重寫。

感謝, 安德魯

+0

標準GL混合不支持這一點。着色器也不會(單次傳遞)。你想達到什麼目的?可能還有其他方法。 – Bahbar 2010-11-28 12:32:37

回答

1

這是我用過的解決方案:

  1. 使顏色和alpha寫入
  2. glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA)
  3. 渲染前景對象
  4. disabe alpha寫入
  5. 渲染陰影
  6. 渲染被投射陰影
  7. glBlendFunc(GL10.GL_ONE_MINUS_DST_ALPHA,GL10.GL_DST_ALPHA)
  8. 渲染背景對象

這產生只出現在前景對象的陰影的所期望的效果的對象。有效地,阿爾法緩衝區變成具有可變透明度的模板緩衝區。

幸運的是,我的背景對象沒有透明度,就好像他們沒有使用着色器一樣,我不認爲有什麼方法可以實現這種效果。