纹理简介

纹理资源是用于存储纹素的数据结构,纹素是纹理中可以读写的最小单位。 当纹理被着色器读取时,可以通过纹理采样器对其进行过滤。

纹理资源是用于存储纹素的结构化数据集合。 纹素是管道可以读取或写入的纹理中最小的单位。 与缓冲区不同,纹理在着色器单元读取时可以通过纹理采样器进行筛选。 纹理的类型会影响纹理的筛选方式。 每个纹素包含 1 到 4 个组件,这些组件以由 DXGI_FORMAT 枚举定义的 DXGI 格式之一进行排列。

纹理被创建为一种具有已知大小的结构化资源。 但是,只要在纹理绑定到管道时通过视图完全指定数据类型,创建资源时纹理可以是有类型或无类型。

纹理类型

Direct3D 支持多个浮点表示形式。 所有浮点计算都在 IEEE 754 32 位单精度浮点规则的定义的子集下运行。

有多种类型的纹理:1D、2D、3D,每个纹理都可以使用或不使用 mipmap 创建。 Direct3D 还支持纹理数组和多重采样纹理。

1D 纹理

最简单形式的 1D 纹理包含可通过单个纹理坐标寻址的纹理数据;可以将其可视化为一个纹素数组,如下图所示。

下图显示了一个 1D 纹理:

一维纹理

每个纹素包含若干颜色分量,具体取决于存储数据的格式。 为了增加复杂性,您可以创建具有 mipmap 级别的 1D 纹理,如下图所示。

一个具有 mipmap 级别的 1d 纹理

mipmap 级别是一种纹理,它比其上方级别小一个二次幂。 最顶层包含最详细的信息,每个后续级别较小。 对于 1D mipmap,最小级别包含一个纹素。 此外,MIP 级别始终降至 1:1。

为奇数大小的纹理生成 mipmap 时,下一个较低级别始终是偶数大小(最低级别达到 1 时除外)。 例如,该图演示了一个 5x1 纹理,其下一个最低级别为 2x1 纹理,其下一个(最后)mip 级别为 1x1 大小的纹理。 通过名为 LOD(细节级别)的索引来标识不同的级别,该索引在渲染距离相机较远的几何图形时,用于访问较小的纹理。

1D 纹理数组

Direct3D 还支持纹理数组。 1D 纹理数组在概念上与下图类似。

1d 纹理数组

此纹理数组包含三个纹理。 这三个纹理中的每个纹理的纹理宽度为 5(这是第一层中的元素数)。 每个纹理还包含一个 3 层 mipmap。

Direct3D 中的所有纹理数组都是纹理的同质数组;这意味着纹理数组中的每个纹理必须具有相同的数据格式和大小(包括纹理宽度和 mipmap 级别数)。 可以创建大小不同的纹理数组,只要每个数组中的所有纹理都与大小匹配。

2D 纹理和 2D 纹理数组

Texture2D 资源包含由纹理像素组成的二维网格。 每个纹素都可以通过 u、v 向量进行寻址。 由于它是纹理资源,因此它可能包含 mipmap 级别和子资源。 完全填充的 2D 纹理资源如下图所示。

二维纹理资源

此纹理资源包含具有三个 mipmap 级别的单个 3x5 纹理。

2D 纹理数组资源是 2D 纹理的同质数组;也就是说,每个纹理具有相同的数据格式和维度(包括 mipmap 级别)。 它具有与 1D 纹理数组类似的布局,但纹理现在包含 2D 数据,如下图所示。

2d 纹理数组

此纹理数组包含三个纹理;每个纹理为 3x5,具有两个 mipmap 级别。

将二维纹理数组用作立方体纹理

纹理立方体是一个包含 6 个纹理的 2D 纹理数组,每个纹理对应立方体的每个面。 完全填充的纹理立方体如下图所示。

一组表示纹理立方体的二维纹理

包含 6 个纹理的 2D 纹理数组可以在具有立方体映射内在函数的着色器中读取,然后将其绑定到具有立方体纹理视图的管道中。 纹理立方体是从着色器寻址的,3D 向量从纹理立方体的中心指向。

3D 纹理

3D 纹理资源(也称为体积纹理)包含一个 3D 纹素体积。 因为它是纹理资源,因此它可能包含 mipmap 级别。 完全填充的 3D 纹理如下面的插图所示。

三维纹理资源

当 3D 纹理 mipmap 切片绑定为呈现目标输出(具有呈现目标视图)时,3D 纹理的行为与具有 n 个切片的 2D 纹理数组相同。 从几何着色器阶段中选择特定的渲染切片。

没有 3D 纹理数组的概念;因此,3D 纹理子资源是单个 mipmap 级别。

Direct3D 的坐标系是为像素和纹素定义的。

像素坐标系

Direct3D 中的像素坐标系定义左上角呈现目标的原点,如下图所示。 像素中心从整数位置偏移(0.5f,0.5f)。

direct3d 10 中像素坐标系的

纹素坐标系

纹素坐标系的原点位于纹理左上角,如下图所示。 这使得呈现屏幕对齐的纹理变得简单,因为像素坐标系与纹素坐标系保持一致。

纹素坐标系的 图

纹理坐标用规范化数字或比例数表示,每个纹理坐标映射到特定的纹素,如下所示:

对于标准化坐标:

  • 点采样:纹素 # = floor(U * Width)
  • 线性采样:左纹素 # = floor(U * Width),右纹素 # = 左纹素 # + 1

对于缩放坐标:

  • 点采样:纹理元素 # = floor(U)
  • 线性采样:左纹素 # = floor(U - 0.5),右纹素 # = 左纹素 # + 1

其中宽度是纹理的宽度(以纹素为单位)。

纹理地址环绕在计算纹素位置后进行。

纹理