【问题标题】:Image blending problem when rendering to texture渲染到纹理时的图像混合问题
【发布时间】:2009-08-23 00:12:44
【问题描述】:

这与我上次的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)

应该看起来一样!我的推理错了吗?我的计算错了吗?

无论如何,我的目标是缓存我的一些场景。如何渲染到纹理,然后绘制该纹理,使其等同于仅内联绘制场景?

【问题讨论】:

    标签: opengl alphablending render-to-texture


    【解决方案1】:

    如果您想将混合内容渲染到纹理并将该纹理合成到屏幕上,最简单的方法是在任何地方使用预乘 alpha。证明这适用于您的情况相对简单:预乘形式的半透明正方形的颜色为 (0.8, 0, 0, 0.8),并将 (0, 0, 0, 0) 与 (@ 987654322@, GL_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。整本书都值得一读,但请参阅“合成半透明层”部分,了解为什么数学在一般情况下有效。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-19
          • 1970-01-01
          • 1970-01-01
          • 2014-12-03
          • 2018-03-18
          • 2010-11-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多