【问题标题】:OpenGl - Vertex Buffer Object Is Not Drawn To ScreenOpenGL - 顶点缓冲区对象未绘制到屏幕上
【发布时间】:2011-10-03 17:04:40
【问题描述】:

我正在尝试从使用 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

【问题讨论】:

  • 使用新的 VBO 代码是否仍通过 glColor() 设置当前颜色?
  • @genpfault:我想我没有设置任何颜色。我是不是该?编辑:我试了一下 glColor3f(1.0f,1.0f,1.0f);还是一片漆黑,没有 GL_QUAD 的迹象。
  • for (...){ 这里的... 是什么?

标签: opengl vbo


【解决方案1】:

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

您没有将缓冲区对象名称传递给此函数。它使用当时碰巧绑定到 GL_ELEMENT_ARRAY_BUFFER 的任何缓冲区对象。该值是距缓冲区开头的偏移量;它指定第一个索引的位置。

另外,停止使用缓冲区对象的 ARB 扩展版本。只使用核心的东西。


不幸的是我在windows下。

我看不出这与它有什么关系。如果不能do it yourself,请使用OpenGL loading library

【讨论】:

  • 添加到 Nicol Bolas 的答案中,最后一个参数通常看起来像 BUFFER_OFFSET(youroffset),在你完成类似 #define BUFFER_OFFSET(i) ((char *)NULL + (i)) 之后。我个人尽量避免在 C++ 中定义,但您经常在示例代码中看到该定义。
  • 我认为我的示例来源已经过时了。我最近发现了以下网站,并打算从那里学习:arcsynthesis.org/gltut/index.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多