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

瀏覽器相容性

另見