alphablending - 使用 alpha 混合组件合成纹理
问题描述
去做 :
在我们的 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。
请建议。
谢谢
肖恩
解决方案
我们的艺术家找到了这个答案。虽然可能不一样,但非常好。
Opengl 渲染到具有部分透明度(半透明)的纹理,然后将其渲染到屏幕上
我们基本上使用选项 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 的黑色”就越少。它不需要更改渲染管道,除非您实际使用创建的纹理。
肖恩
推荐阅读
- c# - SnmpSharpNet.SnmpException:“请求已达到最大重试次数。”
- python - 我想使用 python 在 mysql 中创建一个表,我得到了这个错误,但是我有一个名为 sam 的数据库,我该怎么办
- ios - iOS 中的 WebBLE 支持
- c++ - 从 C++ 中的库的多重继承具有歧义
- android-studio - Android Studio 和 Intelij Idea 中不可用的设备
- c# - 如何解决“Package Google Authenticator 1.2.1 已使用 .NETFramework 恢复”,但我不想升级到最新版本(C#)
- c# - 带有 EF Core 5.0 的 ASP Core 3.1 API
- python - 在 Python 3.8 中没有附加类的 TypedDict 的键入键、值
- amazon-web-services - AWS 过滤和导出日志
- python-3.x - 一对多关系sqlite3的问题