2009-08-23 92 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