为什么在OpenGL ES for iOS中使用GL_UNSIGNED_SHORT时会得到EXC_BAD_ACCESS?

时间:2012-02-11 18:05:51

标签: objective-c ios opengl-es exc-bad-access vertex-buffer

我需要做的是绘制一个超过256个元素的顶点数组。当我的数量少于那么多时,我在glDrawElements的调用中使用了GL_UNSIGNED_BYTE,一切正常。当我有超过256个元素时,它会再次开始向后绘制第一个顶点(即最后一个元素[256 - 255,无论如何]与第一个[1或0]连接,并且不会绘制其他元素)。如果我改用GL_UNSIGNED_SHORT,我会得到EXC_BAD_ACCESS。是什么给了什么?

int indexLim = self.animIndex;

GLushort glIndLim = (GLushort)indexLim;

Vertex localVertices[glIndLim];
GLubyte localIndices[glIndLim];

for(GLushort i=0; i < glIndLim; i++)
{
    x = (float)i;
    y = [[data objectAtIndex:i ] floatValue];

    x = x*xScale + xOffset;
    y = y*yScale + yOffset;

    localVertices[i].Position[0] = x;
    localVertices[i].Position[1] = y;
    localVertices[i].Position[2] = z;
    localVertices[i].Color[0]    = r;
    localVertices[i].Color[1]    = g;
    localVertices[i].Color[2]    = b;
    localVertices[i].Color[3]    = a;
    localIndices[i] = i;
}    

// setupVBOs
GLuint vertexBuffer;
glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(localVertices), localVertices, GL_STATIC_DRAW);

GLuint indexBuffer;
glGenBuffers(1, &indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(localIndices), localIndices, GL_STATIC_DRAW);

glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));


//glDrawElements(GL_LINE_STRIP, glIndLim, GL_UNSIGNED_BYTE, 0); // Works, but only draws 256 elements
glDrawElements(GL_LINE_STRIP, glIndLim, GL_UNSIGNED_SHORT, 0); // EXC_BAD_ACCESS!!!!

2 个答案:

答案 0 :(得分:2)

您是否尝试过定义:

GLubyte localIndices[glIndLim];

作为

GLushort localIndices[glIndLim];

原因是如果它应该表示顶点的索引,它应该允许GLushort的所有可能值,否则本地索引将始终是GLubyte。

答案 1 :(得分:0)

每次循环记录索引值。听起来你正在将变量增加到超过其最大值,并且它变成负数。