使用 alpha 混合组件合成纹理

Posted

技术标签:

【中文标题】使用 alpha 混合组件合成纹理【英文标题】:Composite a texture with alpha blended components 【发布时间】: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。

请提出建议。 谢谢

肖恩

【问题讨论】:

【参考方案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 的黑色”就越少。它不需要更改渲染管道,除非您实际使用创建的纹理。

肖恩

【讨论】:

以上是关于使用 alpha 混合组件合成纹理的主要内容,如果未能解决你的问题,请参考以下文章

使用 Alpha 渲染纹理的问题

将 UInt8 组件类型的纹理传递给 Metal 计算着色器

glClearColor 和混合

Delphi:具有 alpha 混合功能的图像

如何在白色背景上的Open GL ES中显示彩色纹理画笔?

Three.js中同一网格面上的多个透明纹理