GPUQueue: writeTexture() 方法
注意:此功能在 Web Workers 中可用。
GPUQueue 接口的 writeTexture() 方法会将提供的数据源写入指定的 GPUTexture。
这是一个便捷函数,它提供了一种替代方法,无需通过缓冲区映射和缓冲区到纹理的复制来设置纹理数据。它允许用户代理确定将数据复制过去的最有效方式。
语法
writeTexture(destination, data, dataLayout, size)
参数
destination-
一个定义要写入数据源的纹理子资源和起点的对象,可以包含以下属性:
aspect可选-
一个枚举值,定义要向纹理写入数据的哪个方面。可能的值有:
"all"-
将写入纹理格式的所有可用方面,这可能意味着颜色、深度和模板中的全部或任何一个,具体取决于您处理的格式类型。
"depth-only"-
仅将数据写入 深度或模板格式 的深度方面。
"stencil-only"-
仅将数据写入深度或模板格式的模板方面。
如果省略,
aspect的值为"all"。 mipLevel可选-
一个数字,表示要将数据写入的纹理的 mip-map 级别。如果省略,
mipLevel默认为 0。 origin可选-
一个对象或数组,指定复制的起点——要将数据写入的纹理区域的最小角。与
size一起,这定义了要复制区域的完整范围。如果省略了origin中的任何一个(x、y、z),则它们默认为 0。例如,您可以传递一个数组,如
[0, 0, 0],或其等效对象{ x: 0, y: 0, z: 0 }。 texture-
一个表示要写入数据的
GPUTexture对象。
data-
一个对象,表示要写入
GPUTexture的数据源。它可以是ArrayBuffer、TypedArray或DataView。 dataLayout-
一个对象,定义
data中包含的内容的布局。可能的值有:offset可选-
从
data开始到要复制的图像数据开头的字节偏移量。如果省略,offset默认为 0。 bytesPerRow可选-
一个数字,表示每个块行(即,一个完整的 texel 块行)和后续块行之间的字节步长。如果存在多个块行(即,复制高度或深度大于一个块),则此项是必需的。
rowsPerImage可选-
单个纹理图像的块行数。
bytesPerRow×rowsPerImage将给出每个完整图像开始之间的字节步长。如果要复制多个图像,则此项是必需的。
size-
一个对象或数组,指定复制的范围——要将数据写入的纹理区域的最远角。与
destination.origin一起,这定义了要复制区域的完整范围。有关对象/数组结构的示例,请参见destination.origin。
返回值
无 (Undefined)。
验证
调用 writeTexture() 时必须满足以下条件,否则将生成 GPUValidationError,并且 GPUQueue 将无效:
mipLevel小于目标GPUTexture.mipLevelCount。origin.x是目标GPUTexture.format的 texel 块宽度的倍数。origin.y是目标GPUTexture.format的 texel 块高度的倍数。- 如果目标
GPUTexture.format是 深度或模板格式,或者GPUTexture.sampleCount大于 1,则子资源大小等于size。 - 目标
GPUTexture.usage包含GPUTextureUsage.COPY_DST标志。 - 目标
GPUTexture.sampleCount为 1。 destination.origin.x+ 目标GPUTexture.width小于或等于要写入目标GPUTexture的子资源的宽度。destination.origin.y+ 目标GPUTexture.height小于或等于要写入目标GPUTexture的子资源的高度。destination.origin.z+ 目标GPUTexture.depthOrArrayLayers小于或等于要写入目标GPUTexture的子资源的 depthOrArrayLayers。- 目标
GPUTexture.width是目标GPUTexture.format的 texel 块宽度的倍数。 - 目标
GPUTexture.height是目标GPUTexture.format的 texel 块高度的倍数。 destination.aspect指的是目标GPUTexture.format的单个方面。- 该方面是根据 深度或模板格式有效可复制的图像。
- 目标在其他方面与
GPUTexture.format兼容。
示例
在 高效渲染 glTF 模型 中,定义了一个用于创建纯色纹理的函数。
function createSolidColorTexture(r, g, b, a) {
const data = new Uint8Array([r * 255, g * 255, b * 255, a * 255]);
const texture = device.createTexture({
size: { width: 1, height: 1 },
format: "rgba8unorm",
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
});
device.queue.writeTexture({ texture }, data, {}, { width: 1, height: 1 });
return texture;
}
这可用于为材质库定义标准纹理。
const opaqueWhiteTexture = createSolidColorTexture(1, 1, 1, 1);
const transparentBlackTexture = createSolidColorTexture(0, 0, 0, 0);
const defaultNormalTexture = createSolidColorTexture(0.5, 0.5, 1, 1);
规范
| 规范 |
|---|
| WebGPU # dom-gpuqueue-writetexture |
浏览器兼容性
加载中…