2

这与我的最后一个问题有关。要获取此图像:

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

  1. 我画了一个白色背景(颜色= (1, 1, 1, 1))。

  2. (1, 0, 0, .8)我使用 color =和 blend function对左上角的两个正方形进行渲染纹理(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),然后使用 color =(1, 1, 1, 1)和 blend function绘制纹理(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)

  3. (1, 0, 0, .8)我用 color =和 blend function绘制右下角的正方形(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

3 回答 3

4

如果要将混合内容渲染到纹理并将该纹理合成到屏幕,最简单的方法是在任何地方使用预乘 alpha。证明这适用于您的情况相对简单:预乘形式的半透明正方形的颜色为 (0.8, 0, 0, 0.8),并将 (0, 0, 0, 0) 与 ( GL_ONE, GL_ONE_MINUS_SRC_ALPHA) 基本上将您的方块的颜色传递给纹理。GL_ONE用 ( , ) 在不透明的白色上混合 (0.8, 0, 0, 0.8)GL_ONE_MINUS_SRC_ALPHA得到 (1.0, 0.2, 0.2, 1.0)。请注意,颜色通道与您的第三次计算相同,但 alpha 通道仍为 1.0,这是您对被混合对象覆盖的不透明对象所期望的值。

Tom Forsyth 有一篇关于预乘 alpha的好文章。整本书都值得一读,但请参阅“合成半透明层”部分,了解为什么数学在一般情况下有效。

于 2009-08-23T17:04:10.080 回答
0

哎呀,我的计算是错误的!第二行应该是

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

这确实似乎与我所看到的相符(当我将最后一个方块更改为 color(1, .2, .2, .8)时,所有三个方块都显示相同的颜色)。

于 2009-08-23T00:25:39.293 回答
0

关于您的最后一个问题:用纹理替换部分场景并非易事。Stefan Jeschke 的博士论文是一个很好的起点。

于 2009-08-23T01:51:14.360 回答