我对分派剔除计算着色器任务的最佳方法感兴趣。这将适用于任何类型的BVH,例如四叉树,八叉树或Kd树,它们存储节点的层次结构,其中子节点在空间中包含在其父节点中。
我对如何做到这一点有一些想法,但我对其中任何一个都不是特别满意:
1)为节点总数产生许多作业,然后在父母最终看不到的节点上提前返回。但是,这并不能保证子节点在父节点计算出可见性之前不会执行,而且我不确定如何正确地同步它。
2)仅调度根节点,然后如果可见,将其子节点添加到UAV。只要UAV中有剩余节点,这个着色器就会重复(并扩展到更多线程)。我不确定如何实际执行此操作,或者即使DX11计算可以实现这一点。
3)每层节点的呼叫调度,具有该层中的最大节点数(在Oct-tree中,这将是1,8,64,512,4096等)。这似乎非常浪费,但它允许可见性通信,以便各个节点可以根据其父母的可见性(或者如果它们实际上不存在)提前退出。
4)完全抛弃层次剔除,只为每个单独的对象派遣一份工作。这对于我多年的淘汰似乎都是违反直觉的,但它肯定是最直接和可并行化的。
我是否正确地考虑过这个问题?任何关于这样做的好方法的见解都会非常有用!