2011-02-02 31 views
0

我正在嘗試改善繪圖的性能。我實際上做的是繪製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(); 

} 

回答

2

GL_INDEX_ARRAY並不意味着你的想法。它意味着從調色板控制顏色選擇器,當您渲染到調色框架緩衝區時,該調色板在GL中使用。你調用glDrawElements這個簡單的事實意味着你正在使用頂點索引。沒有客戶端陣列啓用。

所以......當你看到你的VBO,你可以看到,得到您的通話困惑:

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); 

最後調用實際上使用綁定到ARRAY_BUFFER緩衝區,即vbo_tex。 所以,你上傳你的指數到vbo_tex,而不是把任何東西放入vbo_indx

接下來,在你的VBOs綁定,你沒有選擇適當的vbo每個指針調用。

指標和頂點根本不同。你可以將一個或另一個(最好是兩個)放到vbos中,但是你的index_xy結構是一個數組數組,所以我將編寫只將頂點放在vbos中的代碼(因爲我不知道底層的數據結構指數)

把所有這些組合起來得到:

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); 
    glBindBufferARB(GL_ARRAY_BUFFER,vbo_tex); 
    glBufferDataARB(GL_ARRAY_BUFFER,3000*141*sizeof(float),mesh_z,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 
    glEnableClientState(GL_VERTEX_ARRAY); // Why was this Disable ? 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);//use texture coordinate 
    //glEnableClientState(GL_INDEX_ARRAY); // removed 
    glBindBufferARB(GL_ARRAY_BUFFER,vbo_vertex); 
    glVertexPointer(2,GL_FLOAT,0,0); 

    glBindBufferARB(GL_ARRAY_BUFFER,vbo_tex); // Binding the texcoord buffer 
    glTexCoordPointer(1,GL_FLOAT,0,0); // 0 as offset 
    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); // not needed 

    glDisable(GL_TEXTURE_1D); 
    glPopMatrix(); 

} 

注:我沒有測試此代碼,但我有固定的一些問題。可能還有其他的。

最後,將索引數組數據推送到VBO需要綁定並將數據放入ELEMENT_ARRAY_BUFFER,並將偏移量從glDrawElements調用傳遞到緩衝區。

+0

你好巴巴,謝謝你的詳細回覆。我應用你的修改,它的工作原理!性能確實提高了很多。一個問題是:如果我只將vertice矩陣mesh_xy作爲VBO放在服務器端,但將mesh_z留在客戶端(因爲每次都改變矩陣),顏色是相同的,並不反映高度圖mesh_z。有可能這樣做嗎?謝謝你。非常感謝您的幫助。 – shangping 2011-02-02 21:48:12