好了,所以这已经困扰了我一阵子,并且在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] 删除。
我来说两句