首页>Game>source

因此,我正在为引擎制作3D批处理渲染器,基本概念是我们制作足够大的VBO和IBO来容纳所有顶点数据(位置,法线,uv等),并使用 glMapBuffer更新VBO 或使用 glbuffersubdata 每帧,如果我们要进行任何更改,但是在这种情况下,IBO(索引缓冲区)的模式是预定义的(即,假设我们有四边形,并为整个IBO大小填充012230),但是在使用3D模型时, IBO数据不会是不同的情况,那么如果实例化一个新模型或假设我正在生成UV球并想要更改其细分,该如何更改IBO数据?

我不知道在使用VAO,VBO和索引缓冲区时如何处理动态变化(不需要频繁)的索引数据。

根据OpenGL 4.5核心配置文件,不支持从客户端内存读取(§10.3.10OpenGL 4.5核心规范):

DrawElementsDrawRangeElementsDrawElementsInstanced 从其名称绑定到的缓冲区对象中获取其索引 ELEMENT_ARRAY_BUFFER ,使用它们的indices参数作为到缓冲区对象的偏移量,其方式与10.3.9节中所述相同. [...]如果零绑定到 ELEMENT_ARRAY_BUFFER ,这些绘制命令的结果是不确定的。

所以我们不能使用glMapBuffer或glBufferSubData映射ELEMENT_ARRAy_BUFFER(或者可以吗?),以及 glDrawElements 确实接受了指向索引数据的指针,但是只有当我们不使用VAO和VBO时,如果使用它们,它将最后一个参数作为当前绑定的ELEMENT_ARRAy_BUFFER中的指针偏移量。

So what's the best way to deal with dynamic indices?

最新回答
  • 2021-1-2
    1 #

    这是如何将数据上传到GPU的想法:

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vboID);
    void *vbo = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
    memcpy(vbo, indices, byteSize);
    glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
    

  • Unity:Unity-从GameObject获取按钮功能
  • 3d meshes:Unity网格仅渲染一组三角形