Direct3D 11 中的纹理简介
纹理资源是用于存储纹素的数据的结构化集合。 纹素表示可由管道读取的或可写入管道的纹理的最小单位。 与缓冲区不同,在着色器单元读取纹理时,纹理采样器可筛选纹理。 纹理的类型将影响筛选纹理的方式。 每个纹素包含 1 到 4 个部分,它们按 DXGI_FORMAT 枚举定义的 DXGI 格式之一排列。
纹理被创建成具有已知大小的结构化资源。 但是,只要在将纹理绑定到管道时使用视图完全指定类型,每个纹理资源在创建时有无类型均可。
纹理类型
有几种类型的纹理:1D、2D、3D,其中每种类型均可在有或没有 mipmap 的情况下创建。 Direct3D 11 还支持纹理数组和多重采样纹理。
1D 纹理
最简单形式的 1D 纹理包含可使用单个纹理坐标寻址的纹理数据;它可以可视化为纹素数组,如下图所示。 1D 纹理由 ID3D11Texture1D 接口表示。
每个纹素均包含大量颜色分量,具体取决于已存储数据的格式。 再复杂一些的话,你可以创建具有 mipmap 级别的 1D 纹理,如下图所示。
mipmap 级别是一个比它上面的级别小二次幂的纹理。 最上面的级别包含的细节最多,下面的每个级别逐渐减少。 对于 1D mipmap,最小的级别包含一个纹素。 此外,MIP 级别总是减小到 1:1。 在为奇数大小的纹理生成 mipmap 时,下一个较低级别始终为偶数大小(最低级别达到 1 时除外)。 例如,该图显示了一个 5x1 的纹理,其下一个较低级别为 2x1 纹理,再下一个(也就是最后一个)mip 级别为 1x1 大小的纹理。 这些级别通过称作 LOD(细节级别)的索引进行标识,用于在渲染离摄像机较远的几何图形时访问较小的纹理。
1D 纹理数组
Direct3D 11 还支持纹理数组。 1D 纹理数组也由 ID3D11Texture1D 接口表示。 从概念上说,1D 纹理数组与下图类似。
此纹理数组包含三个纹理。 三个纹理都是宽度为 5(即第一层中的元素数)的纹理。 每个纹理还包含一个 3 层 mipmap。
Direct3D 中的所有纹理数组都是同类纹理数组;这意味着,纹理数组中的每个纹理必须具有相同的数据格式和大小(包括纹理宽度和 mipmap 级别数)。 你可以创建具有不同大小的纹理数组,前提是每个数组中的所有纹理大小相同。
2D 纹理和 2D 纹理数组
Texture2D 资源包含 2D 纹素网格。 每个纹素均可通过 u, v 矢量进行寻址。 由于是纹理资源,它可能包含 mipmap 级别和子资源。 2D 纹理由 ID3D11Texture2D 接口表示。 完全填充的 2D 纹理资源如下图所示。
此纹理资源包含一个具有 3 个 mipmap 级别的 3x5 纹理。
2D 纹理数组资源是一个同类 2D 纹理数组;也就是说,每个纹理具有相同的数据格式和维度(包括 mipmap 级别)。 2D 纹理数组也由 ID3D11Texture2D 接口表示。 它具有与 1D 纹理数组相似的布局,只不过纹理现在包含的是 2D 数据,如下图所示。
此纹理数组包含三个纹理;每个纹理均为具有两个 mipmap 级别的 3x5 纹理。
使用 2D 纹理数组作为立方纹理
纹理立方体是一个包含 6 个纹理的 2D 纹理数组,其中每个纹理均表示立方体的一个面。 完全填充的纹理立方体如下图所示。
使用立方体纹理视图将包含 6 个纹理的 2D 纹理数组绑定到管道后,可以使用立方体贴图内部函数在着色器中读取该数组。 使用从纹理立方体的中心指向外的 3D 矢量从着色器对纹理立方体进行寻址。
注意
使用 10_1 及更高功能级别 创建的设备可以支持纹理立方体数组,其中纹理数等于数组中纹理立方体数乘以 6。 使用 10_0 功能级别 创建的设备仅支持包含 6 个面的单个纹理立方体。 此外,Direct3D 11 不支持部分立方体映射。
3D 纹理
3D 纹理资源(也称作体积纹理)包含纹素的 3D 体积。 由于是纹理资源,它可能包含 mipmap 级别。 3D 纹理由 ID3D11Texture3D 接口表示。 完全填充的 3D 纹理如下图所示。
当 3D 纹理 mipmap 切片作为呈现目标输出绑定时(具有呈现-目标视图),3D 纹理的行为与具有 n 个切片的 2D 纹理数组的相同。 通过将输出数据的标量组件声明为SV_RenderTargetArrayIndex系统值,从几何着色器阶段选择特定呈现切片。
不存在 3D 纹理数组的概念;因此,3D 纹理子资源是单个 mipmap 级别。
相关主题