假设我想用glDrawArraysIndirect
启动着色器程序,所以我有一个缓冲区,其中包含一个开头的顶点计数,后跟该命令的其他数据。该缓冲区作为原子计数器缓冲区绑定到同一个着色器程序,顶点着色器通过某种规则减少顶点计数。如果最后的顶点数不是0
,则应重新启动着色器程序。所以这样做直到顶点数为0
。
但了解程序是否需要重新启动的最佳方法是什么?是否可以在不读回数据(顶点数)的情况下完全执行此操作?如果没有,那么回读数据的最有效方法是什么?我目前正在循环中运行着色器程序,其循环次数固定,保证将顶点数减少到0
,但是使用这种方法我会浪费时间进行绘制调用{{1顶点(每个大约3ms),还是比读回数据更好?我有10个绘制调用,通常在第3到第6次绘制调用时顶点计数为0
。
答案 0 :(得分:3)
任何CPU回读操作都不太可能比将这些东西留在GPU上更快。这是因为它必须激发完整的GPU / CPU同步,这将消除流水线和异步执行的任何希望。
很难说当你没有说出你正在做什么的时候,做你正在做的事情的有效方法是什么。例如,开发一个计算着色器是否合理,其唯一的工作就是计算计算需要每个渲染命令的迭代次数?如果是这样,那么CS调用可以构建一系列间接渲染命令,可以通过glMultiDrawIndirect
一次性调度。