DirectCompute:如何读取 RWTexture2D<float4>?
DirectCompute: How to read from a RWTexture2D<float4>?
我有以下缓冲区:
RWTexture2D<float4> Output : register(u0);
此缓冲区由计算着色器用于渲染计算图像。
要在该纹理中写入一个像素,我只需使用类似于以下的代码:
Output[XY] = SomeFunctionReturningFloat4(SomeArgument);
效果很好,我计算的图像在屏幕上正确呈现。
现在在计算着色器的某个阶段,我想读回一个
已经计算的像素并再次处理它。
Output[XY] = SomeOtherFunctionReturningFloat4(Output[XY]);
编译器return出错:
error X3676: typed UAV loads are only allowed for single-component 32-bit element types
感谢任何帮助。
在计算着色器中,数据访问仅限于某些数据类型,一点也不直观和直接。在你的情况下,你使用
RWTexture2D<float4>
那是一架DXGI_FORMAT_R32G32B32A32_FLOAT
格式的无人机。
此格式仅支持 UAV typed store
,但不支持 UAV typed load
。
基本上,你只能在上面写,不能读。 UAV typed load
仅支持 32 位格式,在您的情况下 DXGI_FORMAT_R32_FLOAT
,它只能包含一个组件(32 位,仅此而已)。
如果您使用 RWTexture2D<float>
,您的代码应该 运行,但我想这对您来说还不够。
在我看来 spring 可能的解决方法是:
1. 使用 4 个不同的 RWTexture2D<float>
,每个组件一个
2. 使用 2 种不同的纹理,RWTexture2D<float4>
写入您的值,Texture2D<float4>
读取
3.使用RWStructuredBuffer
代替纹理。
我不知道你的代码,所以我不知道解决方案 1. 和 2. 是否可行。但是,我强烈建议选择 3. 并使用 StructuredBuffer。一个 RWStructuredBuffer
可以容纳任何类型的 struct
并且可以轻松满足您的所有需求。老实说,在计算着色器中,我几乎只用它们来传递数据。如果您需要最终输出为纹理,您可以在缓冲区上进行所有计算,然后在完成后将结果复制到纹理上。我想补充一点,驱动程序经常使用 CompletePath 访问 RWTexture2D 数据,并使用 FastPath 访问 RWStructuredBuffer 数据,使得前者比后者慢得多。
数据类型访问的引用是 here。向下滚动到 UAV typed load
。
我有以下缓冲区:
RWTexture2D<float4> Output : register(u0);
此缓冲区由计算着色器用于渲染计算图像。 要在该纹理中写入一个像素,我只需使用类似于以下的代码:
Output[XY] = SomeFunctionReturningFloat4(SomeArgument);
效果很好,我计算的图像在屏幕上正确呈现。
现在在计算着色器的某个阶段,我想读回一个 已经计算的像素并再次处理它。
Output[XY] = SomeOtherFunctionReturningFloat4(Output[XY]);
编译器return出错:
error X3676: typed UAV loads are only allowed for single-component 32-bit element types
感谢任何帮助。
在计算着色器中,数据访问仅限于某些数据类型,一点也不直观和直接。在你的情况下,你使用
RWTexture2D<float4>
那是一架DXGI_FORMAT_R32G32B32A32_FLOAT
格式的无人机。
此格式仅支持 UAV typed store
,但不支持 UAV typed load
。
基本上,你只能在上面写,不能读。 UAV typed load
仅支持 32 位格式,在您的情况下 DXGI_FORMAT_R32_FLOAT
,它只能包含一个组件(32 位,仅此而已)。
如果您使用 RWTexture2D<float>
,您的代码应该 运行,但我想这对您来说还不够。
在我看来 spring 可能的解决方法是:
1. 使用 4 个不同的 RWTexture2D<float>
,每个组件一个
2. 使用 2 种不同的纹理,RWTexture2D<float4>
写入您的值,Texture2D<float4>
读取
3.使用RWStructuredBuffer
代替纹理。
我不知道你的代码,所以我不知道解决方案 1. 和 2. 是否可行。但是,我强烈建议选择 3. 并使用 StructuredBuffer。一个 RWStructuredBuffer
可以容纳任何类型的 struct
并且可以轻松满足您的所有需求。老实说,在计算着色器中,我几乎只用它们来传递数据。如果您需要最终输出为纹理,您可以在缓冲区上进行所有计算,然后在完成后将结果复制到纹理上。我想补充一点,驱动程序经常使用 CompletePath 访问 RWTexture2D 数据,并使用 FastPath 访问 RWStructuredBuffer 数据,使得前者比后者慢得多。
数据类型访问的引用是 here。向下滚动到 UAV typed load
。