GPUQueue: writeBuffer() 方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 Web Workers 中可用。

GPUQueue 接口的 writeBuffer() 方法将提供的数据源写入给定的 GPUBuffer

这是一个便捷函数,它提供了一种替代通过 buffer 映射和 buffer-to-buffer 复制来设置 buffer 数据的方式。它允许用户代理确定复制数据的最高效方法。

语法

js
writeBuffer(buffer, bufferOffset, data, dataOffset, size)

参数

buffer

一个代表要写入数据的 GPUBuffer 对象。

bufferOffset

一个数字,表示在 GPUBuffer 中开始写入数据的字节偏移量。

data

一个代表要写入 GPUBuffer 的数据源的对象。这可以是一个 ArrayBufferTypedArrayDataView

dataOffset 可选

一个数字,表示从数据源内部开始写入数据的偏移量。如果 dataTypedArray,则此值为元素的数量;否则,此值为字节数。如果省略,dataOffset 默认为 0。

size 可选

一个数字,表示要从 data 写入 buffer 的内容的大小。如果 dataTypedArray,则此值为元素的数量;否则,此值为字节数。如果省略,size 将等于 data 的总大小减去 dataOffset

返回值

无 (Undefined)。

异常

OperationError DOMException

如果未满足以下标准,则该方法会抛出 OperationError

  • data 的大小等于或大于 0。
  • dataOffset 小于或等于 data 的大小。
  • data 的大小(在转换为字节时,对于 TypedArray)是 4 的倍数。

验证

调用 writeBuffer() 时必须满足以下标准,否则将生成 GPUValidationError,并且 GPUQueue 将变得无效:

  • buffer 可用,即未处于不可用(如果 GPUBuffer 当前已 映射)或已销毁(使用 GPUBuffer.destroy() 方法)状态。
  • bufferGPUBuffer.usage 包含 GPUBufferUsage.COPY_DST 标志。
  • bufferOffset(在转换为字节时)是 4 的倍数。
  • data 的大小 - dataOffset + bufferOffset(在转换为字节时),等于或小于 bufferGPUBuffer.size

示例

在我们 基础渲染演示中,我们在一个 Float32Array 中定义了一些顶点数据,我们将用它来绘制一个三角形。

js
const vertices = new Float32Array([
  0.0, 0.6, 0, 1, 1, 0, 0, 1, -0.5, -0.6, 0, 1, 0, 1, 0, 1, 0.5, -0.6, 0, 1, 0,
  0, 1, 1,
]);

要在此渲染管线中使用这些数据,我们需要将其放入一个 GPUBuffer。首先,我们将创建 buffer。

js
const vertexBuffer = device.createBuffer({
  size: vertices.byteLength, // make it big enough to store vertices in
  usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
});

要将数据放入 buffer,我们可以使用 writeBuffer()

js
device.queue.writeBuffer(vertexBuffer, 0, vertices, 0, vertices.length);

规范

规范
WebGPU
# dom-gpuqueue-writebuffer

浏览器兼容性

另见