我正在用彩色图像和相应的深度图做点云。我已经成功地使用立即模式(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();