ProjectsExperiments
Steaming ramen
A React Three Fiber experiment: a cartoon-style bowl of ramen with smoke animated by shaders.
- Status
- Finished
- Period
- 2024.07
- Type
- Shader / visual effect
- Role
- Solo project, 3D development, 3D modelling
- Technologies
- Three.js
- React
- React Three Fiber
- GLSL
- Links
- Demo — smoke-seven.vercel.app (opens in a new tab)
- Repository — github.com (opens in a new tab)
Context and goal
A short experiment to try stylised smoke that fits a toon scene (flat shading and black outlines)
Demo
Technical description
The smoke is two vertical planes with a custom ShaderMaterial. In the vertex shader, a Perlin noise texture twists each plane around the vertical axis and adds a “wind” offset that grows with height; the two planes rotate in opposite directions to add volume.
In the fragment shader the noise scrolls upwards over time and the edges are softened with smoothstep. To match the toon shading, opacity is quantised into two levels:
float level1 = step(0.1, smoke);
float level2 = step(0.4, smoke);
float combined = mix(level1, level2, 0.5);
The rest of the scene uses meshToonMaterial and Drei’s Outlines, with PresentationControls to turn the bowl within a limited range.
Results and limitations
The noise comes from a texture rather than being computed in the shader, so the effect is cheap and stays smooth. Being planes, the smoke reads best from the front, which is why camera rotation is limited.

