GPURenderPassEncoder:setIndexBuffer() 方法

可用性有限

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

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

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

GPURenderPassEncoder 接口的 setIndexBuffer() 方法用于设置当前将为后续绘图命令提供索引数据的 GPUBuffer

语法

js
setIndexBuffer(buffer, indexFormat, offset, size)

参数

buffer

一个表示包含要用于后续绘图命令的索引数据的缓冲区的 GPUBuffer

indexFormat

一个枚举值,用于定义 buffer 中包含的索引数据的格式。可能的值为:

  • "uint16"
  • "uint32"
offset 可选

一个数字,表示 buffer 中索引数据开始位置的字节偏移量。如果省略,offset 默认为 0。

size 可选

一个数字,表示 buffer 中包含的索引数据的字节大小。如果省略,size 默认为 bufferGPUBuffer.size - offset

关于 indexFormat 的说明

indexFormat 既决定了缓冲区中索引值的数据类型,也决定了(当与指定条带图元拓扑("line-strip""triangle-strip")的管线一起使用时)图元重启值。图元重启值是一个索引值,表示应该开始一个新图元,而不是继续使用先前的索引顶点来构建条带。对于 "uint16",该值为 0xFFFF;对于 "uint32",该值为 0xFFFFFFFF

返回值

无 (Undefined)。

验证

调用 setIndexBuffer() 时必须满足以下条件,否则会生成 GPUValidationError,并且 GPURenderPassEncoder 会失效:

  • bufferGPUBuffer.usage 包含 GPUBufferUsage.INDEX 标志。
  • offset + size 小于或等于 bufferGPUBuffer.size
  • offsetindexFormat 的字节大小("uint16" 为 2,"uint32" 为 4)的倍数。

示例

在 WebGPU Samples 的 阴影映射 示例中,setIndexBuffer() 在每个动画帧中被用于两个独立的渲染通道:一个用于绘制主模型,另一个用于绘制其阴影。请参阅示例代码列表以获取完整上下文。

js
// …

const commandEncoder = device.createCommandEncoder();
{
  const shadowPass = commandEncoder.beginRenderPass(shadowPassDescriptor);
  shadowPass.setPipeline(shadowPipeline);
  shadowPass.setBindGroup(0, sceneBindGroupForShadow);
  shadowPass.setBindGroup(1, modelBindGroup);
  shadowPass.setVertexBuffer(0, vertexBuffer);
  shadowPass.setIndexBuffer(indexBuffer, "uint16");
  shadowPass.drawIndexed(indexCount);

  shadowPass.end();
}
{
  const renderPass = commandEncoder.beginRenderPass(renderPassDescriptor);
  renderPass.setPipeline(pipeline);
  renderPass.setBindGroup(0, sceneBindGroupForRender);
  renderPass.setBindGroup(1, modelBindGroup);
  renderPass.setVertexBuffer(0, vertexBuffer);
  renderPass.setIndexBuffer(indexBuffer, "uint16");
  renderPass.drawIndexed(indexCount);

  renderPass.end();
}

// …

规范

规范
WebGPU
# dom-gpurendercommandsmixin-setindexbuffer

浏览器兼容性

另见