尝试在raywenderlich.com上修改this OpenGL和GLKit教程,我试图从波前obj文件渲染一个立方体,没有每顶点颜色信息和表面法线。但渲染的东西看起来就像一个立方体。
为了解析obj文件,我有一个方法(createDrawable),它通过obj并将信息保存到一个struct(Drawable)中,它包含四个东西:顶点缓冲区,索引缓冲区,对象中的面数和转换对象的矩阵。 (以下是header,.m file和.obj file。)
- (Drawable)createDrawable: (NSString *)objFileName {
......
......
// Parsed obj and put info in vertexData and indices arrays.
Drawable _drawable;
_drawable.numFaces = numFaces;
glGenBuffers(1, &_drawable.vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _drawable.vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData) * numFaces * 8, vertexData, GL_STATIC_DRAW);
glGenBuffers(1, &_drawable.indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _drawable.indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices) * numFaces * 3, indices, GL_STATIC_DRAW);
_drawable.matrix = GLKMatrix4Identity;
_drawable.matrix = GLKMatrix4Translate(_drawable.matrix, 0.0f, 0.0f, 10.0f);
return _drawable;
}
对于渲染我正在使用另一个绑定对象缓冲区的方法(renderDrawable),设置指向它们的指针,然后使用glDrawElements(..)渲染。
- (void) renderDrawable: (Drawable)object {
glBindBuffer(GL_ARRAY_BUFFER, object.vertexBuffer);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) 0);
glEnableVertexAttribArray(GLKVertexAttribTexCoord1);
glVertexAttribPointer(GLKVertexAttribTexCoord1, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) 3);
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) 5);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object.indexBuffer);
glDrawElements(GL_LINES, sizeof(object.indexBuffer) * 3 * object.numFaces, GL_UNSIGNED_BYTE, (const GLvoid *) object.indexBuffer);
}
我认为我在使用缓冲区(这里显示的createDrawable的一部分和.m文件中的renderDrawable)有问题,但我无法弄清楚它是什么。
答案 0 :(得分:1)
我认为您的问题是您将GL_LINES传递给glDrawElements()而不是GL_TRIANGLES。
答案 1 :(得分:1)
我认为glVertexArrayPointer中的“stride”参数应设置为8 * sizeof(float),例如(单个顶点的大小)
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (const GLvoid *) 5);
当stride为0时 - 这意味着attribs以连续的方式存储...但是你有交错的attribs所以你必须为OpenGL提供更多的信息。
另一个问题:sizeof(vertexData) * numFaces * 8
是什么......我认为应该是:sizeof(vertexData) * numFaces * 3
对于索引缓冲区:sizeof(indices) * numFaces * 3
- 我认为它应该是sizeof(int) * numFaces * 3
int - 索引的类型,但你有GL_BYTE(这意味着你只能有256个不同的索引!)
渲染时: glDrawArrays - 您已绑定索引缓冲区,因此将最后一个参数设置为NULL