区块链技术博客
www.b2bchain.cn

WebGPU 规范篇 04 纹理求职学习资料

本文介绍了WebGPU 规范篇 04 纹理求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

系列博客目录传送门:https://xiaozhuanlan.com/topic/9587342601

  • 1 纹理的创建
    • 举例
    • 创建时参数不合法的情况
  • 2 纹理视图 GPUTextureView
    • 创建时参数不合法的情况


1 纹理的创建

纹理由 device.createTexture() 创建,类型是 GPUTexture

[Exposed=(Window, DedicatedWorker), SecureContext] interface GPUTexture {   GPUTextureView createView(optional GPUTextureViewDescriptor descriptor = {});    undefined destroy(); }; GPUTexture includes GPUObjectBase;

createTexture 方法需要一个 GPUTextureDescriptor 类型的对象:

dictionary GPUTextureDescriptor : GPUObjectDescriptorBase {   required GPUExtent3D size;   GPUIntegerCoordinate mipLevelCount = 1;   GPUSize32 sampleCount = 1;   GPUTextureDimension dimension = "2d";   required GPUTextureFormat format;   required GPUTextureUsageFlags usage; };

有三个必选参数:

  • size: GPUExtent3D 类型,表示
    • GPUExtent3D 类型
  • format: GPUTextureFormat 类型,即纹理的格式;
    • GPUTextureFormat 是一个比较大的部分,见本文中的后面部分介绍 纹理格式
  • usage: GPUTextureUsageFlags 类型,即纹理的用途;
    • GPUTextureUsage 是一个枚举类型,有 5 个可选值 COPY_SRCCOPY_DSTTEXTURE_BINDINGSTORAGE_BINDINGRENDER_ATTACHMENT,分别代表十六进制值 0x010x020x040x080x10
typedef [EnforceRange] unsigned long GPUTextureUsageFlags; [Exposed=(Window, DedicatedWorker)] namespace GPUTextureUsage {   const GPUFlagsConstant COPY_SRC          = 0x01;   const GPUFlagsConstant COPY_DST          = 0x02;   const GPUFlagsConstant TEXTURE_BINDING   = 0x04;   const GPUFlagsConstant STORAGE_BINDING   = 0x08;   const GPUFlagsConstant RENDER_ATTACHMENT = 0x10; };

还有三个可选参数:

  • mipLevelCount,类型是 unsigned long,默认值是 1,表示 mipmap 的等级数
  • sampleCount,类型是 unsigned long,默认值是 1,表示采样次数,只能是 1 或 4
  • dimension,类型是 GPUTextureDimension 枚举,默认值是 "2d",表示纹理的维度,即默认是二维纹理;

GPUTextureDimension 的定义如下:

enum GPUTextureDimension {   "1d",   "2d",   "3d", };

译者注:mipLevelCount 中所提及的 mipmap,即多级纹理,类似金字塔技术,而 mipLevelCount 即多级纹理的有多少级。

举例

例如,创建一个用于多重采样抗锯齿渲染的纹理,其用途是 GPUTextureUsage.RENDER_ATTACHMENT(即颜色附件),采样次数为 4 次,分辨率同 canvas 的绘制分辨率(设为 800 × 600),那么:

const msaaTexture = device.createTexture({   size: {     width: 800,     height: 600,   },   sampleCount: 4,   format: "bgra8unorm",   usage: GPUTextureUsage.RENDER_ATTACHMENT })

又或者,你要创建一个再普通不过的漫反射贴图纹理,这个漫反射贴图图片大小是 256 × 256:

const texture = device.createTexture({   size: [256, 256],   format: "rgba8unorm",   usage: GPUTextureUsage.SAMPLED | GPUTextureUsage.COPY_DST })

关于如何将 JavaScript 中读取到。的图片数据传递给纹理对象,请参考本文 为纹理输入图片/视频数据。

创建时参数不合法的情况

