使用 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 混合组件合成纹理的主要内容,如果未能解决你的问题,请参考以下文章