Почему я получаю EXC_BAD_ACCESS при использовании GL_UNSIGNED_SHORT в OpenGL ES для iOS? - PullRequest
2 голосов
/ 11 февраля 2012

Что мне нужно сделать, это нарисовать массив вершин, который содержит более 256 элементов. Когда у меня их меньше, и я использую GL_UNSIGNED_BYTE при вызове glDrawElements, все работает отлично. Когда у меня более 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 ]

2 голосов
/ 11 февраля 2012

Вы пытались определить:

GLubyte localIndices[glIndLim];

как

GLushort localIndices[glIndLim];

?

Причина состоит в том, что если это должно представлять индекс для вашей вершины, он должендопустим все возможные значения для GLushort, иначе локальный индекс всегда будет GLubyte.

0 голосов
/ 11 февраля 2012

Регистрируйте значение индекса каждый раз через цикл. Похоже, вы увеличиваете переменную за пределы ее максимального значения, и она становится отрицательным числом.

...