Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 连续glDrawArraysIndirect调用_C++_Opengl - Fatal编程技术网

C++ 连续glDrawArraysIndirect调用

C++ 连续glDrawArraysIndirect调用,c++,opengl,C++,Opengl,假设我想用glDrawArraysIndirect启动一个着色器程序,因此我有一个缓冲区,它在开始时包含顶点计数,然后是命令的其他数据。该缓冲区作为原子计数器缓冲区绑定到同一着色器程序,顶点着色器通过某种规则减少顶点计数。如果顶点计数最后不是0,则应重新启动着色器程序。这样做直到顶点计数0 但是,了解该计划是否需要重新启动的最佳方式是什么?是否可以在不读回数据(顶点计数)的情况下完全执行此操作?如果没有,什么是最有效的读回数据的方法?我目前在循环中运行着色器程序,迭代次数固定,可以保证将顶点计数

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


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

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


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

“每次大约3ms”GPU时间或CPU时间一次发送?我也很想知道您在那里做什么。我觉得你把事情搞得太复杂了。@Nicol Bolas GPU time,我用定时器查询来测量它。@thokra我给出的例子非常简单,实际上着色器正在构建一个稀疏体素八叉树,顶点计数告诉树中还有多少体素要插入,因为多个体素可以尝试细分同一个八叉树节点,只有一个正在细分,其他体素设置在“等待列表”上,该列表在稍后的过程中执行,以避免在一个过程中等待pass@NicoleBolas我不知道glMultiDrawArraysIndirect是怎么工作的,但是,如果命令是按顺序执行的,则可以在一个过程中更改下一个过程的命令。这并不能解决删除空调用的问题,但是CPU端的间接draw调用会更少,所以这可能是最好的方法。但是,如果命令是并行执行的,但不起作用,那么一个过程取决于前一个过程,否则甚至不需要启动多个过程。