Derivatives
Demonstrates all 9 WGSL derivative builtin functions used in a fragment shader: dpdx, dpdy, fwidth, plus their _fine and _coarse variants, applied to both scalars and vectors.
Rust Source
#![allow(unused)]
fn main() {
#[wgsl]
pub mod derivative_example {
//! Demonstrates all 9 WGSL derivative builtin functions used in a fragment
//! shader.
use wgsl_rs::std::*;
pub struct FragInput {
#[builtin(position)]
pub position: Vec4f,
}
pub struct DerivativeOutputs {
#[location(0)]
pub dx: Vec4f,
#[location(1)]
pub dy: Vec4f,
#[location(2)]
pub fw: Vec4f,
}
#[fragment]
pub fn frag_main(input: FragInput) -> DerivativeOutputs {
let position = input.position;
// Scalar derivatives.
let dx_scalar = dpdx(position.x());
let dy_scalar = dpdy(position.y());
let fw_scalar = fwidth(position.x());
// Fine variants on a Vec2f.
let pos_xy = vec2f(position.x(), position.y());
let dx_fine = dpdx_fine(pos_xy);
let dy_fine = dpdy_fine(pos_xy);
let fw_fine = fwidth_fine(pos_xy);
// Coarse variants on a scalar.
let dx_coarse = dpdx_coarse(position.x());
let dy_coarse = dpdy_coarse(position.y());
let fw_coarse = fwidth_coarse(position.x());
DerivativeOutputs {
dx: vec4f(dx_scalar, dx_fine.x(), dx_fine.y(), dx_coarse),
dy: vec4f(dy_scalar, dy_fine.x(), dy_fine.y(), dy_coarse),
fw: vec4f(fw_scalar, fw_fine.x(), fw_fine.y(), fw_coarse),
}
}
}
}
Generated WGSL
struct FragInput {
@builtin(position) position: vec4f
}
struct DerivativeOutputs {
@location(0) dx: vec4f,
@location(1) dy: vec4f,
@location(2) fw: vec4f
}
@fragment fn frag_main(input: FragInput) -> DerivativeOutputs {
let position = input.position;
let dx_scalar = dpdx(position.x);
let dy_scalar = dpdy(position.y);
let fw_scalar = fwidth(position.x);
let pos_xy = vec2f(position.x, position.y);
let dx_fine = dpdxFine(pos_xy);
let dy_fine = dpdyFine(pos_xy);
let fw_fine = fwidthFine(pos_xy);
let dx_coarse = dpdxCoarse(position.x);
let dy_coarse = dpdyCoarse(position.y);
let fw_coarse = fwidthCoarse(position.x);
return DerivativeOutputs(vec4f(dx_scalar, dx_fine.x, dx_fine.y, dx_coarse), vec4f(dy_scalar, dy_fine.x, dy_fine.y, dy_coarse), vec4f(fw_scalar, fw_fine.x, fw_fine.y, fw_coarse));
}
Notes
- The nine functions are:
dpdx,dpdy,fwidth,dpdx_fine,dpdy_fine,fwidth_fine,dpdx_coarse,dpdy_coarse,fwidth_coarse. - Snake_case Rust names map to camelCase WGSL builtins (e.g.
dpdx_fine->dpdxFine).