首页 > 解决方案 > OpenGL中具有部分透明边缘的精灵

问题描述

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

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

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

标签: opengl2d

解决方案


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

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

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

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

或者也许你可以使用堆来保持你所有的精灵排序?


推荐阅读