随机访问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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

HLSL中的3D缓冲区?

来自分类Dev

JavaFX 8 Z缓冲区问题

来自分类Dev

D3D11:HLSL中的可变灯数

来自分类Dev

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

来自分类Dev

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

来自分类Dev

像素缓冲区对象,gReadPixels和GL_UNSIGNED_INT_8_8_8_8_REV

来自分类Dev

将 R8G8B8A8 映像复制到 R8G8B8

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

将Mono8图像缓冲区转换为wx.bitmap中wx.Bitmap的可显示格式,Python中的Phoenix

来自分类Dev

Windows 8 SDK中的d3dx11.h

来自分类Dev

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

来自分类Dev

如何以bgra8Unorm像素格式绘制MTLTexture

来自分类Dev

转换缓冲区base64-> utf8编码node.js

来自分类Dev

将字节缓冲区转换为UTF8字符串

来自分类Dev

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

来自分类Dev

Node.js将缓冲区转换为Int8Array

来自分类Dev

节点缓冲区,从utf8到二进制

来自分类Dev

如何抽象不同的字节缓冲区类型?(NSData,[UInt8]等)

来自分类Dev

将Uint8ClampedArray缓冲区输出为字节流

来自分类Dev

C ++使用宽流读取UTF8缓冲区

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

    HLSL中的3D缓冲区?

  8. 8

    JavaFX 8 Z缓冲区问题

  9. 9

    D3D11:HLSL中的可变灯数

  10. 10

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

  11. 11

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

  12. 12

    像素缓冲区对象,gReadPixels和GL_UNSIGNED_INT_8_8_8_8_REV

  13. 13

    将 R8G8B8A8 映像复制到 R8G8B8

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

    将Mono8图像缓冲区转换为wx.bitmap中wx.Bitmap的可显示格式,Python中的Phoenix

  19. 19

    Windows 8 SDK中的d3dx11.h

  20. 20

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

  21. 21

    如何以bgra8Unorm像素格式绘制MTLTexture

  22. 22

    转换缓冲区base64-> utf8编码node.js

  23. 23

    将字节缓冲区转换为UTF8字符串

  24. 24

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

  25. 25

    Node.js将缓冲区转换为Int8Array

  26. 26

    节点缓冲区,从utf8到二进制

  27. 27

    如何抽象不同的字节缓冲区类型?(NSData,[UInt8]等)

  28. 28

    将Uint8ClampedArray缓冲区输出为字节流

  29. 29

    C ++使用宽流读取UTF8缓冲区

热门标签

归档