{"docs":[{"slug":"alpha-to-coverage-foliage-atlases","title":"Alpha-to-coverage, and the black edges it doesn't fix","description":"790,000 grass cards you can walk inside cannot be depth-sorted. Alpha-to-coverage solves the ordering, a contrast curve solves mip alpha collapse, and neither touches the dark outlines.","date":"2026-09-02","tags":["webgpu","three-js","tsl","alpha-to-coverage","foliage"],"path":"/notes/alpha-to-coverage-foliage-atlases","url":"https://tobis.vision/notes/alpha-to-coverage-foliage-atlases","markdown":"https://tobis.vision/notes/alpha-to-coverage-foliage-atlases.md"},{"slug":"real-time-gi-that-just-brightened-the-walls","title":"Real-time GI that just brightened the walls","description":"A light propagation volume can solve live and still read as a brightness slider: the missing sun-patch bounce, the dynamic range propagation destroys, and the read-side falloff that gives it back.","date":"2026-09-01","tags":["webgpu","tsl","three-js","global-illumination","debugging"],"path":"/notes/real-time-gi-that-just-brightened-the-walls","url":"https://tobis.vision/notes/real-time-gi-that-just-brightened-the-walls","markdown":"https://tobis.vision/notes/real-time-gi-that-just-brightened-the-walls.md"},{"slug":"mcp-server-that-writes-webgpu-shaders","title":"An MCP server that lets an agent write WebGPU shaders","description":"You cannot render WebGPU in a Node process, so the server owns nothing and relays into a live editor tab. The compile feedback loop is what makes an agent able to write shaders at all.","date":"2026-09-01","tags":["mcp","webgpu","tsl","three-js","agents","architecture"],"path":"/notes/mcp-server-that-writes-webgpu-shaders","url":"https://tobis.vision/notes/mcp-server-that-writes-webgpu-shaders","markdown":"https://tobis.vision/notes/mcp-server-that-writes-webgpu-shaders.md"},{"slug":"msaa-breaks-gtao-on-webgpu","title":"MSAA on a RenderTarget breaks GTAO on WebGPU","description":"Why three.js GTAO fails with `Invalid ShaderModule \"fragment_GTAO\"` the moment a RenderTarget asks for samples, and what to do instead.","date":"2026-08-31","tags":["webgpu","three-js","post-processing","debugging"],"path":"/notes/msaa-breaks-gtao-on-webgpu","url":"https://tobis.vision/notes/msaa-breaks-gtao-on-webgpu","markdown":"https://tobis.vision/notes/msaa-breaks-gtao-on-webgpu.md"},{"slug":"three-js-bloom-jimenez-dual-filter","title":"Making three.js bloom 9x faster with the Call of Duty blur","description":"three.js renders a fixed 5-mip chain of separable Gaussians every frame and ignores your radius. The Advanced Warfare downsample/upsample took bloom from 8.2ms to 0.9ms.","date":"2026-08-19","tags":["webgpu","three-js","tsl","performance","post-processing"],"path":"/notes/three-js-bloom-jimenez-dual-filter","url":"https://tobis.vision/notes/three-js-bloom-jimenez-dual-filter","markdown":"https://tobis.vision/notes/three-js-bloom-jimenez-dual-filter.md"}],"totalDocs":5}