首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectCompute:如何从RWTexture2D<float4>中读取?

DirectCompute:如何从RWTexture2D<float4>中读取?
EN

Stack Overflow用户
提问于 2019-09-05 14:29:23
回答 1查看 3.1K关注 0票数 1

我有以下缓冲区:

代码语言:javascript
复制
RWTexture2D<float4> Output : register(u0);

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

代码语言:javascript
复制
Output[XY] = SomeFunctionReturningFloat4(SomeArgument);

这是非常好的工作,我的计算图像被正确地呈现在屏幕上。

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

代码语言:javascript
复制
Output[XY] = SomeOtherFunctionReturningFloat4(Output[XY]);

编译器返回一个错误:

代码语言:javascript
复制
error X3676: typed UAV loads are only allowed for single-component 32-bit element types

感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-09 06:13:34

在Compute Shaders中,数据访问仅限于某些数据类型,并且根本不直观和直接。在您的示例中,您使用的是DXGI_FORMAT_R32G32B32A32_FLOAT格式的无人机类型的RWTexture2D<float4>。这种形式只有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>写你的值,Texture2D<float4>从3.使用RWStructuredBuffer代替纹理。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57799570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档