无法用简单的立方体显示VBO,看起来像缓冲区的问题

时间:2012-05-30 09:23:22

标签: objective-c ios opengl-es glkit

尝试在raywenderlich.com上修改this OpenGL和GLKit教程,我试图从波前obj文件渲染一个立方体,没有每顶点颜色信息和表面法线。但渲染的东西看起来就像一个立方体。

"(Not a) Cube"

为了解析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)有问题,但我无法弄清楚它是什么。

2 个答案:

答案 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