代码之家  ›  专栏  ›  技术社区  ›  Stefan Monov

如果我有一个uint32(R32)纹理,并且我在一个着色器中对其进行采样/提取,会发生什么?

  •  2
  • Stefan Monov  · 技术社区  · 8 年前

    注:我区分 sample fetch 在标题中,因为在我的测试中,这两种行为似乎有所不同。

    可能的答案:

    • [0..2^32]范围缩小到[0..1](我认为OpenGL是这样工作的)
    • 其他的?
    2 回复  |  直到 8 年前
        1
  •  2
  •   Stefan Monov    8 年前

    我用renderdoc做了个测试。

    Texture2D<uint> ,和 fetch 函数只返回一个uint而不是float4。

        2
  •  0
  •   mrvux    8 年前

    如果你这样做了:

    uint value = texture.Load(pixelLocation);
    

    如果你这样做了:

    float value = texture.Load(pixelLocation);
    

    它将执行转换(潜在的精度问题)

    如果您尝试采样,它将执行其他操作,因为通常不允许对uint格式进行采样(可能会从错误的值变为驱动程序崩溃)。

    案例1(缩小范围):不适用于R32,仅适用于R16或R8 在这种情况下,需要使用DXGI_FORMAT_R16_UNORM而不是UINT作为着色器视图(或纹理格式)。当然,在这种情况下,示例是有效的。