我试图从使用glBegin()显示我的GL_QUADS到用VBO显示它们。不幸的是,在我改变后,程序不再显示QUADS。我只看到一个黑屏。这就是我在做的事情:
我定义了两个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代码中做错了什么?
编辑: 不幸的是我在窗户下。我是否必须对这些做些什么来停止使用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 :(得分:2)
glDrawElements(GL_QUADS,nVertexCount,GL_INT,(pboIds + 1));
您没有将缓冲区对象名称传递给此函数。它使用碰巧绑定到GL_ELEMENT_ARRAY_BUFFER的任何缓冲区对象。该值是从缓冲区开始的偏移量;它指定第一个索引的位置。
此外,请停止使用缓冲区对象的ARB扩展版本。只需使用核心内容。
不幸的是我在windows下。
我看不出它与它有什么关系。如果您不能OpenGL loading library,请使用do it yourself。