接下来要说明创建纹理对象时,参数设置有问题的情况:

  • 如果 format 参数用的 GPUTextureFormatdevice.features 中没有启用,那么会报错;
  • 如果触发了下列逻辑关系,那么会返回一个不可用的 GPUTexture 对象,并产生一个 GPUValidationError 错误:
    • 设备对象不可用;
    • size 参数的 width、height、depthOrArrayLayers 属性不是正整数;
    • mipLevelCount 不是正整数;
    • sampleCount 既不是 1 也不是 4;
    • dimension 参数如果是 “1d” 且
    • size 参数的 width 属性大于了设备限制列表中的 maxTextureDimension1D
    • size 参数的 height 属性值不是 1
    • size 参数的 depthOrArrayLayers 不是1
    • sampleCount 参数不是1
    • format 被设为一种压缩格式或 深度/模板 类型的格式
    • dimension 参数如果是 “2d” 且
    • size 参数的 width 属性大于了设备限制列表中的 maxTextureDimension2D
    • size 参数的 height 属性大于了设备限制列表中的 maxTextureDimension2D
    • size 参数的 depthOrArrayLayers 属性大于或等于了设备限制列表中的 maxTextureArrayLayers
    • dimension 参数如果是 “3d” 且
    • size 参数的 width 属性大于了设备限制列表中的 maxTextureDimension3D
    • size 参数的 height 属性大于了设备限制列表中的 maxTextureDimension3D
    • size 参数的 depthOrArrayLayers 属性大于或等于了设备限制列表中的 maxTextureArrayLayers
    • sampleCount 参数不是1
    • format 被设为一种压缩格式或 深度/模板 类型的格式
    • size 参数的 width 属性不是 纹素(texel)块的宽的整数倍;
    • size 参数的 height 属性不是 纹素块高的整数倍
    • 如果 sampleCount 参数大于 1 且
    • mipLevelCount 不是 1
    • size.depthOrArrayLayers 不是 1
    • usage 包括了 STORAGE_BINDING 类型
    • format 不是可渲染类型(即颜色格式或深度/模板格式)
    • mipLevelCount 大于了最大 mip 等级计数值(最大 mip 等级计数值取值函数稍后)
    • usage 不是 GPUTextureUsage 的联合类型
    • usage 若包括 RENDER_ATTACHMENT,但是 format 参数不是可渲染类型(即颜色格式或深度/模板格式)
    • usage 包括 STORAGE_ATTACHMENT,但是 format 参数不是纯色格式表中的 STORAGE_BINDING 类型的格式(参考 WebGPU Spec 24.1.1 Plain color formats 纯色格式)

很长,但是不需要完全记忆,仅需在报错的时候来找原因即可。

最大 mip 等级计数值取值函数 伪代码:

创建 GPUTexture 的参数:dimension, size; 如果 dimension:     是 "1d", 令 m = size.width     是 "2d", 令 m = max(size.width, size.height)     是 "3d", 令 m = max(max(size.width, size.height), size.depthOrArrayLayers)  返回 floor(log_2(m)) + 1

2 纹理视图 GPUTextureView

截至发文,官方暂时还未对纹理视图对象做出定义,可能借鉴了经典的 Model – View 设计吧。

总之,纹理要通过绑定组对象(GPUBindGroup)传递给着色器,或者要传递给可编程通道编码器(GPUProgramablePassEncoder),必须是传递其纹理视图对象。

创建纹理视图对象其实蛮简单,由纹理对象调用其 createView() 方法即可,这个方法的参数对象可以不传递(通常大多数时候是如此)。

来看看这个可选但不可空的创建参数对象的类型 GPUTextureViewDescriptor

dictionary GPUTextureViewDescriptor : GPUObjectDescriptorBase {   GPUTextureFormat format;   GPUTextureViewDimension dimension;   GPUTextureAspect aspect = "all";   GPUIntegerCoordinate baseMipLevel = 0;   GPUIntegerCoordinate mipLevelCount;   GPUIntegerCoordinate baseArrayLayer = 0;   GPUIntegerCoordinate arrayLayerCount; };  enum GPUTextureViewDimension {   "1d",   "2d",   "2d-array",   "cube",   "cube-array",   "3d" };  enum GPUTextureAspect {   "all",   "stencil-only",   "depth-only" };
  • 参数 format 即格式,同 GPUTexture;
  • 参数 dimension 与 GPUTexture 的 GPUTextureDimension 不大一样,是 GPUTextureViewDimension 类型的,多了几个值;
  • 参数 aspect 是枚举类型 GPUTextureAspect 的,指定这个 GPUTextureView 用到纹理对象的哪些方面;
  • 参数 baseMipLevel 为 unsigned long 类型,它指定其 mipmap(多级纹理)的基础等级,默认是 0;
  • 参数 mipLevelCount 为 unsigned long 类型,它与 GPUTexture 的 mipLevelCount 意义相同;
  • 参数 baseArrayLayer 为 unsigned long 类型,它默认值是 0;
  • 参数 arrayLayerCount 为 unsigned long 类型。

