【问题标题】:In OpenGl do VBOs have to contain data with the same vertex layout?在 OpenGL 中,VBO 是否必须包含具有相同顶点布局的数据?
【发布时间】:2021-01-28 07:33:51
【问题描述】:

我以前有很多 VBO,但现在我将它们合并为一个,并根据我绘制的内容对其进行索引。问题是,当我将顶点加载到 VBO 并记录缓冲区中有多少字节时,它与 glDrawArrays 中的参数不匹配,其偏移参数是“第一”,而不是字节偏移。如果 VBO 中的所有顶点都是相同的布局,我应该做一个划分吗?例如,sizeof(Vertex) == 12 并且它被放置在 VBO 中字节偏移量 48 处,要绘制四个顶点我需要做 glDrawArrays(GL_TRIANGLE_STRIP, 48 / sizeof(Vertex), 4) ???

如果它是一个包含两种不同类型且布局不同的顶点的大缓冲区怎么办?由于缓冲区被释放为其他缓冲区腾出空间,并且它们被移动或调整大小,这应该如何完成?

为了设置我调用 glVertexAttribPointer 和 glEnableVertexArray 四五次的顶点,我试图避免在每次绘制调用时调用它们。

【问题讨论】:

    标签: opengl vbo


    【解决方案1】:

    如果顶点的格式发生了变化,那么这意味着(使用旧 API),您必须进行一些 glVertexAttribPointer 调用(可能作为您要绑定的新 VAO 的一部分) 以更改顶点数据的格式。无论哪种方式,调用此函数都使您有机会更改每个属性在缓冲区中开始的字节偏移量。

    因此,如果您的缓冲区在布局 1 中包含 256 个字节的数据,然后在布局 2 中包含 256 个字节的数据,那么您在设置布局 2 时作为字节偏移量提供的“指针”应该偏移 256:起始新顶点数据的偏移量。

    这样,您的 glDrawArrays 函数将为两个网格都采用 0 的索引,因为任何偏移都是顶点格式的一部分。

    仅供参考,glDrawArrays 的“第一个”参数是索引,而不是字节偏移量。

    我试图避免为每个绘图调用调用这些。

    如果您想避免这种情况,那么您需要按顶点格式对模型进行排序,以便为一种格式渲染所有模型,然后使用另一种格式渲染模型。布局更改并不便宜,所以如果性能很重要,请选择一小部分顶点格式并让您的网格符合它们。

    【讨论】:

    • 假设您在 VBO 中有一个缓冲区,并且您知道它的偏移量(以字节为单位),并且如果您知道顶点布局,那么进行除法比重置 glVertexAttrib 指针要好得多,不是吗?我的意思是从字节偏移到顶点索引“第一个”的除法
    • @Zebrafish:您的问题专门询问有两种不同的“布局”。根据定义,这意味着您必须再次调用 glVertexAttribPointer 或绑定新的 VAO。
    猜你喜欢
    • 2023-03-05
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2012-05-27
    • 1970-01-01
    • 2021-03-05
    • 2011-07-26
    相关资源
    最近更新 更多