【问题标题】:Composite a texture with alpha blended components使用 alpha 混合组件合成纹理
【发布时间】:2018-08-31 06:50:28
【问题描述】:

待办事项:

  • 在我们的 HUD 上渲染模型,
    但不是渲染所有这些微小的多边形,
    我们希望 优化这些多边形并将其渲染为纹理,然后将此纹理用作单个纹理多边形叠加

  • 如果整个渲染的纹理有空白像素或不透明像素,这可以正常工作,
    但是当我们有 alpha 值介于 0 和 1 之间的像素时,我们会遇到问题。

  • 例如假设我们的模型中只有一个红色 (1,0,0) 多边形,其 alpha 为 0.5。
    如果我们 使用正常混合 (SRC_ALPHA, 1-SRC_ALPHA) 将其渲染为纹理,我们最终会得到一个深红色 (0.5,0,0) 和 0.5 的 alpha
    当它被用作纹理时,它比应有的颜色深得多,主要是因为红色多边形已与基础混合“黑色”的纹理。
    无论这显示在什么背景上,都是错误的。

我们需要的是纹理具有全红色 (1,0,0) 和 0.5 的 alpha,但是当我们渲染多个 alpha 混合多边形时,这会变得更加复杂。

有没有办法做到这一点?
也许使用不同的屏幕混合模式?
这需要在渲染到纹理时使用 GPU 完成。

使用 OpenGLES 2.0。

请提出建议。
谢谢

肖恩

【问题讨论】:

    标签: alphablending render-to-texture hud


    【解决方案1】:

    我们的艺术家找到了这个答案。虽然可能不一样,但非常好。

    Opengl Render To Texture With Partial Transparancy (Translucency) And Then Rendering That To The Screen

    我们基本上使用了选项 2,将所有内容正常渲染到纹理,从黑色透明纹理开始,但是当将此纹理渲染到 hud 时,修改像素着色器以简单地将颜色除以 alpha。

    这是因为假设颜色 (1, 0.5, 0.2) 以 25% 的 alpha 添加到纹理中,那么纹理颜色将为 (0.25, 0.125, 0.05) 和 0.25 alpha。除以 0.25 alpha 后,颜色返回 (1, 0.5, 0.2),这正是我们所需要的。

    所以,只有在使用创建的纹理时,才将这条线添加到像素着色器的末尾

    outcol.rgb /= outcol.a

    我们测试了多个重叠的透明胶片,但无法区分。颜色越不透明,原来的“零 alpha 的黑色”就越少。它不需要更改渲染管道,除非您实际使用创建的纹理。

    肖恩

    【讨论】:

      猜你喜欢
      • 2019-03-12
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多