มีอะไรใหม่ใน WebGPU (Chrome 149-150)

François Beaufort
François Beaufort

เผยแพร่: 17 มิถุนายน 2026

Immediates

ค่าคงที่ทันที หรือที่เรียกว่าค่าคงที่แบบพุชหรือค่าคงที่รูท ช่วยให้คุณส่งข้อมูลจำนวนเล็กน้อยที่เปลี่ยนแปลงบ่อยไปยัง Shader ได้โดยตรง กระบวนการนี้จะข้ามค่าใช้จ่ายในการสร้างบัฟเฟอร์ GPU และการจัดการกลุ่มการเชื่อมโยง

การอัปเดตการเชื่อมโยงบัฟเฟอร์แบบสม่ำเสมอสำหรับข้อมูลที่เปลี่ยนแปลงทุกครั้งที่มีการเรียกใช้การวาด เช่น รหัสออบเจ็กต์ที่ไม่ซ้ำกันหรือเมทริกซ์การเปลี่ยนรูปแบบ 3 มิติสำหรับออบเจ็กต์หลายร้อยรายการ จะทำให้เกิดค่าใช้จ่ายของ CPU แทรกค่าดิบลงในเครื่องมือเข้ารหัสบัตรโดยตรงเพื่อหลีกเลี่ยงการเขียนข้อมูลลงในหน่วยความจำและการจัดการการค้นหา GPU

ตัวแปรทันทีเป็นเส้นทางที่รวดเร็วสำหรับตัวแปรขนาดเล็กที่มีการเปลี่ยนแปลงสูง ใช้บัฟเฟอร์แบบสม่ำเสมอหรือบัฟเฟอร์พื้นที่เก็บข้อมูลสำหรับอาร์เรย์ข้อมูลขนาดใหญ่ โครงสร้างแสงที่ซับซ้อน หรือเมทริกซ์ขนาดใหญ่

ใน Shader WGSL <immediate> Address Space ช่วยให้คุณกำหนดข้อมูลทันทีที่ส่งไปยัง Pass Encoder ได้โดยตรง เรียกใช้ setImmediates() ใน JavaScript ก่อนคำสั่งประมวลผลเพื่อระบุข้อมูลนี้โดยไม่ต้องผูกกลุ่ม หากต้องการตรวจสอบการรองรับ ให้ตรวจหาฟีเจอร์immediate_address_spaceส่วนขยายภาษา WGSL ผ่าน navigator.gpu.wgslLanguageFeatures ดูตัวอย่างต่อไปนี้และความตั้งใจที่จะจัดส่ง

if (!navigator.gpu.wgslLanguageFeatures.has('immediate_address_space')) {
   throw new Error(`WGSL immediate address space is not available`);
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const module = device.createShaderModule({ code: `
  requires immediate_address_space;

  var<immediate> color: vec4f;

  @vertex fn vertexMain(@builtin(vertex_index) i : u32) -> @builtin(position) vec4f {
    const pos = array(vec2f(0, 1), vec2f(-1, -1), vec2f(1, -1));
    return vec4f(pos[i], 0, 1);
  }

  @fragment fn fragmentMain() -> @location(0) vec4f {
    return color;
  }`,
});

// Create render pass encoder (omitted)...

// By using layout: 'auto', WebGPU will automatically infer the `immediateSize`
// required by the pipeline layout from the WGSL module.
const pipeline = device.createRenderPipeline({
  layout: 'auto',
  vertex: { module },
  fragment: { module, targets: [{ format }] },
});
myRenderPassEncoder.setPipeline(pipeline);

// Send immediate data to the GPU, then issue a draw call
myRenderPassEncoder.setImmediates(/*rangeOffset=*/0, new Float32Array([255, 0, 0, 255]));
myRenderPassEncoder.draw(3);
myRenderPassEncoder.end();

หากต้องการเจาะลึกฟีเจอร์นี้ โปรดดูWebGPUFundamentals Immediates

ขอขอบคุณทีมงานที่ Microsoft สำหรับการมีส่วนร่วม

การตรวจสอบที่เข้มงวดขึ้นสำหรับไฟล์แนบชั่วคราว

WebGPU เพิ่งเปิดตัวแฟล็ก TRANSIENT_ATTACHMENT GPUTextureUsage ซึ่งช่วยให้นักพัฒนาแอปสร้างไฟล์แนบการแสดงผลชั่วคราว เช่น บัฟเฟอร์ความลึก-สเตนซิลหรือเป้าหมายแบบหลายตัวอย่าง ไฟล์แนบเหล่านี้จะอยู่ในหน่วยความจำไทล์ที่รวดเร็วบนชิปโดยไม่ต้องจัดสรร VRAM หลัก

การอัปเดตล่าสุด (#6248 และ #6267) ได้ปรับแต่งกฎการตรวจสอบเพื่อป้องกันการใช้ไฟล์แนบพื้นผิวที่มีประสิทธิภาพด้านหน่วยความจำเหล่านี้ในทางที่ผิด

  • เนื่องจากข้อจำกัดของแพลตฟอร์ม viewFormats ต้องเป็นอาร์เรย์ว่างเมื่อสร้างเท็กซ์เจอร์ชั่วคราว ไม่จำเป็นต้องใช้รูปแบบมุมมองอื่นเนื่องจากเท็กซ์เจอร์ชั่วคราวมีไว้สำหรับการแสดงผลเท่านั้น
  • การสร้างมุมมองพื้นผิวไม่ได้จำกัดแฟล็กการใช้งาน เมื่อเรียกใช้ createView() ในเท็กซ์เจอร์ชั่วคราว มุมมองจะเปลี่ยนการใช้งานไม่ได้
  • ใช้ไฟล์แนบชั่วคราวเป็น resolveTarget ภายในการแสดงผลไม่ได้

ข้อมูลอัปเดตเกี่ยวกับ Dawn

นี่เป็นเพียงไฮไลต์สำคัญบางส่วนเท่านั้น ดูรายการคอมมิตทั้งหมด

มีอะไรใหม่ใน WebGPU

รายการทุกอย่างที่ครอบคลุมในซีรีส์มีอะไรใหม่ใน WebGPU

Chrome 149-150

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113