创建时参数不合法的情况

同样的,对这些参数也有一定的限制。

一旦有符合以下逻辑的,会产生 GPUValidationError,并返回一个无效的 GPUTextureView

  • 对应的纹理对象失效;
  • 如果参数 aspect 是 “stencil-only”:
    • 参数 format 不是 WebGPU Spec 24.1.2 深度/模板纹理格式类型 的纹理格式中有模板的那一类
  • 如果参数 aspect 是 “depth-only”:
    • 参数 format 不是 WebGPU Spec 24.1.2 深度/模板纹理格式类型 的纹理格式中有深度的那一类
  • 参数 mipLevelCount 小于等于 0;
  • 参数 baseMipLevel + mipLevelCount 的和大于了 mipLevelCount
  • 参数 arrayLayerCount 小于等于 0;
  • 参数 baseArrayLayer + arrayLayerCount 的和大于了 arrayLayerCoun;
  • 参数 format 不是 GPUTextureFormat 类型的;
  • 如果参数 dimension 是 “1d”,且 arrayLayerCount 不是 1;
  • 如果参数 dimension 是 “2d”,且 arrayLayerCount 不是 1;
  • 如果参数 dimension 是 “2d-array”,且纹理对象的 descriptor 的 dimension 不是 “2d”
  • 如果参数 dimension 是 “cube”,且
    • arrayLayerCount 不是 6 或
    • 纹理对象的 descriptor.size 的 width 和 height 不一样

系列博客目录传送门:https://xiaozhuanlan.com/topic/9587342601

  • 1 纹理的创建
    • 举例
    • 创建时参数不合法的情况
  • 2 纹理视图 GPUTextureView
    • 创建时参数不合法的情况


1 纹理的创建

纹理由 device.createTexture() 创建,类型是 GPUTexture

[Exposed=(Window, DedicatedWorker), SecureContext] interface GPUTexture {   GPUTextureView createView(optional GPUTextureViewDescriptor descriptor = {});    undefined destroy(); }; GPUTexture includes GPUObjectBase;

createTexture 方法需要一个 GPUTextureDescriptor 类型的对象:

dictionary GPUTextureDescriptor : GPUObjectDescriptorBase {   required GPUExtent3D size;   GPUIntegerCoordinate mipLevelCount = 1;   GPUSize32 sampleCount = 1;   GPUTextureDimension dimension = "2d";   required GPUTextureFormat format;   required GPUTextureUsageFlags usage; };

有三个必选参数:

  • size: GPUExtent3D 类型,表示
    • GPUExtent3D 类型
  • format: GPUTextureFormat 类型,即纹理的格式;
    • GPUTextureFormat 是一个比较大的部分,见本文中的后面部分介绍 纹理格式
  • usage: GPUTextureUsageFlags 类型,即纹理的用途;
    • GPUTextureUsage 是一个枚举类型,有 5 个可选值 COPY_SRCCOPY_DSTTEXTURE_BINDINGSTORAGE_BINDINGRENDER_ATTACHMENT,分别代表十六进制值 0x010x020x040x080x10
typedef [EnforceRange] unsigned long GPUTextureUsageFlags; [Exposed=(Window, DedicatedWorker)] namespace GPUTextureUsage {   const GPUFlagsConstant COPY_SRC          = 0x01;   const GPUFlagsConstant COPY_DST          = 0x02;   const GPUFlagsConstant TEXTURE_BINDING   = 0x04;   const GPUFlagsConstant STORAGE_BINDING   = 0x08;   const GPUFlagsConstant RENDER_ATTACHMENT = 0x10; };

还有三个可选参数:

  • mipLevelCount,类型是 unsigned long,默认值是 1,表示 mipmap 的等级数
  • sampleCount,类型是 unsigned long,默认值是 1,表示采样次数,只能是 1 或 4
  • dimension,类型是 GPUTextureDimension 枚举,默认值是 "2d",表示纹理的维度,即默认是二维纹理;

GPUTextureDimension 的定义如下:

enum GPUTextureDimension {   "1d",   "2d",   "3d", };

译者注:mipLevelCount 中所提及的 mipmap,即多级纹理,类似金字塔技术,而 mipLevelCount 即多级纹理的有多少级。

举例

