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