在 2D、z 顺序渲染系统中组合点(粒子)和三角形(精灵)
Combining points (particles) and triangles (sprites) in a 2D, z-ordered rendering system
我目前有一个基于图块的 2D 渲染系统,它使用纹理图集来绘制带纹理的四边形(简单精灵)。四边形是按 z 顺序排列的,这在此类系统中很常见,因此高大的实体将渲染在场景中更高的实体之上(例如,走在树后面的角色)。对实体进行排序并计算顶点后,我使用 glDrawArrays:
在一次绘制调用中绘制所有内容
glDrawArrays(GL_TRIANGLES, 0, buffer_size);
现在我正在尝试实现一个粒子系统,该系统将使用另一个绘制调用,这次使用 GL_POINTS 来渲染粒子。我想知道如何以一种遵守我的精灵的 z 顺序的方式渲染粒子,即使精灵和粒子有单独的绘制调用。例如,如果一个角色站在树后并发出血粒子,我希望血粒子也能在树后渲染。
我想出的唯一可能的方法是完全分解精灵的渲染,并分别渲染每个精灵,这样粒子就可以以正确的 z 顺序与它们一起绘制。这会大大增加绘制调用的次数,所以我想知道是否有更好的方法我不知道。
作为附录:我知道绘制调用对于非常简单的 2D 应用程序来说并不是一个大问题,但是这个特定程序将使用相当多的着色器效果和一些 CPU 密集计算,所以我确实需要尽可能高效。
您可以直接使用深度缓冲区而不是对可绘制对象进行深度排序。
仅仅写入深度缓冲区是不够的,您还需要启用深度测试。你可以参考这个https://www.opengl.org/archives/resources/faq/technical/depthbuffer.htm
我目前有一个基于图块的 2D 渲染系统,它使用纹理图集来绘制带纹理的四边形(简单精灵)。四边形是按 z 顺序排列的,这在此类系统中很常见,因此高大的实体将渲染在场景中更高的实体之上(例如,走在树后面的角色)。对实体进行排序并计算顶点后,我使用 glDrawArrays:
在一次绘制调用中绘制所有内容glDrawArrays(GL_TRIANGLES, 0, buffer_size);
现在我正在尝试实现一个粒子系统,该系统将使用另一个绘制调用,这次使用 GL_POINTS 来渲染粒子。我想知道如何以一种遵守我的精灵的 z 顺序的方式渲染粒子,即使精灵和粒子有单独的绘制调用。例如,如果一个角色站在树后并发出血粒子,我希望血粒子也能在树后渲染。
我想出的唯一可能的方法是完全分解精灵的渲染,并分别渲染每个精灵,这样粒子就可以以正确的 z 顺序与它们一起绘制。这会大大增加绘制调用的次数,所以我想知道是否有更好的方法我不知道。
作为附录:我知道绘制调用对于非常简单的 2D 应用程序来说并不是一个大问题,但是这个特定程序将使用相当多的着色器效果和一些 CPU 密集计算,所以我确实需要尽可能高效。
您可以直接使用深度缓冲区而不是对可绘制对象进行深度排序。 仅仅写入深度缓冲区是不够的,您还需要启用深度测试。你可以参考这个https://www.opengl.org/archives/resources/faq/technical/depthbuffer.htm