Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用OpenGL 3+渲染点(粒子);_C++_Opengl_Glsl_Particles_Billiards - Fatal编程技术网

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

C++ 使用OpenGL 3+渲染点(粒子);,c++,opengl,glsl,particles,billiards,C++,Opengl,Glsl,Particles,Billiards,OpenGL 3渲染点:这些点存储在空间分区树中。该树具有具有颜色和正常信息属性的点 点信息及其属性存储为一组缓冲区 偏移缓冲区是一个向量数组 这些点作为中心和偏移索引存储在内存中。偏移索引指向偏移缓冲区点=中心+偏移缓冲区[偏移索引] 法线存储在法线缓冲区中,每个点保存法线缓冲区的索引 颜色存储在颜色缓冲区中,每个点保存颜色缓冲区的索引 我有一些空间来更改缓冲区布局,但保留上述信息可以减少重复或冗余信息 我的问题是如何使用OpenGL 3+API高效地渲染上述点?您不需要额外的偏移缓冲区和偏移

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

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

  • 偏移缓冲区是一个向量数组

  • 这些点作为中心和偏移索引存储在内存中。偏移索引指向偏移缓冲区
    点=中心+偏移缓冲区[偏移索引]

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

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

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


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

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

    1) 从模型视图矩阵计算粒子基:

    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) 基于粒子大小计算角点(可以是均匀的,也可以是属性):

    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]。
    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;