GPURenderPassEncoder: phương thức drawIndirect()
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 drawIndirect() của giao diện GPURenderPassEncoder vẽ các nguyên thủy sử dụng các tham số được đọc từ GPUBuffer.
Cú pháp
drawIndirect(indirectBuffer, indirectOffset)
Tham số
indirectBuffer-
Một
GPUBufferchứa các giá trịvertexCount,instanceCount,firstVertexvàfirstInstancecần thiết để thực hiện thao tác vẽ. Bộ đệm phải chứa một khối bốn 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 16 byte), theo cùng thứ tự như các đối số choGPURenderPassEncoder.draw(). Ví dụ:jsconst uint32 = new Uint32Array(4); uint32[0] = 3; // The vertexCount value uint32[1] = 1; // The instanceCount value uint32[2] = 0; // The firstVertex value uint32[3] = 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ọidrawIndirect()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);
// Create drawIndirect values
const uint32 = new Uint32Array(4);
uint32[0] = 3;
uint32[1] = 1;
uint32[2] = 0;
uint32[3] = 0;
// Create a GPUBuffer and write the draw values into it
const drawValues = device.createBuffer({
size: 16,
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT,
});
device.queue.writeBuffer(drawValues, 0, uint32, 0, uint32.length);
// Draw the vertices
passEncoder.drawIndirect(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-drawindirect> |