连续的glDrawArraysIndirect调用
Successive glDrawArraysIndirect calls
假设我想用glDrawArraysIndirect
启动一个着色器程序,所以我有一个缓冲区,它在开始时包含顶点计数,然后是命令的其他数据。该缓冲区作为原子计数器缓冲区绑定到同一着色器程序,并且顶点着色器正在按某种规则减少顶点计数。如果顶点计数最后不是0
,则应重新启动着色器程序。这样做直到顶点计数为0
。
但是,知道该项目是否需要重新启动的最佳方法是什么?是否可以在不读回数据(顶点计数)的情况下完全做到这一点?如果没有,最有效的读回数据的方法是什么?我目前正在循环中运行着色器程序,迭代次数固定,可以保证将顶点数减少到0
,但使用这种方法,我会浪费时间来调用0
顶点(每个顶点约3ms),还是这仍然比读回数据更好?我有10个绘制调用,通常在第3到第6个绘制调用时顶点计数为0
。
任何CPU读回操作都不太可能比把这些东西留在GPU上更快。这是因为它将不得不引发完全的GPU/CPU同步,这将扼杀流水线和异步执行的任何希望。
当你还没有说出你在做什么的时候,很难说做你正在做的事情的有效方法是什么。例如,开发一个唯一的工作就是计算每个渲染命令需要多少次迭代的计算着色器是否合理?如果是这样,那么CS调用就可以构建一系列间接渲染命令,这些命令可以通过glMultiDrawIndirect
一次性调度。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- OpenGL -- 多个 glDrawArrays() 调用仅显示第一个的结果
- 调用glDrawArrays后出现SegFault
- glDrawArrays 之间的 glBufferSubData 调用 mangling data
- 调用glDrawArrays时发生访问冲突错误
- OpenGL VBO在调用glDrawArrays()时出现分段错误