【问题标题】:Seamlessly layering transparent sprites in OpenGL ES在 OpenGL ES 中无缝分层透明精灵
【发布时间】:2013-03-13 17:47:27
【问题描述】:

我正在开发一个基于 LibGDX 框架的 Android 应用程序(虽然我认为这不会对这个问题产生太大影响),但在使用透明绘图时我无法找到一种方法来获得我想要的结果精灵。问题是精灵在它们重叠的地方明显地相互叠加,类似于这张图片中显示的内容:

这对于我想做的一些事情来说非常难看,甚至完全破坏了其他部分。我希望他们做的是无缝地合并在一起,就像这样:

到目前为止,我唯一的成功是将整个精灵序列以完全不透明度绘制在单独的纹理上,然后以所需的不透明度绘制该纹理。我有这个工作得很好,我可能会让它在我需要的大部分工作中工作,但现在最大的问题是这些东西是动态绘制到屏幕上的,以及修改一个相当大的纹理的过程和将其发送回去对移动设备来说是相当繁重的,并且会导致无法接受的性能水平。

我花了很多时间寻找更理想的解决方案,包括尝试混合模式并提出古怪的公式来平衡 alpha 和颜色值以使事情变得均匀,但没有什么特别成功。我的猜测是,唯一可行的方法是前面提到的创建纹理并应用 alpha 差异的方法,但我不确定在低功耗移动设备上使用的最佳方法。

【问题讨论】:

    标签: android opengl-es sprite opacity alpha


    【解决方案1】:

    可能还有其他一些方法可以做到这一点:最直接的方法是附加一个模板缓冲区并首先在模板上绘制圆圈,然后用模板绘制一个具有所需颜色+alpha的全屏矩形,这应该是比一些具有单独纹理的 FBO 快得多。

    另一件事可能是先用禁用的混合绘制这些圆圈,然后用倒置的“blendFunc”绘制整个场景,但请注意,如果其他元素也需要混合,这可能是不可能的。

    第三,您可以使用渲染缓冲区的 Alpha 通道,而不是使用模板。只需使用颜色蒙版仅绘制 alpha 并绘制圆圈,然后在颜色蒙版上重新启用 RGB 并使用适当的“blendFunc”绘制全屏矩形还请注意,如果以前的形状使用了混合,则需要将 alpha 清除为 1.0在执行此操作之前(仅将颜色蒙版设为 Alpha,禁用混合,使用 Alpha 设置为 1.0 的颜色绘制全屏矩形)

    【讨论】:

    • 我对 OpenGL 有点缺乏经验,所以我需要一些时间来解决这个问题,但是您已经提供了很大的帮助,所以谢谢。我确实对第一个选项有疑问。根据我相当有限的知识,我相信走这条路可以防止圆圈或任何代替它们使用的东西使用任何类型的 alpha,除了纯透明或不透明。例如,如果圆圈是羽化的,那么使用该方法在最终结果中仍会显示为实心圆圈,对吗?
    • 错了,第一种方法会给你防弹结果。您可以应用任何 alpha 或颜色或任何东西。将其视为 RGB 中的第 5 个通道,您可以使用它进行任何操作。在大多数情况下,模板缓冲区用作布尔缓冲区,您将其清除为 false,然后绘制基元以将某些部分变为 true,然后根据需要使用它。在您的情况下,使用特定颜色填充所有真实部分,包括 alpha频道。
    • 啊哈!我的印象是它只是用作一个坚实的“黑色或白色”遮罩层。这听起来非常棒,我肯定会修改它,同时更正确地学习 OpenGL,这样我将来就会知道这些东西。 :p 感谢您为我指明了正确的方向!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多