Skip to content

iResolution ​

The iResolution uniform provides the resolution of the canvas in pixels as a vec3<f32>.

Its components are:

  • x: Width of the canvas (in pixels)
  • y: Height of the canvas (in pixels)
  • z: Reserved for future use (typically 1.0 in 2D contexts)

Usage ​

iResolution is typically used to normalize fragment coordinates or scale effects relative to screen size.
This ensures your shader behaves consistently across different devices and resolutions.

Common Use Cases ​

  • Normalize coordinates Convert pixel position to UV space:

    wgsl
    let uv = pos.xy / iResolution.xy;
  • Maintain aspect ratio Adjust effects based on screen shape:

    wgsl
    let aspect = iResolution.x / iResolution.y;
  • Center-based effects Create gradients or masks around the center:

    wgsl
    let center = iResolution.xy * 0.5;
  • Pixel snapping or anti-aliasing Use inverse resolution for fine control:

    wgsl
    let pixel = 1.0 / iResolution.xy;
  • Resolution-dependent scaling Scale blur radius or stroke width dynamically:

    wgsl
    let blurSize = 4.0 * iResolution.y / 1080.0;

Examples ​

Visualizing Normalized Coordinates ​

A gradient where red and green reflect X/Y screen position respectively. This effect scales seamlessly with resolution.

Red Green gradient

wgsl
@fragment
fn main(@builtin(position) pos: vec4<f32>) -> @location(0) vec4<f32> {
  // Convert pixel coordinates to normalized coordinates (UV)
  // by dividing by screen resolution.
  let uv = pos.xy / iResolution.xy;

  // Use UV values to produce a gradient.
  // Red = horizontal position, Green = vertical position.
  return vec4(uv, 0.0, 1.0);
}

iResolution is used here to normalize the pixel position into a 0–1 range. This is crucial for creating resolution-independent effects — for example, the gradient will look the same regardless of screen size.

Preserving Aspect Ratio for Circular Effects ​

This example shows how to correct for aspect ratio to ensure circular shapes don’t appear stretched on wide or tall screens.

Aspect ratio corrected circle

wgsl
@fragment
fn main(@builtin(position) pos: vec4<f32>) -> @location(0) vec4<f32> {
  // Normalize coordinates to [0, 1]
  let uv = pos.xy / iResolution.xy;

  // Convert to centered coordinates [-1, 1]
  let centered = uv * 2.0 - vec2<f32>(1.0, 1.0);

  // Correct for aspect ratio so circle isn't stretched
  let aspect = iResolution.x / iResolution.y;
  let corrected = vec2<f32>(centered.x * aspect, centered.y);

  // Radial gradient based on distance from center
  let d = length(corrected);
  let color = smoothstep(0.5, 0.2, d); // fade to black at edge
  return vec4<f32>(color, color, color, 1.0);
}

In this example, iResolution is used to preserve the aspect ratio of a circular shape. Without this correction, the circle could appear stretched on non-square viewports. The coordinates are first normalized, then scaled to account for the screen’s width-to-height ratio, ensuring consistent visuals across all resolutions.