我写了一个obj loader。这很简单,但是我敢肯定它可以工作。我检查了文件中的值和加载程序打印的值,它们匹配。 当我尝试加载像stanford dragon或Bunny这样的大obj文件时,会出现问题。犹他州茶壶(3664 verts)可以很好地工作,但是龙(50k verts)却表现得非常糟糕:
如您所见,龙出了毛病。似乎只渲染了三角形的一部分。
P.S。所有模型均已三角剖分。
网格加载:
void Mesh::load(float* buffer, unsigned int size, char fields, char target) {
unsigned int vbo;
glGenBuffers(1, &vbo);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(target, fields, GL_FLOAT, false, sizeof(float) * fields, 0);
glBufferData(GL_ARRAY_BUFFER, size, buffer, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
vbos[target] = vbo;
}
void Mesh::loadIndices(void* buffer, unsigned int size) {
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, buffer, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
和网格:
mesh = new Mesh();
mesh->numIndices = indices.size();
mesh->load(positions, pos.size() * sizeof(float), 3, MESH_TARGET_POS);
mesh->loadIndices(ind, indices.size() * sizeof(unsigned int));
indices
和pos
是std::vectors
,position和ind只是复制到堆分配的内存中的那些向量的内容(以防万一它会有所改变,但不会,那不是)不能改变任何东西)。
load方法采用指向数据的指针,字节大小,向量中的字段(3d向量-3个字段,2d向量-2个字段)以及最后一个整数,该整数告诉该数据是哪个属性(MESH_TARGET_POS
-属性1,顶点职位)。
该代码与问题无关(我相信)。每个小于1万个顶点的模型都可以正常工作,即使低多边形的龙也可以正常工作。