【问题标题】:Sprites with partially transparent edges in OpenGLOpenGL中具有部分透明边缘的精灵
【发布时间】:2021-06-03 19:46:24
【问题描述】:

许多具有高分辨率的精灵/纹理在其边缘周围具有部分透明的像素,以使其边缘更平滑(基本上是抗锯齿)。在渲染这些时,在我看来,您必须与任何其他包含部分透明像素的精灵一样,即从后到前渲染它们。当然,前提是您想要适当的混合。

但是真的没有办法用一些与顺序无关的方法来渲染这些具有部分透明的微小边缘的精灵吗?

我正在尝试这样做,因为我想将大量静态 sprite 存储在与动态 sprite 不同的缓冲区中,这样我就不必每帧都重新上传数据。但是,对于这些部分透明的静态精灵,我必须在每一帧将它们与所有其他动态透明精灵一起排序。当然,这只是一个问题,如果我的静态精灵可以在我的动态精灵深度明智之间,但不幸的是这正是我想要的。

【问题讨论】:

  • 由于您使用的是精灵,我假设您正在实现一个 2D 游戏或使用 2D 精灵在 2D 世界中模拟 3D 效果。无论哪种情况,深度排序都不是问题。
  • 确实,我正在实现一个 2D 游戏 :-) 我想你的意思是深度排序不是性能问题?我想你可能是对的。但我也在问这个问题,因为我希望有一个我刚刚错过的更简单的方法。

标签: opengl 2d


【解决方案1】:

不幸的是,没有办法绕过深度排序。考虑在一个部分透明的像素后面有一个完全实心的像素的情况。您必须最后绘制透明的,否则您会丢失其中的所有信息。

现在考虑当完全实心像素变得非常透明时情况如何变化。它并没有真正改变事情。如果写在部分透明的像素上,实心像素仍然会吹走信息。您可以进行某种计算以将不透明度和色调应用于实心像素,以便您在事后绘制它,但该计算等同于仅按深度顺序绘制所有像素。

所以你真的必须按深度顺序绘制所有内容。

如果每一帧的排序都是一个问题,也许您可​​以通过将内容分解为“背景”和“前景”层来优化事情? (甚至三层或更多层)。在背景静态之上绘制背景动态,然后绘制前景。

或者也许您可以使用堆来对所有精灵进行排序?

【讨论】:

  • 看起来 OIT 相当于假设的“计算”——它仍在排序,但只是在其他地方卸载。不过,近似值听起来很有趣。
  • 有些算法无需排序即可工作。颜色通道根据深度和 Alpha 通道进行加权。我认为以下论文描述了这样一种算法:Moment-Based Order-Independent Transparency.
  • 我之前一直在为另一个项目摆弄 OIT,我发现它足够复杂,需要为这个项目寻找另一个解决方案。但是,我刚刚偶然发现了这篇文章中提到的Alpha to coverage,我认为这可能是完美的。
猜你喜欢
  • 1970-01-01
  • 2013-03-13
  • 2015-12-18
  • 2013-01-24
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
相关资源
最近更新 更多