假设我想使用 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/