首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可能使用多个VertexBuffers为位置绘制模型

可能使用多个VertexBuffers为位置绘制模型
EN

Stack Overflow用户
提问于 2011-05-19 11:45:06
回答 3查看 1K关注 0票数 0

(我决定尝试用一种不同的方式来问这个问题,以可能推动如何做到这一点)

仅使用清单9-4作为OpenGL ES的苹果iOS指南"OpenGL ES Programming guide for iOS“的”使用顶点数据的最佳实践“的基础。

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

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

有没有办法做到这一点?显示的是我想要做的例子,给一个视觉。

代码语言:javascript
复制
    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);
    }
EN

回答 3

Stack Overflow用户

发布于 2011-05-19 12:11:27

听起来你想要glDrawElementsInstanced

票数 0
EN

Stack Overflow用户

发布于 2011-05-19 16:09:27

Rotoglup对我的问题的回答here可能会有所帮助,特别是关于实例化技术的this link

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

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

票数 0
EN

Stack Overflow用户

发布于 2011-05-19 17:38:57

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

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

如果你的所有场景都是静态的(只有摄像机在移动),你可以构建一个巨大的VBO (就像你在glGenBuffers中做的那样),把你所有的数据放在里面,然后用不同的矩阵调用它4次。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6053506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档