当我有一个 uint32 (R32) 纹理并在着色器中从中采样/获取时会发生什么?



注意:我将标题中的samplefetch区分开来,因为在我的测试中,两者之间的这种行为似乎有所不同。

可能的答案:

  • [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 作为着色器视图(或纹理格式(。在这种情况下,示例当然有效。

相关内容

  • 没有找到相关文章