glDrawElements上的iOS GL ES exc_bad_access

时间:2017-12-06 20:05:09

标签: c++ ios objective-c opengl-es

我试图制作一个小型应用程序,使用assimp和GL ES在iOS上加载和渲染模型。我之前使用OpenGL而不是GL ES; iOS上没有任何内容。

目前我在调用glDrawElements时遇到EXC_BAD_ACCESS错误;我无法理解我做错了什么。

这是我的顶点类型:

typedef struct {
    float Position[3];
} Vertex;

这是我的网格类型:

class Mesh {
public:
    Vertex* vertices;
    GLuint verticesCount;
    GLubyte* indices;
    GLuint indicesCount;

    std::vector<Texture> textures;
    GLuint vertexBuffer, indexBuffer;

    Mesh(Vertex* vertices, GLubyte* indices, std::vector<Texture> textures);
};

我非常有信心通过assimp正确加载模型,因为我之前已经完成了这项工作并从另一个项目中提取了这些代码。所以我使用这些数据传递给Mesh构造函数,我使用这个填充VBO:

    glGenBuffers(1, &this->vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, this->vertexBuffer);
    int sizeOfVerts = sizeof(Vertex) * this->verticesCount;
    std::cout << "Size of verts in bytes " << unsigned(sizeOfVerts) << std::endl;
    glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)sizeOfVerts, &this->vertices[0], GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glGenBuffers(1, &this->indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->indexBuffer);
    int sizeOfInd = sizeof(GLubyte) * this->indicesCount;
    std::cout << "Size of inds in bytes " << unsigned(sizeOfInd) << std::endl;
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)sizeOfInd, &this->indices[0], GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

在预渲染函数中已经设置了投影和视图模型matricies,然后我调用它来渲染我的网格物体:

- (void)renderMesh:(Mesh*)mesh
{
    glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->indexBuffer);

    glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);

    int meshSize = mesh->indicesCount;
    glDrawElements(GL_TRIANGLES, meshSize, GL_UNSIGNED_BYTE, 0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}

_positionSlot是我着色器中的attrib位置。我知道我的着色器工作,因为我已经用它画出无聊的方形等等 - 所以错误肯定在上面的代码 - 某处

先谢谢你们,我们确保我都赞成并接受:)

1 个答案:

答案 0 :(得分:0)

发生这种情况的原因是因为我使用GLubyte作为指数类型;这对我的高多边形模型而言太小了。不知道为什么错误表明这个错误消息;在其他平台上,相同的代码将呈现垃圾模型。也许iOS具体?希望这可以帮助别人。