纹理格式及资源
最近项目接触到这块比较多,做了一个整理(逐步更新中…)
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 的倍数,且不能用作管道的输出。(来自微软文档)
-
_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数据,
资源
buffer
Structured Buffer
Structured Buffer即结构化缓冲区,也只有Buffer才能被创建成结构化,Structured意思是将resource标识成单个连续的内存块,每个内存块的大小即Stride,没有mipmap,也没有array slice,可以理解成的结构数组,因为是在内存上连续的固定结构,所以有很多优势。
…
RawBuffer
访问Buffer最方便的方法是将其视为一个巨大的bit组成的包,RawBuffer就类似这样,它允许以32位对齐寻址来访问Buffer,