使用VBO的glDrawElements EXC_BAD_ACCESS

时间:2011-12-27 16:14:39

标签: exc-bad-access opengl-es-2.0 vbo

我遇到VBO这个问题,我真的不明白。我的问题是通过意外更改glVertexAttribPointer方法调用中的最后一个参数来解决的。所以,我正在寻找一个答案为什么这是突然工作或为什么我以前的代码不再工作。 (只是为了更好地理解opengl)

STRUCT:

typedef struct 
{
    float position[3];
    float color[4];
} Vertex;

没有维也纳国际中心:

// Get pointers to the data
GLsizei stride = sizeof(Vertex);
const GLvoid *pCoords = &squareVertices[0].position[0];
const GLvoid *pColors = &squareVertices[0].color[0];

// Setup pointers to positions and colors
glVertexAttribPointer(positionSlot, 3, GL_FLOAT, GL_FALSE, stride, pCoords);
glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, stride, pColors);

// Draw
glDrawArrays(GL_TRIANGLES, 0, sizeof(squareVertices) / sizeof(Vertex));

使用VBO(这给了我一个EXC_BAD_ACCESS)

// Stide
GLsizei stride = sizeof(Vertex);

// Setup pointers to positions and colors
glVertexAttribPointer(positionSlot, 3, GL_FLOAT, GL_FALSE, stride, 0);
glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, stride, (GLvoid*) (sizeof(float) * 3));

// Draw
glDrawElements(GL_TRIANGLES, sizeof(squareIndices) / sizeof(squareIndices[0]), GL_UNSIGNED_BYTE, 0);

所以,实际上唯一不同的是glVertexAttribPointer调用,它有一个指向数据的指针,现在有固定的数字。任何人都可以详细说明这个吗?提前谢谢。

1 个答案:

答案 0 :(得分:4)

当VBO处于活动状态时,glVertexAttribPointer的最后一个参数实际上不是指针,而是顶点缓冲区对象内的偏移量类型转换为指针。这就是VBO的工作原理:数据已经被复制到图形驱动程序管理的某些内存中,你不知道它的地址。事实上,当它存储在显卡的某个地方时,它甚至可能没有正常的地址。

其余的是围绕C / C ++类型系统作弊。类型系统远远不够智能,无法理解glVertexAttribPointer的最后一个参数应该是VBO处于活动状态时指针大小的整数偏移量,否则就是指针。所以对于C ++编译器来说,它必须始终看起来像一个指针,因为这是最初定义的glVertexAttribPointer(或更确切地说,它是前任glVertexPointer和朋友)的方式。当它只是一个数字时,我们只使用类型转换来欺骗编译器。