【问题标题】:Using glDrawRangeElements in OpenGL 2.1在 OpenGL 2.1 中使用 glDrawRangeElements
【发布时间】:2011-12-02 10:44:42
【问题描述】:

根据Questions about glDrawRangeElements()中的信息,给出以下项目:

struct MyVertex
{
   GLfloat x, y, z;        //Vertex
};

const GLushort pindices[] = { 0, 1, 2, 3, 5, 4 };

struct MyVertex pvertex[6];
//VERTEX 0
pvertex[0].x = 0.0;
pvertex[0].y = 0.0;
pvertex[0].z = 0.0;
//VERTEX 1
pvertex[1].x = 1.0;
pvertex[1].y = 0.0;
pvertex[1].z = 0.0;
//VERTEX 2
pvertex[2].x = 0.0;
pvertex[2].y = 1.0;
pvertex[2].z = 0.0;
//VERTEX 3
pvertex[3].x = 0.0;
pvertex[3].y = 0.0;
pvertex[3].z = 0.0;
//VERTEX 4
pvertex[4].x = 1.0;
pvertex[4].y = 0.0;
pvertex[4].z = 0.0;
//VERTEX 5
pvertex[5].x = 0.0;
pvertex[5].y = -1.0;
pvertex[5].z = 0.0;

以及以下初始化:

glGenBuffers(1, &VertexVBOID);
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
glBufferData(GL_ARRAY_BUFFER, sizeof(struct MyVertex)*3, &pvertex[0].x, GL_STATIC_DRAW);
glVertexPointer(3, GL_FLOAT, sizeof(struct MyVertex), BUFFER_OFFSET(0));

glGenBuffers(1, &IndexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*3, pindices, GL_STATIC_DRAW);

glEnableClientState(GL_VERTEX_ARRAY);

以下调用:

glDrawRangeElements(GL_TRIANGLES, 0, 2, 3, GL_UNSIGNED_SHORT, (const GLvoid*) pindices);
glDrawRangeElements(GL_TRIANGLES, 3, 5, 3, GL_UNSIGNED_SHORT, (const GLvoid*) pindices+3);

应该画两个三角形。但是,我得到一个 EXE_BAD_ACCESS。如果我在 glDrawRangeElements 中使用 pindices[0];我得到了由前三个索引定义的三角形。在对 glDrawRangeElements 的第二次调用中使用 pindices[3] 不会导致绘制任何内容,并且我没有收到任何 OpenGl 错误。第二个 glDrawRangeElements 调用绝不会绘制由最后三个顶点定义的倒三角形。我觉得我在这里缺少关于使用指针的一些基本知识,但我还没有弄清楚。想法?

【问题讨论】:

  • 欢迎来到 SO,我希望你已经阅读了FAQ

标签: c++ c opengl


【解决方案1】:

您的问题与glDrawRangeElements 没有直接关系,而是与 VBO 的错误使用有关。

首先,当使用 VBO 时(或更准确地说,将 VBO 绑定到 GL_ELEMENT_ARRAY_BUFFER 时),glDraw... 的索引指针参数被解释为绑定到 GL_ELEMENT_ARRAY_BUFFER 绑定点的缓冲区的字节偏移量(索引缓冲区),类似于GL_ARRAY_BUFFER 如何影响glVertexPointer 的数组参数。因此访问不良。因此,在第一个 glDrawRangeElements 调用中将 (const GLvoid*)pindices 替换为 0。无论如何,第二个调用是错误的,因为您不能对 void 指针进行指针运算(它甚至不应该编译,它应该增加什么大小?字节?短裤?)。所以在第二次调用中使用(const GLushort*)0+3 来获得到索引缓冲区中第四个索引的字节偏移量。

其次,您的缓冲区仅包含所需数据的一半,因为您在两个 glBufferData 调用中都使用了 sizeof(...)*3,但您的数组实际上包含 6 个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2011-12-27
    • 1970-01-01
    相关资源
    最近更新 更多