如何从立即模式切换到VBO

时间:2014-07-30 06:16:32

标签: c++ opengl vbo point-clouds

我正在用彩色图像和相应的深度图做点云。我已经成功地使用立即模式(glBegin / glEnd)完成了这个,但是当我使用鼠标和箭头键转动并移动视图时,我在空间中绘制了第二个点,它可怕地滞后。

所以我的问题是如何将此代码从立即模式切换到VBO,据说可以提高性能。

代码: 第一点云对象

    float** imgdata;
    imgdata = new float*[320];
    for(int a=0; a<320; a++)
    {
        *(imgdata + a) = new float[240];
    }

    float*** texture;
    texture = new float**[320];
    for(int a=0; a<320; a++)
    {
        *(texture + a) = new float*[240];
        for(int b=0; b<240; b++)
            *(*(texture + a) + b) = new float[3];
    }

    GBmp bm0;
    GBmp bm1;
    bm0.load("depth-use1.bmp");
    bm1.load("color-use1.bmp");

    for (int j=0; j<bm0.h; j++)
    {
        for (int i=0; i<bm0.w; i++)
        {
            texture[i][j][0] = bm1.rgb[i*3+j*bm0.w*3];
            texture[i][j][1] = bm1.rgb[i*3+j*bm0.w*3+1];
            texture[i][j][2] = bm1.rgb[i*3+j*bm0.w*3+2];
        }
    }

    for (int j=0; j<bm0.h; j++)
    {
        for (int i=0; i<bm0.w; i++)
        {
            imgdata[i][j] = bm0.rgb[i*3+j*bm0.w*3];
        }
    }   

    float x, y, z;
    glPointSize (6);
    glBegin(GL_POINTS);
    for (int j=0; j<bm0.h; j++)
        {
            for (int i=0; i<bm0.w; i++)
            {
                x = i-160;
                y = j-120;
                z = imgdata[i][j];
                glColor3f(texture[i][j][0]/255, texture[i][j][1]/255, texture[i][j][2]/255);
                if (imgdata[i][j] != 0)
                glVertex3f(x,y,z);    
            }
        }
    glEnd();

第二点云对象

    float** imgdata1;
    imgdata1 = new float*[320];
    for(int a=0; a<320; a++)
    {
        *(imgdata1 + a) = new float[240];
    }

    float*** texture1;
    texture1 = new float**[320];
    for(int a=0; a<320; a++)
    {
        *(texture1 + a) = new float*[240];
        for(int b=0; b<240; b++)
            *(*(texture1 + a) + b) = new float[3];
    }

    GBmp bm2;
    GBmp bm3;
    bm2.load("depth-use2.bmp");
    bm3.load("color-use2.bmp");

    for (int j=0; j<bm0.h; j++)
    {
        for (int i=0; i<bm0.w; i++)
        {
            texture1[i][j][0] = bm3.rgb[i*3+j*bm0.w*3];
            texture1[i][j][1] = bm3.rgb[i*3+j*bm0.w*3+1];
            texture1[i][j][2] = bm3.rgb[i*3+j*bm0.w*3+2];
        }
    }

    for (int j=0; j<bm0.h; j++)
    {
        for (int i=0; i<bm0.w; i++)
        {
            imgdata1[i][j] = bm2.rgb[i*3+j*bm0.w*3];
        }
    }
    glPushMatrix();
    glRotatef(36,0,1,0); 
    glPointSize (6);
    glBegin(GL_POINTS);  
     float x1, y1, z1;
     for (int j=0; j<bm0.h; j++)
         {
             for (int i=0; i<bm0.w; i++)
             {
                 x1 = i-210;
                 y1 = j-120;
                 z1 = imgdata1[i][j];
                 glColor3f(texture1[i][j][0]/255, texture1[i][j][1]/255, texture1[i][j][2]/255);
                 if (imgdata1[i][j] != 0)   
                 glVertex3f(x1,y1,z1);
             }
         } 
     glEnd();

0 个答案:

没有答案