仅为个人学习用,请勿转载
词汇
纹理贴图:texture mapping 渲染到纹理:render-to-texture 纹素:texel 纹理图集:texture atlas
立方体图:cube map 体纹理:volume texture 块压缩:block compression
第9章 纹理贴图
- 纹理贴图是一种将图像数据映射到网格三角形上的技术,能让物体展示更加丰富的细节
学习目标
- 学习如何将局部纹理映射到网格三角形上
- 探究如何创建和启用纹理
- 学会如何通过纹理过滤来创建更为平滑的图像
- 探索如何用寻址模式来进行多次贴图
- 探索如何将多个纹理进行组合,从而创建出新的纹理与特效
- 学习如何通过纹理动画来创建一些基本效果
9.1纹理与资源的回顾
- 纹理通过ID3D12Resource接口表示,并以D3D12_RESOURCE_DESC::Dimension成员中的D3D12_RESOURCE_DIMENSION_TEXTURE2D类型来描述二弟纹理对象
- 2D纹理是一种由特定数组元素构成的矩阵
- 2D图像:纹理中的每个元素都存储着对应像素的颜色。
- 法线贴图:每个纹理元素都存储一个3D向量而非颜色数据
- 1D纹理与3D纹理就像由数组元素构成的1D3D数组,而1D2D3D都用泛型接口ID3D12Resource表示
- 纹理不同于缓冲区资源,缓冲区资源只存储数据数组,而纹理可以具有多个mipmap层级,GPU会根据这个层级进行相应的操作,例如运用过滤器以及多重采样。支持这些特性的纹理资源会有一些特定的数据格式,而缓冲区资源就没有这项限制,它们可以存储任意类型的数据。
- 纹理数据格式示例:
1.DXGI_FORMAT_R32G32B32_FLOAT:每个元素由3个32位浮点数分量构成
2.DXGI_FORMAT_R16G16B16A16_UNORM:每个元素由4个16位分量构成,每个分量将映射到[0,1]区间内。
3.DXGI_FORMAT_R32G32_UINT:每个元素由2个32位无符号整数分量构成
4.DXGI_FORMAT_R8G8B8A8_UROM:每个元素由4个8位无符号分量构成,每个分量将映射到[0,1]之间
5.DXGI_FORMAT_R8G8B8A8_SROM:每个元素由4个8位有符号分量构成,每个分量将映射到[-1,1]之间
6.DXGI_FORMAT_R8G8B8A8_SINT:每个元素由4个8位有符号整数分量构成,每个分量被映射到[-128,127]之间
7.DXGI_FORMAT_R8G8B8A8_UINT:每个元素由4个8位无符号整数分量构成,每个分量将被映射到[0,255]之间
RGBA分别代表红色绿色蓝色和alpha值
DXGI_FORMAT_R32G32B32_FLOAT:具有3个浮点分量,可以储存一个3D向量的浮点坐标
DXGI_FORMAT_R8G8B8A8_TYPELESS:无类型格式,只用来留出一块内存,在绑定到渲染流水线时再指出如何重新解释其中的数据。只有在不得已的情况下才使用无类型资源 - 一个纹理可以绑定到流水线不同阶段,例如一个纹理既可以作为渲染目标,也可以作为着色器资源,但是不能同时“身兼数职”。
- 将数据渲染到一个纹理后,再用它作为着色器资源,这个方法称为“渲染到纹理”。
- 为使纹理扮演渲染目标与着色器资源这两种角色,我们就需要为此纹理资源创建两个描述符,一个存于渲染目标堆中(D3D12_DESCRIPOTR_HEAP_TYPE_RTV),一个位于着色器资源堆中(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV,从着色器资源的枚举名称中可以看出,它也可以存储常量缓冲区视图描述符以及无需访问视图描述符)。接下来便可以把该资源绑定到渲染目标,或者作为着色器的输入与跟签名中的参数相绑定‘’。
//绑定渲染目标
CD3DX12_CPU_DESCRIPTOR_HANDLE rtv = ...;
CD3DX12_CPU_DESCRIPTOR_HANDLE dsv = ...;
cmdList->OMSetRenderTargets(1, &rtv,true,&dsv);
//以着色器输入的名义绑定到根参数
CD3DX12_GUP_DESCRIPTOR_HANDLE tex = ... ;
cmdList->SetGraphicsRootDescriptorTable(rootParamIndex, tex);
- 资源描述符通知Direct3D这些资源将被如何使用(绑定到哪个阶段)。如果以无类型格式创建资源,那么就要在创建视图时指定其具体类型,这一过程类似对数据进行强制转换。
9.2纹理坐标
-
Direct3D所采用的纹理坐标系是由指向图象水平正方向的u轴与指向图像垂直正方向的v轴所组成的。
-
取值范围为 0 ⩽ u , v ⩽ 1 0\leqslant u,v\leqslant 1 0⩽u,v⩽1的纹理标定的是一种称为纹素的纹理元素
-
v轴的正方向是“正下方”
-
通过归一化坐标区间,Direct3D可以摆脱具体纹理尺寸的干扰。
-
对于每个3D三角形来说,我们需要在将要映射在上面的纹理中定义出与之对应的三角形。
-
设 p 0 p 1 p 2 p_0p_1p_2 p0<