读取/写入缓冲区末尾

问题描述 投票:0回答:1

在 hlsl 着色器中读取和写出缓冲区末尾时会发生什么?

根据我的经验,写入结尾似乎是一个空操作,而读取总是返回零。

这是未定义的行为吗?期待上述结果,我应该这样做吗?

资源是非类型化还是类型化重要吗?

RWBuffer<uint> // typed
RWStructuredBuffer<uint> // untyped
shader directx hlsl
1个回答
0
投票

https://computergraphics.stackexchange.com/questions/13082/does-rwstructuredbuffer-have-built-in-overflow-protection-in-hlsl

使用 D3D11 您应该是安全的:Direct3D 保证对于越界访问的任何资源返回零。同样,越界写入应被忽略。也就是说,D3D12 (iirc) 不存在这种保证,因为无论如何,客户端都有责任管理那里的描述符和资源。

https://github.com/Microsoft/DirectX-Graphics-Samples/issues/144

您在根签名中使用根描述符还是描述符表? D3D12 引入了与根签名相关的复杂性。如果缓冲区由描述符表中的普通描述符描述,则应该获得 D3D11 行为(返回 0),但如果使用根描述符,则会在越界时获得未定义的行为,因为根描述符不捕获边界信息.

Jesse 在这篇 gamedev.net 帖子中介绍了一些额外的细节

© www.soinside.com 2019 - 2024. All rights reserved.