我试图制作一个小型应用程序,使用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位置。我知道我的着色器工作,因为我已经用它画出无聊的方形等等 - 所以错误肯定在上面的代码 - 某处。
先谢谢你们,我们确保我都赞成并接受:)
答案 0 :(得分:0)
发生这种情况的原因是因为我使用GLubyte作为指数类型;这对我的高多边形模型而言太小了。不知道为什么错误表明这个错误消息;在其他平台上,相同的代码将呈现垃圾模型。也许iOS具体?希望这可以帮助别人。