Materia 0.3.4.0
Added
WebGPU Effect Composer (io.materia.renderer.webgpu.WebGPUEffectComposer)
A complete post-processing effect composer for WebGPU, providing symmetric rendering capabilities to WebGLEffectComposer. This bridges the API asymmetry where only WebGL had a composable render pipeline.
WebGPUEffectComposer
- WebGPU equivalent of
WebGLEffectComposerfor WGSL shaders - Manages chains of
FullScreenEffectPassobjects with automatic pipeline creation - Ping-pong texture system for multi-pass rendering
- Automatic uniform buffer management and dirty tracking
- Full blend mode support (
OPAQUE,ALPHA_BLEND,ADDITIVE,MULTIPLY,SCREEN,OVERLAY,PREMULTIPLIED_ALPHA) - Lazy pipeline and resource creation for optimal performance
- Pass chain management (add, remove, insert, reorder, swap)
- Enable/disable individual passes
- Automatic size propagation and texture recreation on resize
Example Usage
// Create effect composer with WebGPU device
val composer = WebGPUEffectComposer(device, width = 1920, height = 1080)
// Add passes using existing FullScreenEffectPass API
composer.addPass(FullScreenEffectPass.create {
fragmentShader = vignetteShader
blendMode = BlendMode.ALPHA_BLEND
})
composer.addPass(FullScreenEffectPass.create(requiresInputTexture = true) {
fragmentShader = colorGradingShader
uniforms { float("gamma") }
})
// Update uniforms in render loop
passes[1].updateUniforms { set("gamma", 2.2f) }
// Render to swapchain texture
composer.render(swapchainView)
// Or render single effect directly
composer.renderSingle(singlePass, outputView)Technical Details
- 1 new source file for WebGPU effect composer
- 1 new test file with unit tests
- JS-only implementation in
src/jsMain/kotlin/io/materia/renderer/webgpu - Reuses existing
FullScreenEffectPassandFullScreenEffectfromio.materia.effects
API Symmetry
| Component | WebGL | WebGPU |
|---|---|---|
| Composer | WebGLEffectComposer |
WebGPUEffectComposer |
| Pass | WebGLEffectPass |
FullScreenEffectPass |
| Effect | WebGLFullScreenEffect |
FullScreenEffect |
| Has render()? | ✅ Yes | ✅ Yes |