您不需要额外的偏移缓冲区和偏移索引,只需传递纹理坐标即可。这是您应该在顶点程序中执行的操作:
1)从ModelView矩阵计算粒子基础:
vec3 X = vec3(ModelView[0][0], ModelView[1][0], ModelView[2][0]);
vec3 Y = vec3(ModelView[0][1], ModelView[1][1], ModelView[2][1]);
2)根据粒度计算角点(可以是统一的,也可以是属性的):
vec3 A1 = -X*SizeX - Y*SizeY;
vec3 B1 = X*SizeX - Y*SizeY;
vec3 C1 = X*SizeX + Y*SizeY;
vec3 D1 = -X*SizeX + Y*SizeY;
3)将中心点移动到适当的角落:
if (TexCoord == vec2(0.0, 0.0)) Position += A1;
if (TexCoord == vec2(1.0, 0.0)) Position += B1;
if (TexCoord == vec2(1.0, 1.0)) Position += C1;
if (TexCoord == vec2(0.0, 1.0)) Position += D1;
或更高效的无分支代码:
vec3 O1 = ( 1.0 - TexCoord.y ) * ( A1 * ( 1.0 - TexCoord.x ) + B1 * TexCoord.x );
vec3 O2 = TexCoord.y * ( C1 * TexCoord.x + D1 * (1.0 - TexCoord.x ) );
Position += O1 + O2;