【问题标题】:Can't display VBO with simple cube, seems like issue with buffers无法用简单的立方体显示 VBO,似乎是缓冲区的问题
【发布时间】: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


    【解决方案1】:

    我认为 glVertexArrayPointer 中的“步幅”参数应该设置为 8 * sizeof(float) 例如(单个顶点的大小)

    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (const GLvoid *) 5);
    

    当步幅为 0 时 - 这意味着属性以连续方式存储...但您已交错属性,因此您必须向 OpenGL 提供更多信息。

    另一个问题:sizeof(vertexData) * numFaces * 8是什么...我认为应该是:sizeof(vertexData) * numFaces * 3

    对于索引缓冲区:sizeof(indices) * numFaces * 3 - 我认为应该是 sizeof(int) * numFaces * 3

    int - 索引类型,但你有 GL_BYTE(这意味着你只能有 256 个不同的索引!)

    渲染时: glDrawArrays - 你已经绑定了索引缓冲区,所以将最后一个参数设置为 NULL

    【讨论】:

    • sizeof(vertexData) * numFaces * 8 表示提供整个 vertexData 数组的大小。它实际上应该是sizeof(vertexData) * numFaces * 8 * 3,因为每个面应该有 3 个顶点,每个顶点有 8 个浮点值(3V、2T 和 3N)。使用后者可以使更多的面可见,尽管对于立方体来说不是。另外,我已将索引类型更改为 uint。
    • 是的,是的......我很快就写了这个答案,但有一些错误:) 希望这会有所帮助
    • 当然有帮助。它帮助我重新审视事物。感谢您的帮助。
    【解决方案2】:

    我认为您的问题是您将 GL_LINES 传递给 glDrawElements() 而不是 GL_TRIANGLES。

    【讨论】:

    • 没有。实际上,当通过 GL_TRIANGLES 时,屏幕上什么也没有出现。当我注意到通过 GL_LINES 至少会出现“某些东西”时,我只是受够了并随机进行调整。 (理想情况下,整体形状应该是一样的,我认为)
    • 不,形状会完全不同,因为 GL_LINES 每条线需要两个顶点,而 GL_TRIANGLES 每个多边形需要三个顶点。
    • 好的。我不知道。这意味着当我使用 GL_TRIANGLES 时,屏幕上没有任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多