在opengl2.1中使用glDrawRangeElements

Using glDrawRangeElements in OpenGL 2.1

本文关键字:glDrawRangeElements opengl2      更新时间:2023-10-16

根据关于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个元素。

相关文章:
  • 没有找到相关文章