【问题标题】:DirectCompute: How to read from a RWTexture2D<float4>?DirectCompute:如何读取 RWTexture2D<float4>?
【发布时间】:2019-09-09 06:37:07
【问题描述】:

我有以下缓冲区:

RWTexture2D<float4> Output : register(u0);

计算着色器使用此缓冲区来渲染计算图像。 要在该纹理中写入像素,我只需使用类似于以下的代码:

Output[XY] = SomeFunctionReturningFloat4(SomeArgument);

这很好用,我的计算图像正确地呈现在屏幕上。

现在在计算着色器的某个阶段,我想回读一个 已经计算的像素并再次处理它。

Output[XY] = SomeOtherFunctionReturningFloat4(Output[XY]);

编译器返回错误:

error X3676: typed UAV loads are only allowed for single-component 32-bit element types

任何帮助表示赞赏。

【问题讨论】:

    标签: directx hlsl directcompute


    【解决方案1】:

    在计算着色器中,数据访问受限于某些数据类型,而且完全不直观和直接。在您的情况下,您使用 RWTexture2D&lt;float4&gt; 那是一个类型为DXGI_FORMAT_R32G32B32A32_FLOAT 格式的无人机。 此格式仅支持UAV typed store,但不支持UAV typed load。 基本上,你只能在上面写,不能读。 UAV typed load 仅支持 32 位格式,在您的情况下为 DXGI_FORMAT_R32_FLOAT,它只能包含单个组件(32 位仅此而已)。

    如果您使用RWTexture2D&lt;float&gt;,您的代码应该可以运行,但我想这对您来说还不够。 我想到的可能的解决方法是: 1.使用4个不同的RWTexture2D&lt;float&gt;,每个组件一个 2. 使用 2 种不同的纹理,RWTexture2D&lt;float4&gt; 写入您的值,Texture2D&lt;float4&gt; 读取 3. 使用RWStructuredBuffer而不是纹理。

    我不知道您的代码,所以我不知道解决方案 1. 和 2. 是否可行。但是,我强烈建议选择 3. 并使用 StructuredBuffer。 RWStructuredBuffer 可以容纳任何类型的struct,并且可以轻松满足您的所有需求。老实说,在计算着色器中,我几乎只使用它们来传递数据。如果您需要最终输出为纹理,则可以在缓冲区上进行所有计算,然后在完成后将结果复制到纹理上。我要补充一点,驱动程序经常使用 CompletePath 来访问 RWTexture2D 数据,并使用 FastPath 来访问 RWStructuredBuffer 数据,这使得前者比后者慢得多。

    数据类型访问的参考是here。向下滚动至UAV typed load

    【讨论】:

    • 我知道我的设计需要多一层。我正在为工业射线照相编写和图像处理应用程序(16 位灰度图像有时非常大(每张图像 250MB 并不少见)。
    • 我的软件目前使用一个 ByteAddressBuffer 来存储原始的每像素 16 位灰度图像,然后使用两个 RWByteAddressBuffer(每像素 32 位)以触发器方式存储处理后的图像,最后一个 RWTexture2D 用于渲染。处理的最后阶段是渲染图像。
    • 但是几个着色器可能会在最终纹理上创建附加层,这就是为什么我需要读回值以将附加层与现有层结合起来(例如文本层的透明度)。我想避免更多的缓冲区,消耗显卡上的内存并消耗 GPU,因为这是一个额外的步骤。
    • 为什么使用 RWByteAddressBuffer 而不是结构化缓冲区?恕我直言,它们更容易使用……我不知道它是否适合您的项目,但您可能希望在片段着色器而不是计算着色器中组合各个层……..
    • 我正在使用 RWByteAddressBuffer - 它实际上是一个 32 位整数数组 - 因为我每个像素只有一个元素:灰度级。使用具有单个成员的结构化缓冲区有什么优势?
    猜你喜欢
    • 2021-07-04
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2013-11-02
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    相关资源
    最近更新 更多