代码之家  ›  专栏  ›  技术社区  ›  Xzhsh

加速IO绑定的OpenGL应用程序

  •  2
  • Xzhsh  · 技术社区  · 16 年前

    我最近一直在开发一个点云播放器,理想情况下,它应该能够从激光雷达捕获中可视化地形数据点,并以大约每秒30帧的速度顺序显示它们。一、 然而,似乎已经到了一堵墙导致PCI-e IO。

    大约每秒1.34千兆字节

    我的呈现代码现在看起来像这样:

    glPointSize(ptSize);
    glEnableClientState(GL_VERTEX_ARRAY);
    if(colorflag) {
        glEnableClientState(GL_COLOR_ARRAY);
    } else {
        glDisableClientState(GL_COLOR_ARRAY);
        glColor3f(1,1,1);
    }
    glBindBuffer(GL_ARRAY_BUFFER, vbobj[VERT_OBJ]);
    glBufferData(GL_ARRAY_BUFFER, cloudSize, vertData, GL_STREAM_DRAW);
    glVertexPointer(3, GL_FLOAT, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, vbobj[COLOR_OBJ]);
    glBufferData(GL_ARRAY_BUFFER, cloudSize, colorData, GL_STREAM_DRAW);
    glColorPointer(3, GL_FLOAT, 0, 0);
    glDrawArrays(GL_POINTS, 0, numPoints);
    glDisableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    

    vertData和colorData的指针每帧都会更改。

    我希望能够做到的是能够以每秒至少30帧的速度播放,即使以后使用可能达到每帧700万点的大型点云。这有可能吗?或者更容易将它们网格化,构建一个高度图,并以某种方式显示出来?我对三维编程还是相当陌生的,所以任何建议都将不胜感激。

    5 回复  |  直到 13 年前
        1
  •  7
  •   Ivan Baldin    16 年前

    编辑:您只需要从colormap创建纹理,并使用glTexCoordPointer而不是glColorPointer(当然还需要更改[0,1]范围内纹理坐标的顶点颜色值)。以下是线性插值的6 texel颜色贴图:

    // Create texture
    GLuint texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_1D, texture);
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    
    // Load textureData
    GLubyte colorData[] = {
        0xff, 0x00, 0x00,
        0xff, 0xff, 0x00,
        0x00, 0xff, 0x00,
        0x00, 0xff, 0xff,
        0x00, 0x00, 0xff,
        0xff, 0x00, 0xff
    };
    glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 6, 0, GL_RGB, GL_UNSIGNED_BYTE, colorData);
    glEnable(GL_TEXTURE_1D);
    
        2
  •  4
  •   Shelwien    16 年前

    不支持整数类型或16位浮点吗? 除了每个点3个浮动之外,还有其他颜色表示吗?

        3
  •  3
  •   genpfault    13 年前

    如果你愿意处理延迟,你可以加倍-(或更多!)缓冲VBO,将几何体传输到一个缓冲区,同时从另一个缓冲区进行渲染:

    while(true)
    {
        draw_vbo( cur_vbo_id );
        generate_new_geometry();
        load_vbo( nxt_vbo_id );
        swap( cur_vbo_id, nxt_vbo_id );
    }
    

    编辑:你也可以试试 interleaving

        4
  •  1
  •   Community Mohan Dere    9 年前

    你说它是I/O绑定的。这意味着您已经分析过它,并看到它花费50%或更多的时间等待I/O。

    如果是这样的话,那就是你必须关注的,而不是图形。

    如果没有,那么其他一些答案听起来不错。不管怎样,侧写, 别猜了 . This is the method I use.

        5
  •  0
  •   fho    16 年前

    一些提示:

    • 在图形卡上存储尽可能多的数据,只加载真正需要的数据(非常明显)
    • 在树中使用lod级别(kd-或octtrees),并尽可能提前计算