注意:我将标题中的sample
与fetch
区分开来,因为在我的测试中,两者之间的这种行为似乎有所不同。
可能的答案:
- [0..2^32] 范围缩小到 [0..1](我认为 OpenGL 是这样工作的(
- uint32 被转换为 float32(顺便说一下,这意味着会丢失一些精度(。
- 其他?
我用renderdoc做了一个测试。
当使用 fetch 时,纹理是用Texture2D<uint>
定义的,fetch
函数只是返回一个 uint 而不是 float4。
我假设您的纹理/视图格式是R32_UINT。
如果您这样做:
uint value = texture.Load(pixelLocation);
它将返回你 uint(完全相同的值(
如果您这样做:
float value = texture.Load(pixelLocation);
它将执行强制转换(潜在的精度问题(
如果您尝试采样,它将执行其他操作,因为通常不允许以 uint 格式采样(可能会从错误的值到驱动程序崩溃(。
情况 1(缩小范围(:不适用于 R32,仅适用于 R16 或 R8 在这种情况下,您需要使用 DXGI_FORMAT_R16_UNORM 而不是 UINT 作为着色器视图(或纹理格式(。在这种情况下,示例当然有效。