c++ - 连续的 glDrawArraysIndirect 调用

标签 c++ opengl

假设我想使用 glDrawArraysIndirect 启动一个着色器程序,因此我有一个缓冲区,其中在开始处包含顶点计数,后面是该命令的其他数据。该缓冲区作为原子计数器缓冲区绑定(bind)到同一着色器程序,并且顶点着色器按某种规则减少顶点计数。如果最后顶点数不是0,则应重新启动着色器程序。因此,直到顶点数为 0 为止。

但是了解程序是否需要重新启动的最佳方法是什么?是否可以在不读回数据(顶点数)的情况下完全做到这一点?如果不是,读回数据最有效的方法是什么?我目前正在循环中以固定的迭代次数运行着色器程序,保证将顶点计数减少到 0,但通过这种方法,我浪费了绘制调用的时间0 个顶点(每个顶点大约 3ms),或者这仍然比读回数据更好吗?我有 10 次绘制调用,通常在第 3 - 6 次绘制调用时顶点计数为 0

最佳答案

任何 CPU 读回操作都不可能比将这些内容留在 GPU 上更快。这是因为它必须引发完全的 GPU/CPU 同步,这将扼杀管道和异步执行的任何希望。

当你没有说出你正在做的事情到底是什么时,很难说什么是做你正在做的事情的有效方法。例如,开发一个计算着色器,其唯一的工作是计算每个渲染命令需要多少次迭代,是否合理?如果是这样,那么 CS 调用就可以构建一系列间接渲染命令,这些命令可以通过 glMultiDrawIndirect 一次性分派(dispatch)。

关于c++ - 连续的 glDrawArraysIndirect 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41539269/

相关文章:

c++ - 我应该包括每个标题吗?

c++ - 轻量级可移植 C++ 线程

c++ - 如何渲染拉伸(stretch)到全屏原始分辨率的低分辨率场景?

windows - glFlush() 在具有透明背景的窗口上需要很长时间

c++ - 从 C++ 中的外部程序捕获 stderr 和 stdout

c++ - 我可以在 Qt 中的 QListView 中添加列吗?

opengl - PyOpenGL headless (headless)渲染

c++ - 使用 RGB 源和 RGBA 叠加实现近乎实时的 CPU 功能,如 glAlphaFunc(GL_GREATER)

c++ - 使用抽象函数时出现未处理的异常

c++ - 如何将字符串写入 .csv 文件?