【发布时间】:2012-05-30 22:58:40
【问题描述】:
尝试修改 raywenderlich.com 上的 this OpenGL 和 GLKit 教程,我尝试从波前 obj 文件渲染立方体,没有每个顶点颜色信息和表面法线。但是被渲染的东西看起来一点也不像立方体。
为了解析一个 obj 文件,我有一个方法 (createDrawable),它通过 obj 并将信息保存到一个结构 (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 的一部分),但我就是不知道它是什么。
【问题讨论】:
标签: objective-c ios opengl-es glkit