我对ID3D12GraphicsCommandList::SetGraphicsRootSignature
方法的存在感到有些困惑。根据我对this MSDN page的理解,它似乎唯一有效的用法是始终在SetPipelineState
之后调用它,赋予它与创建管道状态对象时提供的相同的根签名。如果是这样的话,它有什么好处呢?还有其他方法可以使用这种方法吗?
答案 0 :(得分:3)
这是CPU优化,在内部可以准备从根签名槽到实际绑定的部分映射。如果您在不同的管道状态对象之间共享根签名,则每个根签名可以执行一次此工作,而不是每个管道状态对象执行一次。
您可能不会经常which vim
致电/usr/bin/vim
。这就是原因。
答案 1 :(得分:1)
" root签名"在DirectX 12中提供了用于在CPU数据结构和GPU着色器语言执行之间共享数据的公共布局信息。 DirectX 12使程序员决定他们想要使用多少根签名,何时使用它们,以及哪些管道状态对象需要哪个根签名。在Direct3D 11中,基本上只有一个" root签名"在所有时间都非常活跃。
根签名可以经常更改而不会受到重大损失,但假设您将拥有一些根签名和许多PSO而不是1:1的对应关系。
为简单起见DirectX Tool Kit for DirectX 12,我们每次在
IEffect::Apply
方法中设置PSO时都会设置根签名,即使我们只使用了几个不同的根签名。
答案 2 :(得分:0)
@Chuck Walbourn
“根签名可以相当频繁地更改而不会造成重大损失”
https://developer.nvidia.com/dx12-dos-and-donts#roots