GPURenderPassEncoder: setIndexBuffer() 方法
setIndexBuffer()
方法属于 GPURenderPassEncoder
接口,用于设置当前 GPUBuffer
,该缓冲区将为后续的绘制命令提供索引数据。
语法
js
setIndexBuffer(buffer, indexFormat, offset, size)
参数
buffer
-
一个
GPUBuffer
,表示包含用于后续绘制命令的索引数据的缓冲区。 indexFormat
-
一个枚举值,定义了
buffer
中包含的索引数据的格式。可能的取值包括"uint16"
"uint32"
offset
可选-
一个数字,表示
buffer
中索引数据开始位置的偏移量(以字节为单位)。如果省略,offset
默认值为 0。 size
可选-
一个数字,表示
buffer
中包含的索引数据的字节大小。如果省略,size
默认值为buffer
的GPUBuffer.size
-offset
。
关于 indexFormat 的说明
indexFormat
同时决定了缓冲区中索引值的类型,以及当与指定了条带型基本图形拓扑 ("line-strip"
或 "triangle-strip"
) 的管线一起使用时,也决定了基本图形重启值。基本图形重启值是一个索引值,表示应该开始一个新的基本图形,而不是使用先前的索引顶点继续构建条带。对于 "uint16"
,该值为 0xFFFF
,对于 "uint32"
,该值为 0xFFFFFFFF
。
返回值
无 (Undefined
)。
验证
调用 setIndexBuffer()
时,必须满足以下条件,否则将生成 GPUValidationError
,并且 GPURenderPassEncoder
将变为无效
buffer
的GPUBuffer.usage
包含GPUBufferUsage.INDEX
标志。offset
+size
小于或等于buffer
的GPUBuffer.size
。offset
是indexFormat
的字节大小的倍数(对于"uint16"
为 2,对于"uint32"
为 4)。
示例
在 WebGPU 示例 Shadow Mapping 中,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 |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。
另请参见
- The WebGPU API