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

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.