在opengl2.1中使用glDrawRangeElements
Using glDrawRangeElements in OpenGL 2.1
根据关于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];我得到了由前三个指标定义的三角形。使用pindices[3]在第二次调用glDrawRangeElements不会导致任何被绘制,我没有得到任何OpenGl错误。在任何时候,第二个glDrawRangeElements调用都不会绘制由最后三个顶点定义的倒三角。我觉得我在这里遗漏了一些关于指针使用的基本内容,但我还没能弄清楚。想法吗?
您的问题与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
来获得索引缓冲区中第4个索引的字节偏移量。
第二,您的缓冲区只包含所需数据的一半,因为您在两个glBufferData
调用中都使用sizeof(...)*3
,但您的数组实际上包含6个元素。
- 没有找到相关文章