android - OpenGL ES 2.0——简单粒子系统的最佳途径

标签 android opengl-es sprite point particles

我正在尝试为使用 OpenGL ES 2.0 的 Android 应用程序创建一个非常简单的粒子系统。基本上它仅适用于背景中的线性移动云。在开始之前我的第一个想法是使用点 Sprite ,这就是我一直在尝试做的事情。我很难做到这一点,但撇开这些问题不谈,点 Sprite 真的是解决这个问题的方法吗?

在我为解决错误而进行的搜索中,我已经阅读了很多关于它们的相互矛盾的内容,如果这不是我应该的解决方案,我不想投入大量时间来使它一切正常首先去争取。与仅使用三角形相比,人们发布了各种各样的问题,例如裁剪,甚至性能下降。我希望有经验的用户了解点 Sprite 适合的位置以及何时应该使用它们,包括在像我这样的情况下,它们在屏幕上最多不会超过几十个“粒子”。

最佳答案

请记住,点 Sprite 有硬性尺寸限制,尺寸越大,性能越慢。如果您的目标是只有 12 个“粒子”,我认为您应该将它们渲染为四边形。另一方面,如果您的目标是让 12 朵云由很多很多“云粒子”组成,每个云都给它们一个动画效果,那么是的,您应该使用点 Sprite 。

瓶颈将是填充率,特别是因为您可能会使用混合。

如果你有 100 多朵云,是否使用点 Sprite 的问题就变得更重要了。要为它们设置动画,您要么必须在每个帧中向 opengl 发送一个新缓冲区(方法 1),要么在使用不同变换矩阵的单独调用中渲染每个云(方法 2)。后者很可能是最慢的,但前者要求您为每个云发送 4 个新顶点(假设索引渲染),而如果您使用点 Sprite (方法 3),则每个云仅发送 1 个新顶点。

此时很容易粗略地计算出最快的速度。方法2是指每帧16*4*num_clouds字节的数据传输到gpu,方法1是d*4*num_clouds,而方法3是d*num_clouds ,其中 d 为 2 或 3,具体取决于您是否需要 z。

另外值得注意的是,方法1和3是一批发送数据,而方法2是一次发送16*4字节。

由于您使用的是 GL ES 2,您可以跳过方法 2 中的矩阵,只需将翻译作为向量发送,但您仍然会遇到非批处理数据传输和为每个实例设置统一的成本。

编辑: 实际上,如果有很多粒子,你会做的是设置一个统一的时间,并将云的速度作为静态属性,然后通过将速度乘以时间在着色器中为它们设置动画,并确保它们如有必要,环绕边缘。因此,对于完全动画化的云场景,您每帧只需传输 4 个字节。

关于android - OpenGL ES 2.0——简单粒子系统的最佳途径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7342033/

相关文章:

android - 在 Android 应用程序中可选编译 Google Play 服务

java - Android Studio (1.5.1) 选择空白 Activity 布局时出现渲染问题

php android spinner - JSONObject 无法转换为 JSONArray

java - 有没有办法检查 Android 设备是否支持 openGL ES 3.0?

java - BLE 连接的后台服务

java - 如何从脸部检测特定物体并实时添加我的图像?

iPhone 相机图像作为 OpenGL ES 纹理

CSS Sprite 动画: delay between loops

c++ - 如何在不使用高级 3d 功能的情况下使用 DirectX9 进行 .png 图像模糊 HLSL/Per Pixel motion blut/Vertex Shader

windows - 在 Windows 7 上通过 cygwin/node.js 创建音频 Sprite 需要一些帮助