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

米格尔

好了,所以这已经困扰了我一阵子,并且在MSDN上找不到适合我所需细节的任何内容。

这更多的是一个三部分的问题,所以它来了:

1-)创建交换链应用程序时,请指定后缓冲像素格式,最常见的是B8G8R8A8或R8G8B8A8。这为每个颜色通道提供8位,因此每个像素总共使用4个字节.....为什么当float4实际上是16个字节时,像素着色器必须将颜色作为float4返回?

2-)将纹理绑定到Pixel Shader时,我的纹理是DXGI_FORMAT_B8G8R8A8_UNORM格式,但是为什么采样器需要每像素float4才能工作?

3-)我在这里想念什么吗?我是在想这个还是什么?

请提供链接以支持您的主张。最好来自MSDN !!!

亚当·迈尔斯

GPU旨在至少在要支持D3D11的情况下对32位浮点数据执行计算。从D3D10开始,您还可以执行32位有符号和无符号整数运算。对于HLSL中小于4个字节的类型,没有要求或语言支持,因此对于1和2个字节的整数或较低精度的浮点数,没有“字节/字符”或“短”字样。

使用“ FLOAT”,“ UNORM”或“ SNORM”后缀的任何DXGI格式均为非整数格式,而“ UINT”和“ SINT”均为无符号和有符号整数。无论原始格式是8位UNORM / SNORM还是10/11/16/32位浮点数,着色器在前三种类型上执行的任何读取都将作为32位浮点数提供给着色器。顶点中的数据通常以比全脂32位浮点低的精度存储,以节省内存,但是到着色器时,它已转换为32位浮点。

在输出(到UAV或渲染目标)上,GPU会将“浮动”或“ uint”数据压缩为创建目标的格式。如果您尝试输出float4(4.4, 5.5, 6.6, 10.1)到8位归一化的目标,则它将被简单地截断为(1.0,1.0,1.0,1.0),每个像素仅消耗4个字节。

因此,回答您的问题:

1)因为着色器只能在32位类型上运行,但是GPU会根据需要压缩/截断输出,以根据其类型将其存储在当前绑定的资源中。对于GPU支持的每种格式都具有特殊的关键字和类型,这是很疯狂的。

2)“采样器”不需要“每像素需要float4即可工作”。我认为您正在混用术语。纹理为a的声明Texture2D<float4>实际上只是在说明该纹理具有四个组成部分,并且其格式不是整数格式。“浮点数”并不一定意味着源数据是32位浮点数(或实际上甚至是浮点数),而仅仅是数据具有小数部分(例如0.54、1.32)。同样地,将纹理声明为Texture2D<uint4>并不意味着源数据不一定是32位无符号的,而是意味着它包含无符号整数数据的四个分量。但是,数据将返回给您,并转换为32位浮点数或32位整数以在着色器内部使用。

3)您缺少GPU在读取时对纹理/顶点数据进行解压缩并在写入时再次对其进行压缩的事实。用于顶点/纹理数据的存储量仅与创建资源所用的格式相同,并且与着色器对32位浮点数/整数进行操作这一事实无关。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

像素缓冲区对象,gReadPixels和GL_UNSIGNED_INT_8_8_8_8_REV

来自分类Dev

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

来自分类Dev

当Vec不工作时,为什么[u8]用作UdpSocket的缓冲区?

来自分类Dev

将结构发送到着色器存储缓冲区时,为什么会得到垃圾数据?

来自分类Dev

DirectX HLSL-像素着色器中恒定缓冲区为空,但顶点着色器中为空

来自分类Dev

为什么iOS 8上的SceneKit无法编译我的自定义着色器?

来自分类Dev

如何以bgra8Unorm像素格式绘制MTLTexture

来自分类Dev

JavaFX 8 Z缓冲区问题

来自分类Dev

用于着色器资源视图到深度模板缓冲区资源的哪种格式?

来自分类Dev

从片段着色器访问深度缓冲区

来自分类Dev

OpenGL:着色器存储缓冲区映射/绑定

来自分类Dev

无法从Compute着色器读取深度缓冲区

来自分类Dev

着色器存储缓冲区对象:字节序?

来自分类Dev

金属着色器在缓冲区中插入值

来自分类Dev

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

来自分类Dev

将Uint8ClampedArray缓冲区输出为字节流

来自分类Dev

不同大小的着色器存储缓冲区内容“转移”到阵列缓冲区

来自分类Dev

将 R8G8B8A8 映像复制到 R8G8B8

来自分类Dev

使用金属间接命令缓冲区时出错:“片段着色器不能与间接命令缓冲区一起使用”

来自分类Dev

尝试将制服传递给金属着色器时出现“ SceneKit:错误,缺少缓冲区[-1/2]”

来自分类Dev

着色器将uint8投射为浮动,然后将其重新解释为uint

来自分类Dev

比较:使用缓冲区视图(Uint8与Float64)调整ArrayBuffer的大小,我是否缺少某些东西?

来自分类Dev

如何修复 console.error:“此浏览器缺少缓冲区 v5.x 所需的类型化数组 (Uint8Array) 支持。如果……请使用缓冲区 v4.x”

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

    像素缓冲区对象,gReadPixels和GL_UNSIGNED_INT_8_8_8_8_REV

  8. 8

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

  9. 9

    当Vec不工作时,为什么[u8]用作UdpSocket的缓冲区?

  10. 10

    将结构发送到着色器存储缓冲区时,为什么会得到垃圾数据?

  11. 11

    DirectX HLSL-像素着色器中恒定缓冲区为空,但顶点着色器中为空

  12. 12

    为什么iOS 8上的SceneKit无法编译我的自定义着色器?

  13. 13

    如何以bgra8Unorm像素格式绘制MTLTexture

  14. 14

    JavaFX 8 Z缓冲区问题

  15. 15

    用于着色器资源视图到深度模板缓冲区资源的哪种格式?

  16. 16

    从片段着色器访问深度缓冲区

  17. 17

    OpenGL:着色器存储缓冲区映射/绑定

  18. 18

    无法从Compute着色器读取深度缓冲区

  19. 19

    着色器存储缓冲区对象:字节序?

  20. 20

    金属着色器在缓冲区中插入值

  21. 21

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

  22. 22

    将Uint8ClampedArray缓冲区输出为字节流

  23. 23

    不同大小的着色器存储缓冲区内容“转移”到阵列缓冲区

  24. 24

    将 R8G8B8A8 映像复制到 R8G8B8

  25. 25

    使用金属间接命令缓冲区时出错:“片段着色器不能与间接命令缓冲区一起使用”

  26. 26

    尝试将制服传递给金属着色器时出现“ SceneKit:错误,缺少缓冲区[-1/2]”

  27. 27

    着色器将uint8投射为浮动,然后将其重新解释为uint

  28. 28

    比较:使用缓冲区视图(Uint8与Float64)调整ArrayBuffer的大小,我是否缺少某些东西?

  29. 29

    如何修复 console.error:“此浏览器缺少缓冲区 v5.x 所需的类型化数组 (Uint8Array) 支持。如果……请使用缓冲区 v4.x”

热门标签

归档