c++ - 在 2D、z 顺序渲染系统中组合点(粒子)和三角形( Sprite )

标签 c++ c opengl

我目前有一个基于图 block 的 2D 渲染系统,它使用纹理图集来绘制带纹理的四边形(简单 Sprite )。四边形是按 z 顺序排列的,这在此类系统中很常见,因此高大的实体将渲染在场景中更高的实体之上(例如,走在树后面的角色)。对实体进行排序并计算顶点后,我使用 glDrawArrays 在一次绘制调用中绘制所有内容:

glDrawArrays(GL_TRIANGLES, 0, buffer_size);

现在我正在尝试实现一个粒子系统,该系统将使用另一个绘制调用(这次使用 GL_POINTS)来渲染粒子。我想知道如何以一种遵守我的 Sprite 的 z 顺序的方式渲染粒子,即使 Sprite 和粒子有单独的绘制调用。例如,如果一个角色站在树后并发出血液粒子,我希望血液粒子也能在树后渲染。

我想出的唯一可能的方法是完全分解 Sprite 的渲染,并分别渲染每个 Sprite ,这样粒子就可以以正确的 z 顺序与它们一起绘制。这将大大增加绘制调用的次数,所以我想知道是否有更好的方法我不知道。

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

最佳答案

您可以直接使用深度缓冲区,而不是对可绘制对象进行深度排序。 仅仅写入深度缓冲区是不够的,您还需要启用深度测试。可以引用这个https://www.opengl.org/archives/resources/faq/technical/depthbuffer.htm

关于c++ - 在 2D、z 顺序渲染系统中组合点(粒子)和三角形( Sprite ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28033697/

相关文章:

c++ - 在 C++ 中返回一个 vector 附加吗?

c - gcc 中的 printf 错误结果

opengl - glDeleteTextures 不删除纹理

java - 如何使用 openGL (JGL) 缩放图像?

c - 插入排序程序,无输出

opengl - GLM 文档

c++ - 当前 OpenCV 中的 lib 文件夹(或其替代文件夹)在哪里?

c++ - ublas::vector push_back 在哪里?

c++ - 我如何创建这种背景效果?

C 程序用文件中的替换值生成字符串