纹理格式及资源

最近项目接触到这块比较多,做了一个整理(逐步更新中…)

Format

首先以R8G8B8A8为例,代表使用了R、G、B、Alpha四个通道,每个通道使用了8个bit,总共使用了32个bit,所以也称BPP/BitCount/BPE(叫法来自DXSPEC)为32

还有一种R8G8B8X8,其中X8代表忽略的透明度信息。

有时候8位最多代表256种颜色,我们需要更多,因此还会有R32G32B32A32这种format,有时候不需要Alpha信息,会有R32G32B32这种format

在DirectX中,每一种format后面还有一个格式修饰符,下面详细解释这些

  • _UNORM:无符号的归一化整数,即没有负数,在资源中解释为无符号整数,在着色器中解释为 [0,1] 范围内的无符号归一化浮点值,比如,2位(指的每一个通道bit)UNORM表示0.0f,1/3, 2/3和1.0f。归一化即指将0,1,2,3表示为[0,1.0f]这个过程

  • _FLOAT:浮点数,DX是有符号浮点数,在SPEC中规定:32位浮点数使用 IEEE 754 单精度 的标准:1位符号、8位指数偏移、23位数值部分;16位的浮点数使用半精度(s10e5)的格式:1位符号、5位指数偏移、10位数值部分。还有特殊的,比如DXGI_FORMAT_R11G11B10_FLOAT,

  • _SNORM:带符号的归一化整数,在着色器中解释为[-1,1]中的有符号归一化浮点数,(5 位值 01111 映射到 1.0f,10000 映射到 -1.0f)

  • _UINT:无符号整数,3位的UINT即表示01234567

  • _BC:压缩纹理格式,详情见下表,注意在所有尺寸上创建的块压缩纹理必须是大小 4 的倍数,且不能用作管道的输出。(来自微软文档
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0a580fb90495478db221f6eae

  • _ASTC:ARM开发的纹理压缩格式,DXGI Format好像没有这种?

  • _TYPELESS:无类型数据,但是有已经定义的bit数,也就是说,可以创建一个无类型资源,但当资源绑定到着色器时,就必须应用或着色器解析这个类型,即CreateSRV/RT/UAV时,比如R8G8B8A8_TYPELESS,在Create View时必须用R8G8B8A8_UNORM/SINT等其中一种去解释这个。(也有例外,raw buffer(注意这里的resource dimeason必须是BufferEX,BufferEX才可以指定raw的flag)可以指定成R32_Typeless,但是struct buffer只能指定 unknown format

  • _SRGB:标准的RGB数据,

资源

在这里插入图片描述
来自微软spec

buffer

Structured Buffer

Structured Buffer即结构化缓冲区,也只有Buffer才能被创建成结构化,Structured意思是将resource标识成单个连续的内存块,每个内存块的大小即Stride,没有mipmap,也没有array slice,可以理解成的结构数组,因为是在内存上连续的固定结构,所以有很多优势。

RawBuffer

访问Buffer最方便的方法是将其视为一个巨大的bit组成的包,RawBuffer就类似这样,它允许以32位对齐寻址来访问Buffer,

Texture