连续的glDrawArraysIndirect调用

时间:2017-01-09 00:01:21

标签: c++ opengl

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

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

1 个答案:

答案 0 :(得分:3)

任何CPU回读操作都不太可能比将这些东西留在GPU上更快。这是因为它必须激发完整的GPU / CPU同步,这将消除流水线和异步执行的任何希望。

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