【问题标题】:Rendering points (particles) with OpenGL 3+使用 OpenGL 3+ 渲染点(粒子)
【发布时间】:2012-09-19 06:41:44
【问题描述】:

OpenGL 3 渲染点:点存储在空间分区树中。树有带有颜色和法线信息属性的点。

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

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

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

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

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

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

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

【问题讨论】:

    标签: c++ opengl glsl particles billiards


    【解决方案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;
    

    【讨论】:

    • Sergey,不幸的是需要偏移缓冲区,让我解释一下原因。这些点被分成簇,簇中心存储在空间分区数据结构中。当需要更好的 LOD 时,偏移量被保留以表示实际点。我不完全确定您的解决方案。你能详细说明你的答案吗?
    • 然后只需将 Position = center + OffSetBuffer[offset index] 添加到我的代码的开头。
    猜你喜欢
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2011-01-18
    • 2014-04-28
    • 1970-01-01
    相关资源
    最近更新 更多