Modules and Imports
Every wgsl-rs shader module is a #[wgsl] pub mod name { ... }. The module boundary defines what the macro transpiles and how shaders reference each other.
Module Structure
#![allow(unused)]
fn main() {
#[wgsl]
pub mod lighting {
use wgsl_rs::std::*;
pub fn diffuse(n: Vec3f, l: Vec3f) -> f32 {
max(dot(n, l), 0.0)
}
}
}
The generated WGSL is emitted into WGSL_SOURCE for that module.
Glob Imports Only
wgsl-rs supports glob imports exclusively. Named imports are not transpiled. The two valid import forms are:
#![allow(unused)]
fn main() {
use wgsl_rs::std::*; // standard WGSL types and builtins
use super::other_module::*; // another #[wgsl] module in the same parent
}
wgsl_rs::std provides the scalar/vector/matrix types (Vec2f, Vec3f, Vec4f, vec2f, Mat4f, …), builtins, and texture types.
Importing Other wgsl Modules
A module imported via use super::other_module::* must itself be a #[wgsl] module. This lets you split shaders across files and call functions defined elsewhere:
#![allow(unused)]
fn main() {
#[wgsl]
pub mod math {
use wgsl_rs::std::*;
pub fn clampf(x: f32, lo: f32, hi: f32) -> f32 {
min(max(x, lo), hi)
}
}
#[wgsl]
pub mod surface {
use wgsl_rs::std::*;
use super::math::*;
pub fn roughness(r: f32) -> f32 {
clampf(r, 0.0, 1.0)
}
}
}
Cross-Module Imports and Deduplication
When a module is imported by multiple sibling modules, wgsl-rs deduplicates the generated functions so each WGSL function appears only once in the final output. You do not need to manage inclusion guards.
Doc Comments
Inner doc comments (//!) at the top of a module are preserved in the generated WGSL as comments:
#![allow(unused)]
fn main() {
#[wgsl]
pub mod kernel {
//! Compute lighting contribution for a single light.
use wgsl_rs::std::*;
}
}
Outer doc comments (///) on items are not emitted into the WGSL; they stay in the Rust docs.