所以我试图弄清楚如何多次绘制单个纹理四边形。我的问题是,由于它们被创建和删除,并且它们中的每一个都有独特的位置和旋转。我不确定 vbo 是最好的解决方案,因为我听说在 android 上修改缓冲区非常慢,而且似乎我需要每帧创建一个新的缓冲区,因为不同的四边形可能会随机消失(与敌人碰撞)。如果我只是对每一个进行绘制调用,我会得到 100 左右的 20fps,这是无法使用的。有什么建议吗?
编辑:我正在尝试创建一个弹幕,但弄清楚如何绘制 500 多个东西让我很头疼。
我认为你正在寻找粒子系统。类似的问题在这里:在 OpenGL ES 1.1 中快速绘制许多纹理粒子.
使用点精灵相当便宜,但你必须在片段着色器中做额外的工作,我不确定 GLES2 是否支持gl_PointSize
如果您需要不同尺寸的颗粒。gl_PointSize 对应世界空间大小
我的首选粒子系统将位置存储在双缓冲纹理中,然后使用单个绘制调用和静态四边形数组进行绘制。This是相关的,但我会在这里详细描述一下......
- 创建一个纹理(如果可以的话,使用浮点,但这可能会限制支持的设备)。每个像素保存粒子位置,也许还保存旋转信息。
- [编辑] 如果您需要对粒子进行动画处理,则需要更改每帧纹理中的值。为了提高速度,让 GPU 在着色器中完成它。使用 FBO,绘制全屏多边形并更新片段着色器中的值。问题是您无法读取和写入相同的纹理(或不应该)。常见的方法是在读取第一个纹理时创建第二个纹理来渲染,然后在它们之间进行乒乓操作,从而对纹理进行双缓冲。
- 创建一个用于绘制三角形的 VBO。位置全部相同,填充 -1 到 1 四边形。然而,使每个四边形的纹理坐标地址为上述纹理中的正确像素。
-
绘制VBO,绑定你的位置纹理。在顶点着色器中,读取给定顶点纹理坐标的位置。将 -1 到 1 顶点位置缩放到正确的大小,应用该位置和任何旋转。使用原始的 -1 到 1 位置作为纹理坐标传递给片段着色器以添加任何常规颜色纹理。
如果您有 GLSL 版本gl_Vertex
,我非常喜欢在顶点着色器中生成这些坐标,节省存储不必要的琐碎数据只是为了绘制简单的对象。例如这个.
- 要生成粒子,请使用
glTexSubImage2D
并将一块粒子写入位置纹理中。如果您开始存储更多粒子属性,您可能需要一些纹理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)