例如,创建一个用于多重采样抗锯齿渲染的纹理,其用途是 GPUTextureUsage.RENDER_ATTACHMENT(即颜色附件),采样次数为 4 次,分辨率同 canvas 的绘制分辨率(设为 800 × 600),那么:

const msaaTexture = device.createTexture({   size: {     width: 800,     height: 600,   },   sampleCount: 4,   format: "bgra8unorm",   usage: GPUTextureUsage.RENDER_ATTACHMENT })

又或者,你要创建一个再普通不过的漫反射贴图纹理,这个漫反射贴图图片大小是 256 × 256:

const texture = device.createTexture({   size: [256, 256],   format: "rgba8unorm",   usage: GPUTextureUsage.SAMPLED | GPUTextureUsage.COPY_DST })

关于如何将 JavaScript 中读取到。的图片数据传递给纹理对象,请参考本文 为纹理输入图片/视频数据。

创建时参数不合法的情况

接下来要说明创建纹理对象时,参数设置有问题的情况:

  • 如果 format 参数用的 GPUTextureFormatdevice.features 中没有启用,那么会报错;
  • 如果触发了下列逻辑关系,那么会返回一个不可用的 GPUTexture 对象,并产生一个 GPUValidationError 错误:
    • 设备对象不可用;
    • size 参数的 width、height、depthOrArrayLayers 属性不是正整数;
    • mipLevelCount 不是正整数;
    • sampleCount 既不是 1 也不是 4;
    • dimension 参数如果是 “1d” 且
    • size 参数的 width 属性大于了设备限制列表中的 maxTextureDimension1D
    • size 参数的 height 属性值不是 1
    • size 参数的 depthOrArrayLayers 不是1
    • sampleCount 参数不是1
    • format 被设为一种压缩格式或 深度/模板 类型的格式
    • dimension 参数如果是 “2d” 且
    • size 参数的 width 属性大于了设备限制列表中的 maxTextureDimension2D
    • size 参数的 height 属性大于了设备限制列表中的 maxTextureDimension2D
    • size 参数的 depthOrArrayLayers 属性大于或等于了设备限制列表中的 maxTextureArrayLayers
    • dimension 参数如果是 “3d” 且
    • size 参数的 width 属性大于了设备限制列表中的 maxTextureDimension3D
    • size 参数的 height 属性大于了设备限制列表中的 maxTextureDimension3D
    • size 参数的 depthOrArrayLayers 属性大于或等于了设备限制列表中的 maxTextureArrayLayers
    • sampleCount 参数不是1
    • format 被设为一种压缩格式或 深度/模板 类型的格式
    • size 参数的 width 属性不是 纹素(texel)块的宽的整数倍;
    • size 参数的 height 属性不是 纹素块高的整数倍
    • 如果 sampleCount 参数大于 1 且
    • mipLevelCount 不是 1
    • size.depthOrArrayLayers 不是 1
    • usage 包括了 STORAGE_BINDING 类型
    • format 不是可渲染类型(即颜色格式或深度/模板格式)
    • mipLevelCount 大于了最大 mip 等级计数值(最大 mip 等级计数值取值函数稍后)
    • usage 不是 GPUTextureUsage 的联合类型
    • usage 若包括 RENDER_ATTACHMENT,但是 format 参数不是可渲染类型(即颜色格式或深度/模板格式)
    • usage 包括 STORAGE_ATTACHMENT,但是 format 参数不是纯色格式表中的 STORAGE_BINDING 类型的格式(参考 WebGPU Spec 24.1.1 Plain color formats 纯色格式)

很长,但是不需要完全记忆,仅需在报错的时候来找原因即可。

最大 mip 等级计数值取值函数 伪代码:

创建 GPUTexture 的参数:dimension, size; 如果 dimension:     是 "1d", 令 m = size.width     是 "2d", 令 m = max(size.width, size.height)     是 "3d", 令 m = max(max(size.width, size.height), size.depthOrArrayLayers)  返回 floor(log_2(m)) + 1

2 纹理视图 GPUTextureView

截至发文,官方暂时还未对纹理视图对象做出定义,可能借鉴了经典的 Model – View 设计吧。

总之,纹理要通过绑定组对象(GPUBindGroup)传递给着色器,或者要传递给可编程通道编码器(GPUProgramablePassEncoder),必须是传递其纹理视图对象。

创建纹理视图对象其实蛮简单,由纹理对象调用其 createView() 方法即可,这个方法的参数对象可以不传递(通常大多数时候是如此)。

