【问题标题】:What is the best way to draw multiple VAO Using the same shader but not having the same texture or colors使用相同的着色器但没有相同的纹理或颜色绘制多个 VAO 的最佳方法是什么
【发布时间】:2020-01-04 23:42:44
【问题描述】:

我想知道如果我想画画最好做什么 超过 6000 种不同的 VAO 使用相同的着色器。

目前我绑定我的着色器,然后给它所有需要的信息(统一),然后循环通过每个 VAO 来绑定和绘制它们。

此代码使我的计算机以 200 fps 而不是 3000 或 4000 的速度下降。 根据 https://learnopengl.com/Advanced-OpenGL/Instancing 的说法,使用 glDrawElementsInstanced 可以让我处理大量相同的 VAO,但由于我有大约 6000 个不同的 VAO,我似乎无法使用它。

有人可以确认一下吗?你们会怎么做才能绘制这么多 VAO 并尽可能节省性能?

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    第 1 步:不要有 6,000 个不同的 VAO。

    毫无疑问,您将每个 VAO 视为一个单独的网格。别这样了。相反,您应该将每个 VAO 视为单独的顶点格式。也就是说,如果您要传递不同的种类顶点数据,您只需要一个新的 VAO。属性个数和每个属性的格式构成格式信息。

    理想情况下,您只需要 4 到 10 组单独的顶点格式。鉴于您在多个 VAO 上使用相同的着色器,您可能已经对此有所了解。

    那么,如何为多个网格使用相同的 VAO?理想情况下,您可以通过将特定类型的网格(即:顶点格式)的所有网格数据放在同一个缓冲区对象中来做到这一点。您可以通过 glDrawElementsBaseVertex 的 baseVertex 参数之类的技巧来选择要为特定渲染操作检索哪些数据,或者只需为特定的绘制命令选择要从哪个索引数据范围进行绘制。其他替代方案包括多重绘制系列渲染函数。

    如果由于某种原因您不能将所有数据放在同一个缓冲区中,那么您应该adopt the glVertexAttribFormat style of VAO usage。这样,您可以使用glVertexAttribFormat 调用设置您的顶点格式数据,并且您可以根据需要使用glBindVertexBuffers 更改缓冲区,而无需触及顶点格式本身。众所周知,这比更改 VAO 更快。

    老实说,无论如何你都应该采用glVertexAttribFormat,因为它是一个更好的API,不像glVertexAttribPointer 和它的同类那样愚蠢。

    【讨论】:

    • 感谢 Nicol,但回顾一下:由于我所有的数据都具有相同的顶点格式,我应该只使用一个 VAO。为此,我必须将所有数据放入一个缓冲区。设置“如何读取它(使用 glVertexAttribPointer ?)”,然后当我想绘制其中一个时,使用 glDrawElementsBaseVertex 选择我想要绘制的数据部分。
    【解决方案2】:

    glDrawElementsInstanced 可以让我处理大量相同的 VAO,但由于我有大约 6000 个不同的 VAO,我似乎无法使用它。

    所以你应该做的是将你的对象组合到同一个 VAO 中。然后使用glMultiDrawArraysIndirectglMultiDrawElementsIndirect 从同一个VAO 中抽取所有不同的对象。这个答案demonstrates how to do this

    为了处理不同的纹理,您可以构建纹理图集,将纹理打包到纹理数组中,或者使用GL_ARB_bindless_texture 扩展(如果可用)。

    【讨论】:

    • 谢谢,这是个好主意,但这意味着我不能以不同的方式绘制我的一个 VAO(比如在 GL_LINES_LOOP 中绘制所有内容,但在 GL_DRAW 中只绘制一个)而不将其包含到另一个 VAO 中。我想这并不重要
    • @Xemuth 什么是 GL_DRAW?例如,如果您想将 GL_LINES 与 GL_TRIANGLES 结合起来,那么是的,在普通 OpenGL 中,没有办法在一次调用中结合不同类型的图元。
    猜你喜欢
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多