在OpenGL 2.1中使用glDrawRangeElements

时间:2011-10-06 17:20:33

标签: c++ c opengl

根据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调用在任何时候都不会绘制由最后三个顶点定义的倒三角形。我觉得我在这里缺少一些关于指针使用的基本信息,但我还没有弄明白。想法?

1 个答案:

答案 0 :(得分:2)

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

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

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