【WebGPU学习杂记】纹理格式表

供后续学习查阅检索


纹理类型

共有 “1d”、“2d” 、“3d” 三种纹理类型。可将 “2d” 纹理视为深度为 1 的 “3d” 纹理,而 “1d” 纹理只是高度为 1 的 “2d” 纹理。每种类型的纹理有不同的限制,在设置canvas大小时使用 2d 限制。

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const maxCanvasSize = device.limits.maxTextureDimension2D; // 纹理最大宽高像素值

canvas.width = Math.max(1, Math.min(width, maxCanvasSize));
canvas.height = Math.max(1, Math.min(height, maxCanvasSize));

对于 3d 纹理与 2d 纹理的对比而言,在所有 采样器(滤波器)(sampler) 都设置为 linear 的情况下,3d 纹理采样需要查看 16 个像素并将它们混合在一起。 2d 纹理采样只需要 8 个像素。

纹理视图

  • 1d
  • 2d
  • 3d
  • cube
  • 2d-array
  • cube-array

1d纹理 只能有 “1d” 视图3d纹理 只能有 “3d” 视图2d纹理 可以有 “2d-array” 视图。若 2d纹理6 层,它可以有一个 “cube” 视图。如果是 6 层的倍数,则可以使用 “cube-array” 视图。可以在调用 <yourTexture>.createView 时选择如何查看纹理。纹理视图默认与其尺寸相同,允许可以向 <yourTexture>.createView 传递不同的尺寸。

cube纹理 表示立方体 6 个面的纹理。Cube 纹理通常用于绘制天空框、反射和环境贴图

2d-array纹理 使用时可以选择在着色器中访问数组中的哪种纹理,通常用于地形渲染。

纹理视图与WGSL的对应关系

typeWGSL
1dtexture_1dtexture_storage_1d
2dtexture_2dtexture_storage_2dtexture_multisampled_2dtexture_depth_2dtexture_depth_multisampled_2d
3dtexture_3dtexture_storage_3d
cubetexture_cubetexture_depth_cube
2d-arraytexture_2d_arraytexture_storage_2d_arraytexture_depth_2d_array
cube-arraytexture_cube_arraytexture_depth_cube_array

调用 device.createTexture 默认是2d, 可选 1d2d3d

纹理格式

  • “颜色” 纹理 格式常用 rgba8unorm
格式支持渲染支持多重采样支持写入storage采样类型单位纹素大小
r8unormtruetruefalsefloat1
r8snormfalsefalsefalsefloat1
r8uinttruetruefalseuint1
r8sinttruetruefalsesint1
r16uinttruetruefalseuint2
r16sinttruetruefalsesint2
r16floattruetruefalsefloat2
rg8unormtruetruefalsefloat2
rg8snormfalsefalsefalsefloat2
rg8uinttruetruefalseuint2
rg8sinttruetruefalsesint2
r32uinttruefalsetrueuint4
r32sinttruefalsetruesint4
r32floattruetruetrueunfilterable-float4
rg16uinttruetruefalseuint4
rg16sinttruetruefalsesint4
rg16floattruetruefalsefloat4
rgba8unormtruetruetruefloat4
rgba8unorm-srgbtruetruefalsefloat4
rgba8snormfalsefalsetruefloat4
rgba8uinttruetruetrueuint4
rgba8sinttruetruetruesint4
bgra8unormtruetruefalsefloat4
bgra8unorm-srgbtruetruefalsefloat4
rgb10a2unormtruetruefalsefloat4
rg11b10ufloatfalsefalsefalsefloat4
rgb9e5ufloatfalsefalsefalsefloat4
rg32uinttruefalsetrueuint8
rg32sinttruefalsetruesint8
rg32floattruefalsetrueunfilterable-float8
rgba16uinttruetruetrueuint8
rgba16sinttruetruetruesint8
rgba16floattruetruetruefloat8
rgba32uinttruefalsetrueuint16
rgba32sinttruefalsetruesint16
rgba32floattruefalsetrueunfilterable-float16

“rg16float”rg 字母表示纹理支持的颜色通道支持红色和绿色(2 个通道)。16 表示每个通道都是 16 位。末尾的单词表示通道中的数据类型。“float” 表示浮点数据。

unorm 是无符号归一化数据 [0.0~1.0],表示纹理中的数据从 0 到 N,其中 N 是该位数的最大整数值。该整数范围被解释为(0 至 1)的浮点范围。换句话说,对于 8unorm 纹理来说,就是 8 个比特值域 [0, 255] 被解释为数值 [0.0~1.0]

snorm 是带符号的归一化数据 [-1~1] ,数据范围是从位数所代表的最负整数到最正整数。作为有符号整数 [-128~127] 被转换为 [-1~1]

sint 是有符号整数。uint 是无符号整数。如果有多个字母数字组合,则指定每个通道的位数。例如,rg11b10ufloat 即红色和绿色各 11 位。b1010 位蓝色,它们都是无符号浮点数。

  • 将其用途设置为 GPUTextureUsage.RENDER_ATTACHMENT 表示支持对其进行渲染。

  • 在 WGSL 中 sint 需要 texture_2d<i32>uint 需要 texture_2d<u32>

unfilterable-float(不可过滤浮点型)意味着采样器只能使用 nearest 的格式,这意味着可能需要手动创建一个绑定组布局,不能使用 'auto' 布局因为桌面 GPU 通常可以过滤32 位浮点纹理,大多数移动设备还不能。如果您的适配器支持 float32-filterable 功能并且启用了该功能,那么 r32floatrg32floatrgba32float 格式就会从不可过滤浮点格式转换为浮点格式,这些纹理格式无需其他更改即可正常工作。

深度和模板格式

格式支持渲染支持多重采样支持写入Storage采样类型单位纹素大小支持作为拷贝源支持作为拷贝写入目标特性
depth32floattruetruefalsedepth4truefalse
depth16unormtruetruefalsedepth2truetrue
stencil8truetruefalseuint1truetrue
depth24plustruetruefalsedepthfalsefalse
depth24plus-stencil8truetruefalsedepthfalsefalse
depth32float-stencil8truetruefalsedepthfalsefalsedepth32float-stencil8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值