来看看这个可选但不可空的创建参数对象的类型 GPUTextureViewDescriptor

dictionary GPUTextureViewDescriptor : GPUObjectDescriptorBase {   GPUTextureFormat format;   GPUTextureViewDimension dimension;   GPUTextureAspect aspect = "all";   GPUIntegerCoordinate baseMipLevel = 0;   GPUIntegerCoordinate mipLevelCount;   GPUIntegerCoordinate baseArrayLayer = 0;   GPUIntegerCoordinate arrayLayerCount; };  enum GPUTextureViewDimension {   "1d",   "2d",   "2d-array",   "cube",   "cube-array",   "3d" };  enum GPUTextureAspect {   "all",   "stencil-only",   "depth-only" };
  • 参数 format 即格式,同 GPUTexture;
  • 参数 dimension 与 GPUTexture 的 GPUTextureDimension 不大一样,是 GPUTextureViewDimension 类型的,多了几个值;
  • 参数 aspect 是枚举类型 GPUTextureAspect 的,指定这个 GPUTextureView 用到纹理对象的哪些方面;
  • 参数 baseMipLevel 为 unsigned long 类型,它指定其 mipmap(多级纹理)的基础等级,默认是 0;
  • 参数 mipLevelCount 为 unsigned long 类型,它与 GPUTexture 的 mipLevelCount 意义相同;
  • 参数 baseArrayLayer 为 unsigned long 类型,它默认值是 0;
  • 参数 arrayLayerCount 为 unsigned long 类型。

创建时参数不合法的情况

同样的,对这些参数也有一定的限制。

一旦有符合以下逻辑的,会产生 GPUValidationError,并返回一个无效的 GPUTextureView

  • 对应的纹理对象失效;
  • 如果参数 aspect 是 “stencil-only”:
    • 参数 format 不是 WebGPU Spec 24.1.2 深度/模板纹理格式类型 的纹理格式中有模板的那一类
  • 如果参数 aspect 是 “depth-only”:
    • 参数 format 不是 WebGPU Spec 24.1.2 深度/模板纹理格式类型 的纹理格式中有深度的那一类
  • 参数 mipLevelCount 小于等于 0;
  • 参数 baseMipLevel + mipLevelCount 的和大于了 mipLevelCount
  • 参数 arrayLayerCount 小于等于 0;
  • 参数 baseArrayLayer + arrayLayerCount 的和大于了 arrayLayerCoun;
  • 参数 format 不是 GPUTextureFormat 类型的;
  • 如果参数 dimension 是 “1d”,且 arrayLayerCount 不是 1;
  • 如果参数 dimension 是 “2d”,且 arrayLayerCount 不是 1;
  • 如果参数 dimension 是 “2d-array”,且纹理对象的 descriptor 的 dimension 不是 “2d”
  • 如果参数 dimension 是 “cube”,且
    • arrayLayerCount 不是 6 或
    • 纹理对象的 descriptor.size 的 width 和 height 不一样

系列博客目录传送门:https://xiaozhuanlan.com/topic/9587342601

  • 1 纹理的创建
    • 举例
    • 创建时参数不合法的情况
  • 2 纹理视图 GPUTextureView
    • 创建时参数不合法的情况


1 纹理的创建

纹理由 device.createTexture() 创建,类型是 GPUTexture

[Exposed=(Window, DedicatedWorker), SecureContext] interface GPUTexture {   GPUTextureView createView(optional GPUTextureViewDescriptor descriptor = {});    undefined destroy(); }; GPUTexture includes GPUObjectBase;

createTexture 方法需要一个 GPUTextureDescriptor 类型的对象:

dictionary GPUTextureDescriptor : GPUObjectDescriptorBase {   required GPUExtent3D size;   GPUIntegerCoordinate mipLevelCount = 1;   GPUSize32 sampleCount = 1;   GPUTextureDimension dimension = "2d";   required GPUTextureFormat format;   required GPUTextureUsageFlags usage; };

有三个必选参数:

  • size: GPUExtent3D 类型,表示
    • GPUExtent3D 类型
  • format: GPUTextureFormat 类型,即纹理的格式;
    • GPUTextureFormat 是一个比较大的部分,见本文中的后面部分介绍 纹理格式
  • usage: GPUTextureUsageFlags 类型,即纹理的用途;
    • GPUTextureUsage 是一个枚举类型,有 5 个可选值 COPY_SRCCOPY_DSTTEXTURE_BINDINGSTORAGE_BINDINGRENDER_ATTACHMENT,分别代表十六进制值 0x010x020x040x080x10
