纹理与纹理类型,D3D 官方文档描述的比较详细:
介绍 Direct3D 11 纹理
纹理资源是一个结构化的数据集合,用纹素的形式存储。纹素texel代表纹理的最小单位,可以被管线读写。与缓冲区不同,纹理可以在着色器中被纹理采样器过滤。纹理的类型影响纹理的过滤方式。每个纹素包含1到4个分量。
纹理被创建为具有已知大小的结构化资源。然而,当创建资源时,每个纹理可以是有类型的或无类型的,只要在纹理绑定到管线时使用指定类型的视图对纹理进行访问。
纹理类型
纹理有几种类型:1D, 2D, 3D,每种纹理都可以使用或不使用mipmaps创建。纹理还有纹理数组和多重采样纹理。
1D Textures
一维纹理是最简单的纹理形式,可以用一维空间坐标的形式访问,一维纹理是纹素的数组,如下图所示:
每个texel包含许多颜色分量,这取决于所存储数据的格式。 复杂一点的纹理形式,你可以创建带有细节等级的一维纹理:
细节等级是这样一种纹理,它的大小是上一级的二分之一(power of two), 最上层的细节等级包含最多的细节, 连续的等级越来越小。对一个具有细节等级的一维纹理来说,最小的细节等级层只包含一个纹素。如果纹理的大小是奇数, 那么下一个细节等级纹理的大小总是偶数,除了最后一级纹理(它的大小总是1)。
1D Texture Arrays
一维纹理数组,顾名思义,它是连续的一维纹理的数组形式,每个纹理都包括相应的细节等级。如下图所示, 每个纹理包含3层细节等级子纹理:
纹理数组中的纹理是同性质的,也就是格式,大小,细节等级都一样。
2D Textures and 2D Texture Arrays
一个Texture2D资源包含一个二维网格的纹素。每个纹素都可以通过u, v向量寻址。它可能包含mipmap级别和子资源。一个完整的2D纹理资源如下图所示:
这个纹理资源包含一个具有三个mipmap级别的3x5纹理。
二维纹理数组资源是二维纹理的同性质的数组;也就是说,每个纹理都有相同的数据格式和维度(包括mipmap级别)。它的布局与1D纹理数组相似,除了纹理现在包含2D数据,如下图所示:
Using a 2D Texture Array as a Texture Cube
立方体纹理是包含六个二维纹理的纹理数组, 每个纹理对应一个面, 立方体纹理看起来如下图:
这个纹理数组当以纹理视图的形式绑定到管线上时,在着色器中被立方体纹理映射函数访问,在着色器中,使用由立方体纹理中心发出的三维向量寻址。
纹理立方体的数组,其中纹理的数量等于数组中纹理立方体的数量乘以6(每个立方体6个面)。
3D Textures
三维纹理资源是有三维体纹素组成的,因为它也是纹理资源,也有mipmap 层级(也就是一般纹理都有mipmap层级),体纹理由下图所示:
当三维纹理的 mipmap 切片 绑定到渲染目标时, 三维纹理等同于二维纹理数组的形式。 没有三维纹理数组的概 , 因此,一个三维纹理子资源是一个单一的 mipmap 级别。
这里也介绍下 subresource 的概念:
子资源是指资源的子集,buffer 被定义为单个子资源。纹理有点复杂,因为有几种不同的纹理类型(1D, 2D等),其中一些支持mipmap级别 和/或 纹理数组。我们从最简单的情况开始了解其定义,一维纹理被定义为单个子资源,如下图所示:
这意味着,由纹素数组组成的一维纹理包含在单个子资源中。如果我们将带有三个细节等级的一维纹理展开, 如下图所示:
可以将其视为由三个子资源组成的单个纹理。子资源可以使用单个纹理的细节级别(LOD)进行索引。当使用纹理数组时,访问特定的子资源需要LOD和特定的纹理。或者,API将这两条信息组合成一个从零开始的子资源索引,如下图所示。
也就是纹理可以包含一个或多个子资源,每个mipmap是一个子资源,纹理数组中的每一个纹理可以看成纹理数组的切片:
数组切片
给定一个纹理数组,每个纹理都有mipmaps,一个数组切片(由白色矩形表示)包括一个纹理和它所有的子资源,如下图所示:
细节等级切片
一个mipmap切片(用白色矩形表示)包含一个mipmap级别,用于数组中的每个纹理,如下图所示:
WebGPU 纹理拷贝注意事项(稍微没注意就容易犯错):
当我们使用 图像拷贝函数 copyTextureToTexture 对纹理进行复制时,需要指定 source, destination ,coyeSize 三个参数。
dictionary GPUImageCopyTexture { required GPUTexture texture; GPUIntegerCoordinate mipLevel = 0; GPUOrigin3D origin = {}; GPUTextureAspect aspect = "all"; };
origin:
Defines the origin of the copy - the minimum corner of the texture sub-region to copy to/from. Together with copySize
, defines the full copy sub-region.
CopySize:
width
, the width of the extent.
height
, the height of the extent, defaulting to 1
depthOrArrayLayers
, defaulting to 1
The depth of the extent or the number of array layers it contains. If used with a GPUTexture
with a GPUTextureDimension
of "3d"
defines the depth of the texture. If used with a GPUTexture
with a GPUTextureDimension
of "2d"
defines the number of array layers in the texture.
CopySize 一定要填正确, 它只的是拷贝大小, 尤其 depthOrArrayLayers, 即使指定了 origin 的 z 值, depthOrArryaLayers 也不能认为是 0,应该最小是 1, 它是一个拷贝 范围 , 就如 width, height 一样 ,这很容易弄错, 切记 ...