连续的glDrawArraysIndirect调用

Successive glDrawArraysIndirect calls

本文关键字:调用 glDrawArraysIndirect 连续      更新时间:2023-10-16

假设我想用glDrawArraysIndirect启动一个着色器程序,所以我有一个缓冲区,它在开始时包含顶点计数,然后是命令的其他数据。该缓冲区作为原子计数器缓冲区绑定到同一着色器程序,并且顶点着色器正在按某种规则减少顶点计数。如果顶点计数最后不是0,则应重新启动着色器程序。这样做直到顶点计数为0

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

任何CPU读回操作都不太可能比把这些东西留在GPU上更快。这是因为它将不得不引发完全的GPU/CPU同步,这将扼杀流水线和异步执行的任何希望。

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