|
| 1 | +--- |
| 2 | +title: Blender - Milling Machine Breakdown |
| 3 | +description: "" |
| 4 | +date: 2025-11-01 |
| 5 | +slug: blender-milling-machine-breakdown |
| 6 | +taxonomies: |
| 7 | + tags: |
| 8 | + - Blender |
| 9 | + - Breakdown |
| 10 | +extra: |
| 11 | + jszoom: true |
| 12 | + cover_image: "render.webp" |
| 13 | +--- |
| 14 | + |
| 15 | +A breakdown for my stylized milling machine render. |
| 16 | +{{ img(src="render.webp", alt="3d render of a milling machine") }} |
| 17 | + |
| 18 | +<!-- more --> |
| 19 | + |
| 20 | +{{ video(src="render_animation.mp4", autoplay="true" ) }} |
| 21 | + |
| 22 | +{{ img(src="mill_clay.webp", alt="clay render for milling machine") }} |
| 23 | + |
| 24 | +## Software |
| 25 | +- Rendered in Blender 4.5 using EEVEE |
| 26 | +- Line art is rendered using [Malt](https://github.com/bnpr/Malt)/[Cider](https://github.com/gamingrobot/Cider) |
| 27 | +- Grain was generated using [Grainy](https://superhivemarket.com/products/grainy) |
| 28 | + |
| 29 | +## Light and Shadow |
| 30 | +To get sharp shadows, I set the **Shadow Step Count** to 1 in **Render -> Shadows**. Then set these settings on lights in **Light Settings -> Shadows**: |
| 31 | +- Enable Jitter with 10% Overblur |
| 32 | +- Filter to 0.0 |
| 33 | +- Resolution Limit to 0.0001m |
| 34 | + |
| 35 | +To disable background light emission, I disconnected the **Background** from the output in the **World** shader (or by setting the **Strength** to 0.0). This allows control of the exact color of the objects and shadows in the material shader. |
| 36 | + |
| 37 | +### Spot Lamp |
| 38 | +There is a spot lamp inside the mill's lamp illuminating the mill and the volumetric. |
| 39 | +{{ img(src="light_spot.webp", alt="spot lamp settings") }} |
| 40 | + |
| 41 | +### Sun Lamp |
| 42 | +The low-power sun lamp has a copy rotation constraint targeting the camera and has shadows disabled. This light also uses light linking to exclude some items from the light due to weird shading. |
| 43 | +{{ img(src="light_sun.webp", alt="sun lamp settings") }} |
| 44 | + |
| 45 | +Since it is a low-powered light, it only gives highlights to areas outside the main spot lamp. |
| 46 | +{{ img(src="light_sun_split.webp", alt="showing highlights added by the sun lamp") }} |
| 47 | + |
| 48 | +## Materials |
| 49 | +I set the **Color Management** to **Standard** and added a **Shader AOV** for **Bloom (Color)** in the **View Layer** settings. The bloom is a separate AOV because everything in the scene is emissive, and I only want bloom on specific objects. A Cryptomatte Object pass would also work for this. |
| 50 | +{{ img(src="shader_nodes.webp", alt="shader node graph") }} |
| 51 | + |
| 52 | +These are the nodes for the **DiffuseColor** node group. The **ColorOffset** value changes how dark the shadows/diffuse shading are (faking the background illumination without changing the main shader color). |
| 53 | +{{ img(src="custom_diffuse_nodes.webp", alt="node group graph for DiffuseColor") }} |
| 54 | + |
| 55 | +## Volumetrics |
| 56 | +The lamp volumetrics are set up on a separate view layer with the spot lamp so I could tweak it in compositing if I needed to. The mill was set to **Holdout**, so it didn't render the volumetric where the mill was. |
| 57 | +{{ img(src="volume_node.webp", alt="volumetrics shader settings") }} |
| 58 | + |
| 59 | +## Particles |
| 60 | +These are the settings I used for the [swarf](https://en.wikipedia.org/wiki/Metal_swarf) particle system. The swarf models were in a collection that was randomly selected. I had difficulty with getting the physics to be stable, so I set the scene gravity to half, set collision on the metal block, and baked the simulation before rendering. |
| 61 | + |
| 62 | +{{ img(src="particle.webp", alt="particle settings") }} |
| 63 | + |
| 64 | +## Line Art |
| 65 | +I tried a couple of different approaches for the line art. |
| 66 | + |
| 67 | +{{ img(src="render_lineart.webp", alt="grease pencil line art render", text="[LineArt Modifier](https://docs.blender.org/manual/en/4.5/grease_pencil/modifiers/generate/line_art.html)") }} |
| 68 | +<br/> |
| 69 | +{{ img(src="render_freestyle.webp", alt="freestyle line art render", text="[FreeStyle](https://docs.blender.org/manual/en/4.5/render/freestyle/introduction.html)") }} |
| 70 | +<br/> |
| 71 | +{{ img(src="render.webp", alt="malt line art render", text="[Malt](https://github.com/bnpr/Malt)") }} |
| 72 | + |
| 73 | +Since I really liked how Malt's line art looked, I decided to go with that one. Malt is a custom render engine, so I had to use a linked scene since each scene can only have one render engine selected. |
| 74 | + |
| 75 | +I used the default line width settings and set the **Color** to transparent. In the main **Default Render** node tree, I also set the background to transparent. |
| 76 | +{{ img(src="malt_lineart_nodes.webp", alt="malt line art node settings") }} |
| 77 | + |
| 78 | +After this project I created [Cider](https://github.com/gamingrobot/Cider), which uses Malt but renders the line art alongside the main render so it can be used in compositing. It also makes it easier to set line art styles directly in the material settings and has support for a viewport preview. Cider is meant for just line art on top of an EEVEE or Cycles render, so Malt should still be used for more complex line art. |
| 79 | + |
| 80 | +## Compositing |
| 81 | + |
| 82 | +{{ video(src="composite_layers.mp4", autoplay="true") }} |
| 83 | + |
| 84 | +For compositing, I enabled additional passes in the View Layer settings: |
| 85 | +- Z/Depth (for Vector Blur) |
| 86 | +- Vector (for Vector Blur) |
| 87 | +- Cryptomatte Object (to mask out specific objects for Vector Blur) |
| 88 | + |
| 89 | +I had a weird issue with one frame in the middle of the render having a large vector change to one object in the vector pass but not in the combined pass. So I used the Cryptomatte Object pass to mask out just the cutter to apply the Vector Blur. |
| 90 | +{{ img(src="compositor_nodes.webp", alt="compositor nodes") }} |
| 91 | + |
| 92 | +The settings I used for generating the grain with the Grainy addon: |
| 93 | +{{ img(src="grainy_settings.webp", alt="grainy settings") }} |
| 94 | + |
| 95 | +If you liked this, you can find more of my art at [gamingrobot.art](https://gamingrobot.art). |
0 commit comments