我有一个使用两个计算着色器的应用程序。Shader #1
生成数据x
并将其存储在 中A
,绑定为附加缓冲区。Shader #2
在所有x
from上运行A
,绑定为消耗缓冲区。我想通过添加来扩展它Shader #3
,它在所有的x
in上运行A
,生成y
一个新的缓冲区B
- 但我仍然想像以前一样Shader #2
运行x
。
也就是说,我想对追加/使用缓冲区的所有元素运行操作,但不“消耗”它们。
如果我理解正确,消耗一个元素只会减少一个隐藏的计数器,所以我应该能够通过存储满时的计数来多次消耗一个缓冲区,并在从它消耗的着色器调用之间重置它。
问题是我的平台 - Unity - 只有一种方法 ( SetCounterValue()
) 需要我传入新的计数器值。也就是说,我需要在重新设置之前将计数器值获取到 CPU 内存,这将强制 GPU/CPU 之间进行同步并降低性能。
是否可以完全在 GPU 上设置消耗缓冲区的计数器值?
如果没有,是否可以在不使用消耗的情况下迭代消耗缓冲区?
(我想到只是将缓冲区绑定为常规 UAV 资源并以这种方式进行迭代,但文档对于是否支持这一点模棱两可。例如,“这些资源不使用资源变量。”请参阅资源本身,还是观点?)