在 2D、z 顺序渲染系统中组合点(粒子)和三角形(精灵)

Posted

技术标签:

【中文标题】在 2D、z 顺序渲染系统中组合点(粒子)和三角形(精灵)【英文标题】:Combining points (particles) and triangles (sprites) in a 2D, z-ordered rendering system 【发布时间】:2015-01-19 21:22:43 【问题描述】:

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

glDrawArrays(GL_TRIANGLES, 0, buffer_size);

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于在 2D、z 顺序渲染系统中组合点(粒子)和三角形(精灵)的主要内容,如果未能解决你的问题,请参考以下文章

Cocos 3.0 使用UIMeshRenderer将3D模型或粒子渲染到2D

2D空间中判断一点是否在三角形内

基于OpenGL编写一个简易的2D渲染框架-08 重构渲染器-整体架构

MMD特效渲染教程2D风格,全息粒子 ray配方公开

关于Cocos2d-x 3.0正式版 粒子问题在IOS上正常显示,在Android下有问题的解决方式

Unity中的Mesh网格编程——绘制基本2D图形