- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下缓冲区:
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/
在计算着色器(使用 Unity)中,我有一个光线转换寻找与网格三角形的交点。在某些时候,我想返回找到了多少个交叉点。 我可以通过标记像素清楚地看到有多少个交叉点,但是如果我只是为计算着色器中的每个交叉
我正在寻找 OpenCL 之间的比较和 DirectCompute ,但我还没有发现任何东西。 OpenCL 的跨平台优势和支持更广泛的 GPU 对我来说并不重要。我只适合在 Windows 上针对
我正在学习 DirectCompute,并且一直在使用 StructuredBufferes。事情是我了解到,要向着色器提供数据,我需要使用 View - SRV 或 UAV,具体取决于我想要实现的目
我尝试在计算着色器中实现自旋锁。但是我的实现似乎没有锁定任何东西。 下面是我如何实现自旋锁: void LockAcquire() { uint Value = 1; [allow_u
我最近一直在使用计算着色器,我正在尝试确定设置 [numthreads(x,y,z)] 和调度调用的最佳方法。我的演示窗口是 800x600,我每像素启动 1 个线程。我正在执行 2D 纹理修改 -
我有以下缓冲区: RWTexture2D Output : register(u0); 计算着色器使用此缓冲区来渲染计算图像。要在该纹理中写入像素,我只需使用与此类似的代码: Output[XY] =
我有以下缓冲区: RWTexture2D Output : register(u0); 计算着色器使用此缓冲区来渲染计算图像。要在该纹理中写入像素,我只需使用与此类似的代码: Output[XY] =
我正在尝试在 GPU 内存中创建缓冲区以从 CPU 上传数据。 GPU 访问将是只读的。数据将用作计算着色器的输入缓冲区。 CreateBuffer() 失败并出现错误 0x80070057 (E_I
我有一些(财务)任务应该很好地映射到 GPU 计算,但我不确定我是否应该使用 OpenCL 或 DirectCompute。我做了一些 GPU 计算,但那是很久以前(3 年)。我是通过 OpenGL
我是一名优秀的程序员,十分优秀!