WebGPU 纹理与纹理类型基础 (D3D对纹理的描述比较详细)

纹理与纹理类型,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 一样 ,这很容易弄错 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值