使用OpenGL 3+渲染点(粒子)

时间:2012-09-19 06:41:44

标签: c++ opengl glsl particles billiards

OpenGL 3渲染点:这些点存储在空间分区树中。树具有颜色和正常信息属性的点。

点信息及其属性存储为一组缓冲区。

  1. 偏移缓冲区是一个矢量数组。

  2. 这些点作为中心和偏移索引存储在内存中。偏移索引指向偏移缓冲区Point = center + OffSetBuffer[offset index]

  3. 法线存储在普通缓冲区中,每个点都保存正常缓冲区的索引。

  4. 颜色存储在颜色缓冲区中,每个点都包含颜色缓冲区的索引。

  5. 我有一些空间来更改缓冲区布局,但保留上述信息可减少重复或冗余信息。

    我的问题是如何有效地使用OpenGL 3+ API渲染上述点?

1 个答案:

答案 0 :(得分:1)

您不需要额外的偏移缓冲区和偏移索引,只需传递纹理坐标。以下是您应该在顶点程序中执行的操作:

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;