在2D,z有序渲染系统中组合点(粒子)和三角形(子画面)

时间:2015-01-19 21:22:43

标签: c++ c opengl

我目前有一个2D,基于图块的渲染系统,它使用纹理图集来绘制纹理四边形(简单的精灵)。四边形是z排序的,这在这样的系统中是常见的,因此高实体将在场景中较高的实体(例如,在树后面行走的角色)上呈现。一旦实体被排序并计算了顶点,我使用glDrawArrays在一次绘制调用中绘制所有内容:

glDrawArrays(GL_TRIANGLES, 0, buffer_size);

现在我正在尝试实现一个粒子系统,它将使用另一个绘制调用,这次使用GL_POINTS来渲染粒子。我想知道如何以符合我的精灵的z次序的方式渲染粒子,即使精灵和粒子有单独的绘制调用。例如,如果角色站在树后面并发出血液颗粒,我希望血液颗粒也能在树后面呈现。

我想出的唯一可想到的方法是完全分解我的精灵的渲染,并分别渲染每个精灵,以便粒子可以在正确的z次序上与它们一起绘制。这将大大增加绘制调用的次数,因此我想知道是否有更好的方法,我不知道。

作为附录:我知道绘制调用对于非常简单的2D应用程序来说不是一个大问题,但是这个特定的程序将采用相当多的着色器效果和一些CPU密集型计算,所以我确实需要尽可能高效。

1 个答案:

答案 0 :(得分:2)

您可以直接使用深度缓冲区,而不是深度排序您的drawable。 只需写入深度缓冲区就足够了,您还需要启用深度测试。您可以参考此https://www.opengl.org/archives/resources/faq/technical/depthbuffer.htm