WebGPU Shading Language

WebGPU Shading Language (WGSL) is a high-level shading language with a syntax inspired by Rust.[1] It was initially developed by the W3C GPU for the Web Community Group to provide developers with a modern, safe, and portable shading language for the WebGPU API.[2] WGSL is designed to be compiled to SPIR-V or other intermediate representations, enabling execution across different graphics hardware while maintaining security and portability requirements essential for web applications.[1]

WebGPU Shading Language
Latest versionW3C Candidate recommendation
(As of 2025)
Organization
Committee
  • GPU for the Web WG
  • GPU for the Web CG
Domain

Background

edit

Traditional web graphics programming relied on WebGL, which used GLSL ES for shader programming. However, as web applications became more sophisticated and demanded better performance, the need for a more modern graphics API became apparent.[3] WebGPU was developed to address these needs, providing access to modern GPU features while maintaining the security and portability requirements of the web platform.[2]

Shader types

edit

WGSL supports multiple shader stages:[1]

Vertex shaders

edit

Process individual vertices, transforming positions and computing per-vertex data for rasterization.[1]

Vertex shader example

edit
/* Transforms incoming positions by an MVP matrix and
   passes per-vertex color through to the fragment stage. */

struct VertexInput {
  @location(0) position : vec3<f32>,
  @location(1) color : vec3<f32>,
};

struct VertexOutput {
  @builtin(position) clip_position : vec4<f32>,
  @location(0) color : vec3<f32>,
};

@group(0) @binding(0)
var<uniform> mvp : mat4x4<f32>;

@vertex
fn main(v_in : VertexInput) -> VertexOutput {
  var v_out : VertexOutput;
  v_out.clip_position = mvp * vec4<f32>(v_in.position, 1.0);
  v_out.color = v_in.color;
  return v_out;
}

Fragment shaders

edit

Execute for each fragment, computing final color values and depth information.[1]

Fragment shader example

edit
/* Receives interpolated color and
   writes it to the framebuffer. */

@fragment
fn main(@location(0) color : vec3f) -> @location(0) vec4f {
  return vec4<f32>(color, 1.0); // add opaque alpha
}

Compute shaders

edit

Perform general-purpose parallel computations on the GPU, supporting various algorithms beyond traditional graphics rendering.[1]

Compute shader example

edit
/* Doubles every element in an input buffer and
   stores the result in an output buffer. */

struct Params {
  element_count : u32,
};

@group(0) @binding(0)
var<storage, read> in_data : array<f32>;
@group(0) @binding(1)
var<storage, read_write> out_data : array<f32>;
@group(0) @binding(2) var<uniform> params : Params;

@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
  let idx : u32 = gid.x;
  if (idx >= params.element_count) {
    return;
  }
  out_data[idx] = in_data[idx] * 2.0;
}

See also

edit
  • WebGPU, the graphics API that uses WGSL
  • SPIR-V, intermediate shader representation
  • W3C, the organization developing WebGPU and WGSL

Other shading languages

edit

References

edit
  1. ^ a b c d e f "WebGPU Shading Language". W3C. Retrieved 2024-01-20.
  2. ^ a b "WebGPU Explainer". W3C GPU for the Web Community Group. Retrieved 2024-01-20.
  3. ^ "WebGPU". W3C. Retrieved 2024-01-20.
edit