0

(我决定尝试以不同的方式提出这个问题,以可能推进如何做到这一点)

仅使用清单 9-4 作为 Apples iOS OpenGL ES 指南、“OpenGL ES Programming Guide for iOS”的“使用顶点数据的最佳实践”的基础

我想基本上“添加”位置日期到这个缓冲区。(可以以某种方式完成吗?)

然后在使用 glDrawElements 时调用哪个标识符...

有没有办法做到这一点?显示的是我想要提供视觉效果的示例。

    typedef struct VertexData3D
    {
        GLfloat position[3];
        GLfloat normal[3];
    } VertexData3D;

    GLuint    test1Buffer;
    GLuint    test2Buffer;
    GLuint    index1Buffer;
    GLuint    index2Buffer;

    const VertexData3D test1Buffer[] = {...};
    const VertexData3D test2Buffer[] = {...};
    const GLushort indices1[] = {...};
    const GLushort indices2[] = {...};

    void CreateBuffers()
    {
    // Static position data
        glGenBuffers(1, &test1Buffer);
        glBindBuffer(GL_ARRAY_BUFFER, test1Buffer);
        glBufferData(GL_ARRAY_BUFFER, sizeof(test1VertexData), test1VertexData, GL_STATIC_DRAW);

        glGenBuffers(1, &test2Buffer);
        glBindBuffer(GL_ARRAY_BUFFER, test2Buffer);
        glBufferData(GL_ARRAY_BUFFER, sizeof(test2VertexData), test2VertexData, GL_STATIC_DRAW);

    // Static index data
        glGenBuffers(1, &index1Buffer);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index1Buffer);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices1), indices1, GL_STATIC_DRAW);

        glGenBuffers(1, &index2Buffer);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index2Buffer);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices2), indices2, GL_STATIC_DRAW);

    glVertexPointer(3, GL_FLOAT, sizeof(VertexData3D), (void*)0);
    glNormalPointer(GL_FLOAT, sizeof(VertexData3D), (void*)12);
    }

// sometimes in the model,  draw out this test1model.
    void DrawModelusingTest1()
    {
    glBindBuffer(GL_ARRAY_BUFFER, test1VertexData);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index1Buffer);

        glDrawElements(GL_TRIANGLES, theNumberInIndex1, GL_UNSIGNED_SHORT, (void*)0);
    }

// sometimes in the model,  draw out this test2model.
   void DrawModelusingTest2()
    {
    glBindBuffer(GL_ARRAY_BUFFER, test2VertexData);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index2Buffer);

        glDrawElements(GL_TRIANGLES, theNumberInIndex2, GL_UNSIGNED_SHORT, (void*)0);
    }
4

3 回答 3

0

Rotoglup 对我的问题的回答可能会有所帮助,特别是有关实例化技术的链接。

我只是在技术列表中添加使用glVertexAttribDivisor 来传递每个实例(而不是每个顶点)属性,而不是使用统一缓冲区。

基本上,您使用一个 VBO 来保存几何图形,而另一个 VBO 来保存每个实例的所有模型视图矩阵。然后,您使用 glVertexAttribDivisor 指示模型视图 VBO 应该在每个实例中高级一次,并调用glDrawElementsInstanced一次以绘制所有对象。

于 2011-05-19T08:09:26.763 回答
0

首先,你的 3D 网格看起来真的是静态的,没有必要在每一帧都调用 glGenBuffers。在初始化时每个网格执行一次。

for (int i = 0; i < numOfShapes; i++)对我来说毫无意义。你绑定了大量的缓冲区,并glDrawElements在循环之后调用,这意味着除非我遗漏了什么,否则只有最后一个 glBindBuffers 真正做某事。

如果您的所有场景都是静态的(只有相机移动),您可以构建一个巨大的 VBO(就像您使用 glGenBuffers 所做的那样),将所有数据放入其中,并使用不同的矩阵调用 4 次。

如果有任何东西是动态的并且你所有的形状都是相似的,那么看看 Ben Voigt 建议的实例化;但只是避免重建每一帧应该已经提高你的fps的一切。

PS我没有时间完全阅读你的代码,但如果你每次只有一个对象重复,我希望你只有一个vbo,多个glDrawArrays调用同一个VBO ...

于 2011-05-19T09:38:56.760 回答
0

听起来你想要glDrawElementsInstanced

于 2011-05-19T04:11:26.887 回答