我正在嘗試改善繪圖的性能。我實際上做的是繪製2D高度的網格作爲顏色。我有用於x-y座標的mesh_xy矩陣和用於高度矩陣的mesh_z,併爲繪圖元素構建索引矩陣。首先,我嘗試使用客戶端數組,它工作正常。然後,我通過將mesh_xy作爲VBO放到服務器端來做出最小的改變。沒有呈現。任何人都可以幫助我?Opengl VBO(帶混合索引,tex座標陣列)不起作用,請幫忙
相關代碼粘貼在下方。 012_bf5f5()是使用客戶端數組的完美工作函數。 draw_bmfm6()是VBO(只有mesh_xy在服務器端)。我需要提到的一件事是:我的顯卡支持使用其他程序測試過的VBO。
void draw_bmfm5(float scale)
{
glPushMatrix();
glScalef(scale,scale,1.0f);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glShadeModel(GL_SMOOTH);
glEnable(GL_TEXTURE_1D);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);//which is not default
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);//use texture coordinate
glEnableClientState(GL_INDEX_ARRAY);
glVertexPointer(2,GL_FLOAT,0,mesh_xy);//all 1d array, make it 2D and less data is transferred
glTexCoordPointer(1,GL_FLOAT,0,mesh_z);
for(i=0;i<n-1;i++)
{
glDrawElements(GL_TRIANGLE_STRIP,2*HEIGHT,GL_UNSIGNED_INT,index_xy[i]);
}
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_INDEX_ARRAY);
glDisable(GL_TEXTURE_1D);
glPopMatrix();
}
//the only difference between 5 and 6 is:
//we are going to store the mesh_xy into the server side
GLuint vbo_vertex,vbo_tex,vbo_indx;
PFNGLGENBUFFERSARBPROC pglGenBuffersARB = 0; // VBO Name Generation Procedure
PFNGLBINDBUFFERARBPROC pglBindBufferARB = 0; // VBO Bind Procedure
PFNGLBUFFERDATAARBPROC pglBufferDataARB = 0; // VBO Data Loading Procedure
#define glGenBuffersARB pglGenBuffersARB
#define glBindBufferARB pglBindBufferARB
#define glBufferDataARB pglBufferDataARB
void create_vbo()
{
glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffersARB");
glBindBufferARB = (PFNGLBINDBUFFERARBPROC)wglGetProcAddress("glBindBufferARB");
glBufferDataARB = (PFNGLBUFFERDATAARBPROC)wglGetProcAddress("glBufferDataARB");
glGenBuffersARB(1,&vbo_vertex);
glBindBufferARB(GL_ARRAY_BUFFER,vbo_vertex);
glBufferDataARB(GL_ARRAY_BUFFER,3000*141*2*sizeof(float),mesh_xy,GL_STATIC_DRAW);
glGenBuffersARB(1,&vbo_tex);
glGenBuffersARB(1,&vbo_indx);
glBindBufferARB(GL_ARRAY_BUFFER,vbo_tex);
glBufferDataARB(GL_ARRAY_BUFFER,3000*141*sizeof(float),mesh_z,GL_DYNAMIC_DRAW);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER,vbo_indx);
glBufferDataARB(GL_ARRAY_BUFFER,HEIGHT*WIDTH*2*sizeof(int),index_xy,GL_DYNAMIC_DRAW);
}
void draw_bmfm6(float scale)
{
glPushMatrix();
glScalef(scale,scale,1.0f);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glShadeModel(GL_SMOOTH);
glEnable(GL_TEXTURE_1D);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);//which is not default
glDisableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);//use texture coordinate
glEnableClientState(GL_INDEX_ARRAY);
//glVertexPointer(2,GL_FLOAT,0,mesh_xy);//all 1d array, make it 2D and less data is transferred
glBindBufferARB(GL_ARRAY_BUFFER,vbo_vertex);
glVertexPointer(2,GL_FLOAT,0,0);
glTexCoordPointer(1,GL_FLOAT,0,mesh_z);
for(i=0;i<n-1;i++)
{
glDrawElements(GL_TRIANGLE_STRIP,2*HEIGHT,GL_UNSIGNED_INT,index_xy[i]);
}
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_INDEX_ARRAY);
glDisable(GL_TEXTURE_1D);
glPopMatrix();
}
你好巴巴,謝謝你的詳細回覆。我應用你的修改,它的工作原理!性能確實提高了很多。一個問題是:如果我只將vertice矩陣mesh_xy作爲VBO放在服務器端,但將mesh_z留在客戶端(因爲每次都改變矩陣),顏色是相同的,並不反映高度圖mesh_z。有可能這樣做嗎?謝謝你。非常感謝您的幫助。 – shangping 2011-02-02 21:48:12