随机访问HLSL中具有R8G8B8A8_UNorm格式的D3D11缓冲区

查夫纳

我有一个D3D11缓冲区,其中有几百万个元素,应该以该R8G8B8A8_UNorm格式保存数据

所需的行为如下:一个着色器计算avec4并将其以随机访问模式写入缓冲区。在下一个过程中,另一个着色器将以随机访问模式读取数据并进一步处理它们。

我最好的猜测是UnorderedAccessView使用R8G8B8A8_UNorm格式创建但是,如何RWBuffer<?>在HLSL中声明,以及如何对其进行写入和读取?是否有必要将其声明为RWBuffer<uint>和做包装vec4,以uint手动?

在OpenGL中,我将创建一个缓冲区和一个缓冲区纹理。然后,我可以在着色器中使用格式声明一个imageBufferrgba8使用imageLoad和进行访问imageStore,然后硬件会为我完成所有转换。在D3D11中可以吗?

梅丹

由于存在许多不同的陷阱,因此这有点棘手,但是您应该可以执行类似的操作。

在写入缓冲区的着色器中声明:

RWBuffer<float4> WriteBuf : register( u1 );

请注意,它一定要注册u1而不是u0无序访问视图(UAV)必须从插槽1开始,因为该u#寄存器还用于渲染目标。

要写入缓冲区,只需执行以下操作:

WriteBuf[0] = float4(0.5, 0.5, 0, 1);

请注意,您必须一次写入所有4个值。

在您的C ++代码中,您必须创建一个无序的访问缓冲区,并将其绑定到UAV。您可以使用DXGI_FORMAT_R8G8B8A8_UNORM格式。当您向其写入4个浮点数时,值将自动转换并打包。可以使用将UAV绑定到管道OMSetRenderTargetsAndUnorderedAccessViews

在从缓冲区读取的着色器中,声明一个只读缓冲区:

Buffer<float4> ReadBuf : register( t0 );

请注意,使用此缓冲区t0是因为它将绑定为着色器资源视图(SRV)而不是UAV。

要访问缓冲区,请使用类似以下内容的方法:

float4 val = ReadBuf[0];

在您的C ++代码中,您可以将先前创建的相同缓冲区绑定到SRV而不是UAV。SRV可以使用绑定到管道PSSetShaderResources,也可以使用创建DXGI_FORMAT_R8G8B8A8_UNORM

您不能将使用同一缓冲区的SRV和UAV同时绑定到管道。因此,您必须首先绑定无人机并运行第一个着色器通道。然后取消绑定无人机,绑定SRV,然后运行第二个着色器通道。

可能还有其他方法可以做到这一点。请注意,所有这些都需要着色器模型5。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将像素缓冲区从16Bit转换为B8G8R8A8_UNorm

当后缓冲区格式为DXGI_FORMAT_B8G8R8A8_UNORM时,为什么像素着色器返回float4?

表面格式为B8G8R8A8_UNORM,但vkCmdClearColorImage是否为float?

使用DirectX11像素着色器将颜色从DXGI_FORMAT_B8G8R8A8_UNORM转换为GPU中的NV12

HLSL中的3D缓冲区?

D3D11:映射顶点缓冲区时,E_OUTOFMEMORY

JavaFX 8 Z缓冲区问题

D3D11:HLSL中的可变灯数

如何在Direct3D 11中从CPU访问帧缓冲区?

在Qt3D中访问帧缓冲区

像素缓冲区对象,gReadPixels和GL_UNSIGNED_INT_8_8_8_8_REV

如何在 glsl 着色器中读取具有 R8_UINT 格式和 SAMPLED_IMAGE 描述符类型的 3D 图像?

无法创建超过8个渲染缓冲区的FBO

Emacs:打印UTF-8缓冲区

将 R8G8B8A8 映像复制到 R8G8B8

OpenGL ES2.0将8位图像加载到模板缓冲区中

哪种更安全的方式将`uint8_t *`C缓冲区存储在Rust中?

将u8缓冲区转换为Rust中的结构

在协议缓冲区消息文件中定义uint8_t变量

将缓冲区发送到Vim 8中正在运行的终端窗口

全局、缓冲区和进程在 ionic 4 angular 8 中未定义

Windows Phone 8,IAudioCaptureClient GetBuffer在返回的缓冲区中获取零数据

将 1-32 位插入 64 位(8x8 字节)缓冲区

Direct3D 11 中附加/消耗缓冲区的视图

将uint8_t *缓冲区上传到AWS S3,而无需通过文件系统

rust-tokio流中的缓冲区是否可以使用&[u8]以外的其他方式?

严格的别名规则uint8_t构造缓冲区

Node.js将缓冲区转换为Int8Array

当系统内存大于8GB时,为什么Linux禁用磁盘写缓冲区?