ΠΠΎΠ½ΡΠΎΡΡΠΈΡΠΌ W3C ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠ» ΠΏΠ΅ΡΠ²ΡΠ΅ ΡΠ΅ΡΠ½ΠΎΠ²ΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΉ WebGPU ΠΈ WebGPU Shading Language (WGSL), ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΡ API Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π° GPU, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ·ΡΠΊ ΡΠ΅ΠΉΠ΄ΡΠΎΠ² Π΄Π»Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ GPU. ΠΊΠΎΠ½ΡΠ΅ΠΏΡΡΠ°Π»ΡΠ½ΠΎ ΡΡ ΠΎΠΆΠΈΠΉ Ρ API Vulkan, Metal ΠΈ Direct3D 12. Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½Ρ ΡΠ°Π±ΠΎΡΠ΅ΠΉ Π³ΡΡΠΏΠΏΠΎΠΉ, Π² ΠΊΠΎΡΠΎΡΡΡ Π²ΠΎΡΠ»ΠΈ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΡ ΠΈΠ· Mozilla, Google, Apple ΠΈ Microsoft.
ΠΠΎΠ½ΡΠ΅ΠΏΡΡΠ°Π»ΡΠ½ΠΎ WebGPU ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ WebGL ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ API Vulkan ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ OpenGL, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°Π΅ΡΡΡ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ API, Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΡ ΠΏΡΠΎΡΠ»ΠΎΠΉΠΊΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ΅ ΠΆΠ΅ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Ρ, ΡΡΠΎ ΠΈΠΌΠ΅ΡΡΡΡ Π² Vulkan, Metal ΠΈ Direct3D. WebGPU ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ Π½Π° JavaScript ΡΡΠ΅Π΄ΡΡΠ²Π° Π΄Π»Ρ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π·Π° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΊ GPU, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΌΠΈ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ, ΠΏΠ°ΠΌΡΡΡΡ, Π±ΡΡΠ΅ΡΠ°ΠΌΠΈ, ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΡΠ΅ΠΊΡΡΡΡ ΠΈ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΡΠ΅ΠΉΠ΄Π΅ΡΠ°ΠΌΠΈ. ΠΠΎΠ΄ΠΎΠ±Π½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄ΠΎΠ±ΠΈΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π·Π° ΡΡΡΡ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΡ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΡ ΡΠ°ΡΡ ΠΎΠ΄ΠΎΠ² ΠΈ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΡΠ°Π±ΠΎΡΡ Ρ GPU.
WebGPU Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π΄Π»Ρ Web ΡΠ»ΠΎΠΆΠ½ΡΠ΅ 3D-ΠΏΡΠΎΠ΅ΠΊΡΡ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ Π½Π΅ Ρ ΡΠΆΠ΅, ΡΠ΅ΠΌ ΠΎΠ±ΠΎΡΠΎΠ±Π»Π΅Π½Π½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π½Π°ΠΏΡΡΠΌΡΡ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΠΈΠ΅ΡΡ Ρ Vulkan, Metal ΠΈΠ»ΠΈ Direct3D, Π½ΠΎ Π½Π΅ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΠΌ. WebGPU ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΈ ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π½Π°ΡΠΈΠ²Π½ΡΡ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π² ΡΠΎΡΠΌΡ, ΡΠΏΠΎΡΠΎΠ±Π½ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° Π±Π°Π·Π΅ web-ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π² WebAssembly. ΠΡΠΎΠΌΠ΅ 3D-Π³ΡΠ°ΡΠΈΠΊΠΈ WebGPU ΠΎΡ Π²Π°ΡΡΠ²Π°Π΅Ρ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π²ΡΠ½ΠΎΡΠΎΠΌ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Π½Π° ΡΡΠΎΡΠΎΠ½Ρ GPU ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΠΉΠ΄Π΅ΡΠΎΠ².
Hovedfunksjoner til WebGPU:
- Separat styring av ressurser, forberedende arbeid og overfΓΈring av kommandoer til GPU (i WebGL var ett objekt ansvarlig for alt pΓ₯ en gang). Tre separate kontekster er gitt: GPUenhet for Γ₯ lage ressurser som teksturer og buffere; GPUCommandEncoder for koding av individuelle kommandoer, inkludert gjengivelses- og beregningstrinn; GPUCommandBuffer som skal stΓ₯ i kΓΈ for kjΓΈring pΓ₯ GPU. Resultatet kan gjengis i et omrΓ₯de assosiert med ett eller flere lerretselementer, eller behandles uten utdata (for eksempel nΓ₯r du kjΓΈrer beregningsoppgaver). Γ separere stadiene gjΓΈr det lettere Γ₯ skille ressursopprettings- og forberedelsesoperasjoner i forskjellige behandlere som kan kjΓΈre pΓ₯ forskjellige trΓ₯der.
- En annen tilnΓ¦rming til behandling av tilstander. WebGPU tilbyr to objekter - GPURenderPipeline og GPUComputePipeline, som lar deg kombinere ulike tilstander forhΓ₯ndsdefinert av utvikleren, noe som gjΓΈr at nettleseren ikke kaster bort ressurser pΓ₯ tilleggsarbeid, for eksempel rekompilere shaders. StΓΈttede tilstander inkluderer: skyggelegging, toppunktbuffer og attributtoppsett, klebrige gruppeoppsett, blanding, dybde og mΓΈnstre og utdataformater etter gjengivelse.
- En bindende modell som ligner pΓ₯ Vulkans ressursgrupperingsfunksjoner. For Γ₯ gruppere ressurser sammen, tilbyr WebGPU et GPUBindGroup-objekt, som kan assosieres med andre lignende objekter for bruk i shaders mens du skriver kommandoer. Oppretting av slike grupper lar sjΓ₯fΓΈren utfΓΈre de nΓΈdvendige forberedende handlingene pΓ₯ forhΓ₯nd, og lar nettleseren endre ressursbindinger mellom tegneanrop mye raskere. Oppsettet av ressursbindinger kan forhΓ₯ndsdefineres ved Γ₯ bruke GPUBindGroupLayout-objektet.
Kilde: opennet.ru