gpt4 book ai didi

directx - DirectCompute:如何读取 RWTexture2D

转载 作者:行者123 更新时间:2023-12-02 19:52:37 26 4
gpt4 key购买 nike

我有以下缓冲区:

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

感谢任何帮助。

最佳答案

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

如果您使用RWTexture2D<float>,您的代码应该运行但我想这对你来说还不够。我想到的可能的解决方法是:1.使用4个不同的RWTexture2D<float> , 每个组件一个2.使用2种不同的纹理,RWTexture2D<float4>写下您的值(value)观和 Texture2D<float4>从中读取3. 使用RWStructuredBuffer而不是纹理。

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

数据类型访问的引用是 here 。向下滚动到UAV typed load .

关于directx - DirectCompute:如何读取 RWTexture2D<float4>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57799570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com