在 hlsl 着色器中读取和写出缓冲区末尾时会发生什么?
根据我的经验,写入结尾似乎是一个空操作,而读取总是返回零。
这是未定义的行为吗?期待上述结果,我应该这样做吗?
资源是非类型化还是类型化重要吗?
RWBuffer<uint> // typed
RWStructuredBuffer<uint> // untyped
使用 D3D11 您应该是安全的:Direct3D 保证对于越界访问的任何资源返回零。同样,越界写入应被忽略。也就是说,D3D12 (iirc) 不存在这种保证,因为无论如何,客户端都有责任管理那里的描述符和资源。
https://github.com/Microsoft/DirectX-Graphics-Samples/issues/144
您在根签名中使用根描述符还是描述符表? D3D12 引入了与根签名相关的复杂性。如果缓冲区由描述符表中的普通描述符描述,则应该获得 D3D11 行为(返回 0),但如果使用根描述符,则会在越界时获得未定义的行为,因为根描述符不捕获边界信息.
Jesse 在这篇 gamedev.net 帖子中介绍了一些额外的细节