typedef [EnforceRange] unsigned long GPUTextureUsageFlags; [Exposed=(Window, DedicatedWorker)] namespace GPUTextureUsage {   const GPUFlagsConstant COPY_SRC          = 0x01;   const GPUFlagsConstant COPY_DST          = 0x02;   const GPUFlagsConstant TEXTURE_BINDING   = 0x04;   const GPUFlagsConstant STORAGE_BINDING   = 0x08;   const GPUFlagsConstant RENDER_ATTACHMENT = 0x10; };

还有三个可选参数:

  • mipLevelCount,类型是 unsigned long,默认值是 1,表示 mipmap 的等级数
  • sampleCount,类型是 unsigned long,默认值是 1,表示采样次数,只能是 1 或 4
  • dimension,类型是 GPUTextureDimension 枚举,默认值是 "2d",表示纹理的维度,即默认是二维纹理;

GPUTextureDimension 的定义如下:

enum GPUTextureDimension {   "1d",   "2d",   "3d", };

译者注:mipLevelCount 中所提及的 mipmap,即多级纹理,类似金字塔技术,而 mipLevelCount 即多级纹理的有多少级。

举例

例如,创建一个用于多重采样抗锯齿渲染的纹理,其用途是 GPUTextureUsage.RENDER_ATTACHMENT(即颜色附件),采样次数为 4 次,分辨率同 canvas 的绘制分辨率(设为 800 × 600),那么:

const msaaTexture = device.createTexture({   size: {     width: 800,     height: 600,   },   sampleCount: 4,   format: "bgra8unorm",   usage: GPUTextureUsage.RENDER_ATTACHMENT })

又或者,你要创建一个再普通不过的漫反射贴图纹理,这个漫反射贴图图片大小是 256 × 256:

const texture = device.createTexture({   size: [256, 256],   format: "rgba8unorm",   usage: GPUTextureUsage.SAMPLED | GPUTextureUsage.COPY_DST })

关于如何将 JavaScript 中读取到。的图片数据传递给纹理对象,请参考本文 为纹理输入图片/视频数据。

创建时参数不合法的情况

接下来要说明创建纹理对象时,参数设置有问题的情况:

  • 如果 format 参数用的 GPUTextureFormatdevice.features 中没有启用,那么会报错;
  • 如果触发了下列逻辑关系,那么会返回一个不可用的 GPUTexture 对象,并产生一个 GPUValidationError 错误:
    • 设备对象不可用;
    • size 参数的 width、height、depthOrArrayLayers 属性不是正整数;
    • mipLevelCount 不是正整数;
    • sampleCount 既不是 1 也不是 4;
    • dimension 参数如果是 “1d” 且
    • size 参数的 width 属性大于了设备限制列表中的 maxTextureDimension1D
    • size 参数的 height 属性值不是 1
    • size 参数的 depthOrArrayLayers 不是1
    • sampleCount 参数不是1
    • format 被设为一种压缩格式或 深度/模板 类型的格式
    • dimension 参数如果是 “2d” 且
    • size 参数的 width 属性大于了设备限制列表中的 maxTextureDimension2D
    • size 参数的 height 属性大于了设备限制列表中的 maxTextureDimension2D
    • size 参数的 depthOrArrayLayers 属性大于或等于了设备限制列表中的 maxTextureArrayLayers
    • dimension 参数如果是 “3d” 且
    • size 参数的 width 属性大于了设备限制列表中的 maxTextureDimension3D
    • size 参数的 height 属性大于了设备限制列表中的 maxTextureDimension3D
    • size 参数的 depthOrArrayLayers 属性大于或等于了设备限制列表中的 maxTextureArrayLayers
    • sampleCount 参数不是1
    • format 被设为一种压缩格式或 深度/模板 类型的格式
    • size 参数的 width 属性不是 纹素(texel)块的宽的整数倍;
    • size 参数的 height 属性不是 纹素块高的整数倍
    • 如果 sampleCount 参数大于 1 且
    • mipLevelCount 不是 1
    • size.depthOrArrayLayers 不是 1
    • usage 包括了 STORAGE_BINDING 类型
    • format 不是可渲染类型(即颜色格式或深度/模板格式)
    • mipLevelCount 大于了最大 mip 等级计数值(最大 mip 等级计数值取值函数稍后)
    • usage 不是 GPUTextureUsage 的联合类型
    • usage 若包括 RENDER_ATTACHMENT,但是 format 参数不是可渲染类型(即颜色格式或深度/模板格式)
    • usage 包括 STORAGE_ATTACHMENT,但是 format 参数不是纯色格式表中的 STORAGE_BINDING 类型的格式(参考 WebGPU Spec 24.1.1 Plain color formats 纯色格式)

