2009-08-23 88 views
2

這與我最後的question有關。爲了得到這個圖片:渲染到紋理時的圖像混合問題

http://img252.imageshack.us/img252/623/picture8z.png

  1. 我畫一個白色背景(彩色= (1, 1, 1, 1))。

  2. 我渲染到紋理顏色= (1, 0, 0, .8)兩個左上平方和混合功能(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),然後繪製顏色= (1, 1, 1, 1)紋理和混合功能(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)

  3. 我繪製顏色= (1, 0, 0, .8)和混合函數(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)的右下方。

通過我的計算,渲染到紋理廣場應繪製質感的白色背景後有色差

.8 * (1, 0, 0, .8) + (1 - .8) * (0, 0, 0, 0) = (.8, 0, 0, .64) 

,因此,他們應該有顏色

(.8, 0, 0, .64) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84) 

而右下方的方格應該有顏色

.8 * (1, 0, 0, .8) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84) 

這應該看起來一樣!我的推理是錯誤的嗎?我的計算錯了嗎?

無論如何,我的目標是緩存我的一些場景。我如何渲染到紋理,然後繪製該紋理,以便它相當於只是繪製場景內聯?

回答

4

如果要將混合內容渲染到紋理並將紋理合成到屏幕,最簡單的方法是在每個位置使用預乘alpha。這是相對簡單的表明,這適用於您的情況:預乘形式的半透明方塊的顏色爲(0.8,0,0,0.8),並將其混合(0,0,0,0)與(GL_ONEGL_ONE_MINUS_SRC_ALPHA)基本上將您的方塊的顏色傳遞給紋理。在不透明白色上混合(0.8,0,0,0.8)(GL_ONE,GL_ONE_MINUS_SRC_ALPHA)爲您提供(1.0,0.2,0.2,1.0)。請注意,顏色通道與第三次計算的顏色通道相同,但alpha通道仍然爲1.0,這是您對混合對象所覆蓋的不透明對象的期望。

Tom Forsyth對預乘alpha有很好的article。整個事情值得一讀,但請參閱「複合半透明層」一節,以解釋在一般情況下數學爲什麼會出現的原因。

0

哎呀,我的計算錯了!第二行應該是

(.8, 0, 0, .64) + (1 - .64) * (1, 1, 1, 1) = (1, .36, .36, .84) 

這的確似乎符合我看到(當我改變方形的楦上色(1, .2, .2, .8),所有三個正方形出現相同的顏色)。

0

關於你的最後一個問題:用紋理替換場景的部分不是微不足道的。一個好的起點是Stefan Jeschke的PhD thesis