Directx DirectCompute:如何从RWTexture2D读取<;浮动4>;?

Directx DirectCompute:如何从RWTexture2D读取<;浮动4>;?,directx,hlsl,directcompute,Directx,Hlsl,Directcompute,我有以下缓冲区: RWTexture2D<float4> Output : register(u0); 这工作得很好,我的计算图像正确地呈现在屏幕上 现在在计算着色器的某个阶段,我想读回 已计算像素并再次处理 Output[XY] = SomeOtherFunctionReturningFloat4(Output[XY]); 编译器返回一个错误: error X3676: typed UAV loads are only allowed for single-component

我有以下缓冲区:

RWTexture2D<float4> Output : register(u0);
这工作得很好,我的计算图像正确地呈现在屏幕上

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

Output[XY] = SomeOtherFunctionReturningFloat4(Output[XY]);
编译器返回一个错误:

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

非常感谢您的帮助。

在计算着色器中,数据访问仅限于某些数据类型,完全不直观和直接。在您的情况下,您使用
rwd
这是一种无人机类型的
DXGI\u格式\u r32g32b32a2a32\u浮点数
格式。 此表单仅支持
无人机类型存储
,但
无人机类型加载
不支持此表单。 基本上,你只能在上面写,不能读
UAV类型加载
仅支持32位格式,在您的情况下,DXGI_FORMAT_R32_FLOAT,该格式只能包含单个组件(32位,仅此而已)

如果您使用
RWTexture2D
,您的代码应该运行,但我认为这对您来说还不够。 我想到的可能解决办法是: 1.使用4个不同的
RWTexture2D
,每个组件一个 2.使用两种不同的纹理,
RWTexture2D
写入值,并使用
Texture2D
读取 3.使用
RWStructuredBuffer
代替纹理

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


数据类型访问的引用为。向下滚动至
UAV-typed-load

我知道我的设计还需要一层。我正在编写工业射线照相的图像处理应用程序(16位灰度图像有时非常大(每幅图像250MB并不少见)。我的软件目前使用ByteAddressBuffer来存储原始的每像素16位灰度图像,然后使用两个RWByteAddressBuffer(每像素32位)以触发器方式存储处理后的图像,最后存储用于渲染的RWTexture2D。处理的最后一个阶段是渲染图像。但是几个着色器可能会在最终纹理上创建附加层,这就是为什么我需要读回值以将附加层与现有层(例如文本层的透明度)组合起来。我想避免增加一个缓冲区,消耗图形卡上的内存和GPU,因为这是一个额外的步骤。为什么要使用RWByteAddressBuffer而不是结构化缓冲区?它们更容易与IMHO一起使用…我不知道这是否是您项目的可行选项,但您可能希望在片段着色器中组合不同的层,而不是计算着色器…我使用的是RWByteAddressBuffer-实际上是一个32位整数数组-因为我每个像素只有一个元素:灰度。将结构化缓冲区与单个成员一起使用有什么好处?
error X3676: typed UAV loads are only allowed for single-component 32-bit element types