很长,但是不需要完全记忆,仅需在报错的时候来找原因即可。

最大 mip 等级计数值取值函数 伪代码:

创建 GPUTexture 的参数:dimension, size; 如果 dimension:     是 "1d", 令 m = size.width     是 "2d", 令 m = max(size.width, size.height)     是 "3d", 令 m = max(max(size.width, size.height), size.depthOrArrayLayers)  返回 floor(log_2(m)) + 1

2 纹理视图 GPUTextureView

截至发文,官方暂时还未对纹理视图对象做出定义,可能借鉴了经典的 Model – View 设计吧。

总之,纹理要通过绑定组对象(GPUBindGroup)传递给着色器,或者要传递给可编程通道编码器(GPUProgramablePassEncoder),必须是传递其纹理视图对象。

创建纹理视图对象其实蛮简单,由纹理对象调用其 createView() 方法即可,这个方法的参数对象可以不传递(通常大多数时候是如此)。

来看看这个可选但不可空的创建参数对象的类型 GPUTextureViewDescriptor

dictionary GPUTextureViewDescriptor : GPUObjectDescriptorBase {   GPUTextureFormat format;   GPUTextureViewDimension dimension;   GPUTextureAspect aspect = "all";   GPUIntegerCoordinate baseMipLevel = 0;   GPUIntegerCoordinate mipLevelCount;   GPUIntegerCoordinate baseArrayLayer = 0;   GPUIntegerCoordinate arrayLayerCount; };  enum GPUTextureViewDimension {   "1d",   "2d",   "2d-array",   "cube",   "cube-array",   "3d" };  enum GPUTextureAspect {   "all",   "stencil-only",   "depth-only" };
  • 参数 format 即格式,同 GPUTexture;
  • 参数 dimension 与 GPUTexture 的 GPUTextureDimension 不大一样,是 GPUTextureViewDimension 类型的,多了几个值;
  • 参数 aspect 是枚举类型 GPUTextureAspect 的,指定这个 GPUTextureView 用到纹理对象的哪些方面;
  • 参数 baseMipLevel 为 unsigned long 类型,它指定其 mipmap(多级纹理)的基础等级,默认是 0;
  • 参数 mipLevelCount 为 unsigned long 类型,它与 GPUTexture 的 mipLevelCount 意义相同;
  • 参数 baseArrayLayer 为 unsigned long 类型,它默认值是 0;
  • 参数 arrayLayerCount 为 unsigned long 类型。

创建时参数不合法的情况

同样的,对这些参数也有一定的限制。

一旦有符合以下逻辑的,会产生 GPUValidationError,并返回一个无效的 GPUTextureView

  • 对应的纹理对象失效;
  • 如果参数 aspect 是 “stencil-only”:
    • 参数 format 不是 WebGPU Spec 24.1.2 深度/模板纹理格式类型 的纹理格式中有模板的那一类
  • 如果参数 aspect 是 “depth-only”:
    • 参数 format 不是 WebGPU Spec 24.1.2 深度/模板纹理格式类型 的纹理格式中有深度的那一类
  • 参数 mipLevelCount 小于等于 0;
  • 参数 baseMipLevel + mipLevelCount 的和大于了 mipLevelCount
  • 参数 arrayLayerCount 小于等于 0;
  • 参数 baseArrayLayer + arrayLayerCount 的和大于了 arrayLayerCoun;
  • 参数 format 不是 GPUTextureFormat 类型的;
  • 如果参数 dimension 是 “1d”,且 arrayLayerCount 不是 1;
  • 如果参数 dimension 是 “2d”,且 arrayLayerCount 不是 1;
  • 如果参数 dimension 是 “2d-array”,且纹理对象的 descriptor 的 dimension 不是 “2d”
  • 如果参数 dimension 是 “cube”,且
    • arrayLayerCount 不是 6 或
    • 纹理对象的 descriptor.size 的 width 和 height 不一样

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » WebGPU 规范篇 04 纹理求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们