GPURenderPassEncoder: phương thức drawIndexedIndirect()
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.
Note: This feature is available in Web Workers.
Phương thức drawIndexedIndirect() của giao diện GPURenderPassEncoder vẽ các nguyên thủy có chỉ mục sử dụng các tham số được đọc từ GPUBuffer.
Cú pháp
drawIndexedIndirect(indirectBuffer, indirectOffset)
Tham số
indirectBuffer-
Một
GPUBufferchứa các giá trịindexCount,instanceCount,firstIndex,baseVertexvàfirstInstancecần thiết để thực hiện thao tác vẽ. Bộ đệm phải chứa một khối năm giá trị số nguyên không dấu 32-bit được đóng gói chặt chẽ biểu diễn các giá trị (tổng cộng 20 byte), theo cùng thứ tự như các đối số choGPURenderPassEncoder.drawIndexed(). Ví dụ:jsconst uint32 = new Uint32Array(5); uint32[0] = 3; // The indexCount value uint32[1] = 1; // The instanceCount value uint32[2] = 0; // The firstIndex value uint32[3] = 0; // The baseVertex value uint32[4] = 0; // The firstInstance value // Write values into a GPUBuffer device.queue.writeBuffer(buffer, 0, uint32, 0, uint32.length);Note: Tính năng
indirect-first-instancefeature cần được bật để sử dụng các giá trịfirstInstancekhác 0. Nếu tính năngindirect-first-instancekhông được bật vàfirstInstancekhác 0, lệnh gọidrawIndexedIndirect()sẽ được xử lý như không có hoạt động nào. indirectOffset-
Độ lệch, tính bằng byte, vào
indirectBuffernơi dữ liệu giá trị bắt đầu.
Giá trị trả về
Không có (Undefined).
Xác thực
Các tiêu chí sau phải được đáp ứng khi gọi drawIndirect(), nếu không GPUValidationError sẽ được tạo ra và GPURenderPassEncoder sẽ không hợp lệ:
GPUBuffer.usagecủaindirectBufferchứa cờGPUBufferUsage.INDIRECT.indirectOffsetcộng với tổng kích thước được chỉ định bởi các tham số giá trị trongindirectBuffernhỏ hơn hoặc bằngGPUBuffer.sizecủaindirectBuffer.indirectOffsetlà bội số của 4.
Ví dụ
// …
// Create GPURenderPassEncoder
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
// Set pipeline and vertex buffer
passEncoder.setPipeline(renderPipeline);
passEncoder.setVertexBuffer(0, vertexBuffer);
passEncoder.setIndexBuffer(indexBuffer, "uint16");
// Create drawIndexedIndirect values
const uint32 = new Uint32Array(5);
uint32[0] = 3;
uint32[1] = 1;
uint32[2] = 0;
uint32[3] = 0;
uint32[4] = 0;
// Create a GPUBuffer and write the draw values into it
const drawValues = device.createBuffer({
size: 20,
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT,
});
device.queue.writeBuffer(drawValues, 0, uint32, 0, uint32.length);
// Draw the vertices
passEncoder.drawIndexedIndirect(drawValues, 0);
// End the render pass
passEncoder.end();
// End frame by passing array of GPUCommandBuffers to command queue for execution
device.queue.submit([commandEncoder.finish()]);
// …
Thông số kỹ thuật
| Specification |
|---|
| WebGPU> # dom-gpurendercommandsmixin-drawindexedindirect> |