2011-10-03 129 views
0

我想從用glBegin()顯示我的GL_QUADS到用VBO顯示它們。不幸的是,我的更改後程序不再顯示QUADS。我看到的只是一個黑屏。那是我在做什麼:OpenGL - 頂點緩衝區對象沒有繪製到屏幕

我定義了兩個VBO。一個用於頂點數據,一個是指數,並分配了其中的一些空間:

glGenBuffersARB(2, pboIds); 
glBindBufferARB(GL_ARRAY_BUFFER_ARB, pboIds[0]); 
glBufferDataARB(GL_ARRAY_BUFFER_ARB, 50000*sizeof(GLfloat), 0, GL_STREAM_DRAW_ARB); 
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, pboIds[1]); 
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 50000*sizeof(GLint), 0, GL_STREAM_DRAW_ARB); 

然後映射他們,對他們寫信息:最後

float *ptr = (float*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_READ_WRITE_ARB); 
int *ptrind = (int*)glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_READ_WRITE_ARB); 
int nVertexCount=0; 
for (...){ 
    *ptr=vertX; ++ptr; *ptrind=nVertexCount; ++ptrind; nVertexCount++; 
    *ptr=vertY; ++ptr; *ptrind=nVertexCount; ++ptrind; nVertexCount++; 
    *ptr=vertZ; ++ptr; *ptrind=nVertexCount; ++ptrind; nVertexCount++; 
} 
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB); 
glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB); 

,我試圖顯示他們:

glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_FLOAT, 0, 0); 
glDrawElements(GL_QUADS, nVertexCount, GL_INT, (pboIds+1)); 
glDisableClientState(GL_VERTEX_ARRAY); 

我的程序編譯得很好。執行它時我沒有碰到任何崩潰。但我所看到的 - 是一個黑屏。我使用相同的例程來確定頂點座標,就像我使用glBegin(GL_QUADS)所做的那樣。那時我可以在屏幕上看到白色的四邊形。也許我在VBO代碼中做錯了什麼?編輯: 不幸的是我在windows下。我需要做些什麼來停止使用ARB擴展?我有從一個示例代碼:

#ifdef _WIN32 
PFNGLGENBUFFERSARBPROC pglGenBuffersARB = 0; 
PFNGLBINDBUFFERARBPROC pglBindBufferARB = 0; 
PFNGLBUFFERDATAARBPROC pglBufferDataARB = 0; 
PFNGLBUFFERSUBDATAARBPROC pglBufferSubDataARB = 0; 
PFNGLDELETEBUFFERSARBPROC pglDeleteBuffersARB = 0; 
PFNGLGETBUFFERPARAMETERIVARBPROC pglGetBufferParameterivARB = 0; 
PFNGLMAPBUFFERARBPROC pglMapBufferARB = 0; 
PFNGLUNMAPBUFFERARBPROC pglUnmapBufferARB = 0; 
#define glGenBuffersARB   pglGenBuffersARB 
#define glBindBufferARB   pglBindBufferARB 
#define glBufferDataARB   pglBufferDataARB 
#define glBufferSubDataARB  pglBufferSubDataARB 
#define glDeleteBuffersARB  pglDeleteBuffersARB 
#define glGetBufferParameterivARB pglGetBufferParameterivARB 
#define glMapBufferARB   pglMapBufferARB 
#define glUnmapBufferARB   pglUnmapBufferARB 
#endif 
+0

使用新的VBO代碼,您是否仍然通過'glColor()'設置當前顏色? – genpfault

+0

@genpfault: 我想我沒有設置任何顏色。我是不是該? 編輯:我試了一下glColor3f(1.0f,1.0f,1.0f);仍然是一切黑色,沒有GL_QUADs的跡象。 – Fejwin

+0

'(...){'這裏的'...'是什麼? –

回答

2

glDrawElements(GL_QUADS,nVertexCount,GL_INT,(pboIds + 1));

您不會將緩衝區對象名稱傳遞給此函數。它使用當時碰巧綁定到GL_ELEMENT_ARRAY_BUFFER的任何緩衝區對象。該值是從緩衝區開始的偏移量;它指定了第一個索引的位置。

另外,請停止使用ARB擴展版本的緩衝區對象。只要使用核心的東西。


可惜我的窗戶下。

我看不出與它有什麼關係。如果您不能do it yourself,請使用OpenGL loading library

+0

要添加到Nicol Bolas的答案中,在完成類似'#define BUFFER_OFFSET(i)((char *)NULL +(i))''之後,最後一個參數通常看起來像是'BUFFER_OFFSET(youroffset)'。我個人儘量避免在C++中定義,但您經常會看到在示例代碼中定義。 – luke

+0

看到我上面的編輯。 – Fejwin

+0

@Fejwin:看我的編輯。 –