diff --git a/js/webgpu/rainPass.js b/js/webgpu/rainPass.js index 2e6aae7..dd221a3 100644 --- a/js/webgpu/rainPass.js +++ b/js/webgpu/rainPass.js @@ -74,6 +74,11 @@ export default (context, getInputs) => { loadValue: { r: 0, g: 0, b: 0, a: 1 }, storeOp: "store", }, + { + view: null, + loadValue: { r: 0, g: 0, b: 0, a: 1 }, + storeOp: "store", + }, ], }; @@ -87,6 +92,7 @@ export default (context, getInputs) => { let computeBindGroup; let renderBindGroup; let output; + let highPassOutput; const ready = (async () => { const [msdfTexture, rainShader] = await Promise.all(assets); @@ -126,6 +132,13 @@ export default (context, getInputs) => { alpha: additiveBlendComponent, }, }, + { + format: presentationFormat, + blend: { + color: additiveBlendComponent, + alpha: additiveBlendComponent, + }, + }, ], }, }); @@ -152,10 +165,14 @@ export default (context, getInputs) => { // Update output?.destroy(); output = makePassFBO(device, width, height, presentationFormat); + + highPassOutput?.destroy(); + highPassOutput = makePassFBO(device, width, height, presentationFormat); }; const getOutputs = () => ({ primary: output, + highPass: highPassOutput, }); const execute = (encoder) => { @@ -168,6 +185,7 @@ export default (context, getInputs) => { computePass.endPass(); renderPassConfig.colorAttachments[0].view = output.createView(); + renderPassConfig.colorAttachments[1].view = highPassOutput.createView(); const renderPass = encoder.beginRenderPass(renderPassConfig); renderPass.setPipeline(renderPipeline); renderPass.setBindGroup(0, renderBindGroup); diff --git a/shaders/wgsl/rainPass.wgsl b/shaders/wgsl/rainPass.wgsl index f51ccc4..971e283 100644 --- a/shaders/wgsl/rainPass.wgsl +++ b/shaders/wgsl/rainPass.wgsl @@ -37,6 +37,7 @@ slantScale : f32; slantVec : vec2; volumetric : i32; + highPassThreshold : f32; }; // The properties that change over time get their own buffer. @@ -89,6 +90,7 @@ struct VertOutput { struct FragOutput { [[location(0)]] color : vec4; + [[location(1)]] highPassColor : vec4; }; // Constants @@ -432,5 +434,17 @@ fn getSymbolUV(glyphCycle : f32) -> vec2 { output.color = vec4(input.channel * brightness * alpha, 1.0); } + var highPassColor = output.color; + if (highPassColor.r < config.highPassThreshold) { + highPassColor.r = 0.0; + } + if (highPassColor.g < config.highPassThreshold) { + highPassColor.g = 0.0; + } + if (highPassColor.b < config.highPassThreshold) { + highPassColor.b = 0.0; + } + output.highPassColor = highPassColor; + return output; }