我有一个D3D11缓冲区,其中有几百万个元素,应该保存R8G8B8A8_UNorm
格式的数据。在HLSL中随机访问R8G8B8A8_UNorm格式的D3D11缓冲区
期望的行为如下:一个着色器计算vec4
并以随机访问模式将其写入缓冲区。在下一遍中,另一个着色器以随机访问模式读取数据并进一步处理它们。
我最好猜测的是创建UnorderedAccessView
格式的R8G8B8A8_UNorm
格式。但是,我如何在HLSL中声明RWBuffer<?>
,以及如何写入和读取它?是否需要手动申报RWBuffer<uint>
并从vec4
到uint
进行包装?
在OpenGL中,我会创建一个缓冲区和一个缓冲区纹理。然后我可以在着色器中使用rgba8
格式声明imageBuffer
,使用imageLoad
和imageStore
访问它,并且硬件为我完成所有转换。这在D3D11中可能吗?
非常感谢!它完美的作品:) 一个小的后续问题:我没有指定任何“寄存器”编程的东西,它仍然工作(请注意,我使用了效果框架)。指定它们有什么意义? – chafner 2014-10-31 09:01:00
如果不指定寄存器,则只在编译着色器时自动分配寄存器。明确指定它们只会让您更好地控制它们的位置,如果您在绑定来自C++的数据时需要它,这将非常有用。这对于Effects框架来说可能不那么重要,因为您可以通过名称来抓取所有内容。如果没有Effects框架,你可以通过寄存器槽号来在C++中绑定事物(除非你使用了着色器反射来模仿Effects框架)。 – megadan 2014-10-31 18:01:39