我正在尝试为OpenGL ES 2.0编写粒子系统。每个粒子由4个顶点组成,形成小正方形,在其上绘制透明纹理。
这显然很低效,因为每次 glDrawArray 调用只会绘制 4 个顶点。
如果我通过属性变量发送这些属性,则必须为属性缓冲区中的每个片段填充相同的信息 4 次。
问题是:每个粒子都有自己的属性(颜色、位置、大小),这些属性在该粒子的4个顶点中保持不变。每个顶点唯一的变化是它所处正方形的角落。
如果我要通过统一变量发送粒子的属性,我必须执行以下操作:
for(each particle) { // do maaaany times
glUniform*(...);
glDrawArray(...); // only draw 4 vertexes
};
这显然很低效,因为每次 glDrawArray 调用只会绘制 4 个顶点。
如果我通过属性变量发送这些属性,则必须为属性缓冲区中的每个片段填充相同的信息 4 次。
struct particle buf[n];
for(each particle) {
struct particle p;
p = ...; // Update particle
buf[i+0] = buf[i+1] = buf[i+2] = buf[i+3] = p;
};
glBufferData(..., buf, ...);
// then draw everithing once afterwards...
什么是内存效率低并且看起来非常丑陋。那么这个问题的解决方案是什么?在每个顶点中更改参数的正确方法是什么?
gl_PointSize
,无需使用OES_point_size_array
。但是对于点精灵总体而言,加1分,它们的标准应用确实是粒子系统。虽然它们存在一些问题(基于中心的裁剪),但对于小颗粒物可能可以忽略不计。 - Christian Raugl_PointCoord
变量中获取精灵纹理坐标即可。那么问题在哪里? - Christian Rau