Three Physical Material
Glass, car paint and soap bubbles without a texture artist
- map
- normal_map
- roughness_map
- metalness_map
- transmission_map
- specular_intensity_map
- specular_color_map
- clearcoat_map
- bump_map
- displacement_map
- ao_map
- emissive_map
- alpha_map
- material
Standard Material gets you plastic, metal and cloth. The moment your subject is a glass bottle, a lacquered car body, or a soap bubble, you need effects those surfaces don't have - real refraction, a clearcoat layer, hue-shifting iridescence. WASThreePhysicalMaterial is Standard Material plus exactly those effects, and it's the node that makes the Three family capable of "product render" instead of "game asset." Everything extra starts at 0.0, so it behaves exactly like a standard material until you turn the effects on.
What it does
The headline features, each with its own honest description:
- transmission - the glass one. Makes a surface see-through by refracting light rather than going transparent, which is why it looks like glass instead of tinted air. It wants friends to read as a solid: a thickness, an index of refraction (ior), and an attenuation_color (with an attenuation_distance) to read as tinted. Thin panes want
sidedouble so both walls refract. - clearcoat / clearcoat_roughness - a second glossy layer over the base, the lacquer on a car.
- sheen - the soft rim velvet has. Uses
sheen_colorandsheen_roughness. - iridescence - hue shifts with viewing angle. Soap bubbles, oil slicks.
- anisotropy - directionally-stretched reflections, for brushed metal.
- emissive / emissive_intensity - gives off its own light. This one matters beyond looks: Three Path Trace Render treats emissive surfaces as lights in their own right, so an emissive panel genuinely illuminates a traced scene.
You get the full standard-material toolkit underneath - color, roughness, metalness, opacity, transparent, side, normal/bump/displacement maps, specular intensity and color - plus maps for the new channels (transmission, clearcoat, specular, and so on).
What actually matters in practice
Start with the workhorse settings and add one effect at a time, because the failure modes are easy to misdiagnose:
- Glass that looks like plastic = transmission on but
thicknessandiornever set. The description is blunt: transmission "wants a thickness and an index of refraction to read as a solid." - Glass that looks tinted when it shouldn't =
attenuation_coloris doing its job. Attenuation is tint, so clear glass wants a neutral color and a generousattenuation_distance. - Metal that reads black = no environment to reflect. This is true on Standard too, but worth re-checking here since the specular sheen multiplies the effect.
Where it fits
It's a drop-in THREE_MATERIAL for Three Mesh, and it's also an excellent partner to Three Environment - real reflections are half the reason to use physical materials at all. The cost note in the description is honest: everything at 0.0 behaves like a standard material "at a higher cost," so don't slap Physical on every mesh in a big scene just because it's the shiniest option. Reach for it where the effect is on screen.
Install
WASThreePhysicalMaterial ships with WAS Node Suite v3. Install via ComfyUI Manager (search WAS Node Suite v3) or:
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui.git
Restart after. Requires ComfyUI 0.14.0+ and Python 3.10+. If the node's missing from Add Node, check features.threejs in <ComfyUI user dir>/was-node-suite/config.yaml - on by default in current releases.
Inputs (40)
| Name | Type | Default | Description |
|---|---|---|---|
| color | STRING | #ffffff | Base colour as hexadecimal. `#ffffff` is white, `#d8b24a` gold. |
| roughness | FLOAT | 0.250–1 | How scattered reflections are. 0.0 is a mirror, 0.25 lacquer, 1.0 chalk. |
| metalness | FLOAT | 0.000–1 | How metallic the surface reads. 0.0 for glass and paint, 1.0 for bare metal. |
| clearcoat | FLOAT | 0.000–1 | Strength of a glossy layer over the base. 0.0 is off, 1.0 is full lacquer. |
| clearcoat_roughness | FLOAT | 0.000–1 | How scattered the clearcoat is. 0.0 is glassy, 0.3 reads as worn lacquer. |
| transmission | FLOAT | 0.000–1 | How much light passes through. 0.0 is solid, 1.0 is clear glass. |
| thickness | FLOAT | 0.000–100000 | How deep the glass is, in scene units. 0.0 is a thin shell, 1.0 a solid block. |
| ior | FLOAT | 1.5001–2.333 | Index of refraction. 1.5 is glass, 1.33 water, 2.42 diamond, 1.0 bends nothing. |
| dispersion | FLOAT | 0.000–10 | How far colours split through the glass. 0.0 is off, 1.0 gives a prism edge. |
| iridescence | FLOAT | 0.000–1 | Strength of an angle-shifting film. 0.0 is off, 1.0 is a soap bubble. |
| anisotropy | FLOAT | 0.000–1 | How far highlights stretch, as on brushed metal. 0.0 is round, 1.0 fully stretched. |
| opacity | FLOAT | 1.000–1 | How solid the surface is, once transparent is on. 1.0 is opaque, 0.35 is glassy. |
| transparent | BOOLEAN | false | `true` honours opacity; `false` draws solid. Transmission works either way and usually looks better with this off. |
| side | COMBO | front | Which faces are drawn. 'front' for closed shapes, 'double' for glass seen through both walls. |
| specular_intensity | FLOAT | 1.000–10 | Strength of the non-metal highlight. 1.0 is normal, 0.0 kills the sheen entirely. |
| specular_color | STRING | #ffffff | Tint of that highlight, as hexadecimal. `#ffffff` leaves it uncoloured. |
| normal_scale | FLOAT | 1.00-10–10 | How strongly the normal map bends the surface. 1.0 is as authored, 0.0 flat, -1.0 inverted. |
| bump_scale | FLOAT | 1.00-10–10 | How deep the bump map reads. 1.0 is as authored, 0.2 is a subtle grain. |
| displacement_scale | FLOAT | 0.10-100–100 | How far the displacement map moves vertices, in scene units. 0.1 is gentle relief. |
| ao_intensity | FLOAT | 1.000–10 | How strongly the ambient occlusion map darkens. 1.0 is as authored, 0.0 off. |
| emissive | STRING | #000000 | Light the surface gives off, as hexadecimal, on top of what falls on it. `#000000` gives off none, `#ff5522` a hot ember. |
| emissive_intensity | FLOAT | 1.00–1000 | How strongly the emissive colour reads. 1.0 matches it, 8.0 makes the surface a light bright enough to lift what is around it. |
| sheen | FLOAT | 0.000–1 | Strength of a soft rim of light at grazing angles, as on velvet and brushed cloth. 0.0 is off, 1.0 is full. |
| sheen_roughness | FLOAT | 1.000–1 | How scattered the sheen is. 1.0 is a broad cloth rim, 0.3 a tight silky one. |
| sheen_color | STRING | #ffffff | Colour of the sheen, as hexadecimal. `#ffffff` keeps the base colour, `#8899ff` gives cloth a cool rim. |
| attenuation_color | STRING | #ffffff | Colour left after light has travelled through the glass, as hexadecimal. `#88ccaa` is bottle green. Needs transmission above 0.0. |
| attenuation_distance | FLOAT | 0.00–10000 | How far light travels through the glass before it takes on the whole attenuation colour. 0.0 absorbs nothing, 0.5 tints a thick pane deeply. |
| mapopt | THREE_TEXTURE | Albedo texture. Its colour replaces the colour swatch per pixel. | |
| normal_mapopt | THREE_TEXTURE | Tangent space normals, as the usual blue-violet image. Fakes surface detail without geometry. | |
| roughness_mapopt | THREE_TEXTURE | Roughness per pixel, read from the green channel. Black is a mirror, white is chalk. | |
| metalness_mapopt | THREE_TEXTURE | Metalness per pixel, read from the blue channel. Black is dielectric, white is metal. | |
| transmission_mapopt | THREE_TEXTURE | How much light passes through, per pixel. Black stays solid, white is fully clear. | |
| specular_intensity_mapopt | THREE_TEXTURE | Highlight strength per pixel, read from the alpha channel. Black is matte, white is full sheen. | |
| specular_color_mapopt | THREE_TEXTURE | Highlight tint per pixel, read as colour. Multiplied by specular_color. | |
| clearcoat_mapopt | THREE_TEXTURE | Clearcoat strength per pixel, read from the red channel. Black is bare, white is fully lacquered. | |
| bump_mapopt | THREE_TEXTURE | Height as greyscale, faked in the shading alone. Cheaper than a normal map and softer. | |
| displacement_mapopt | THREE_TEXTURE | Height as greyscale, moving real vertices. Needs a geometry with segments to move, such as 64 by 64. | |
| ao_mapopt | THREE_TEXTURE | Baked shadow in creases, read from the red channel. Black is fully occluded, white is open. | |
| emissive_mapopt | THREE_TEXTURE | Emitted light per pixel, multiplying the emissive colour. Black gives off none. | |
| alpha_mapopt | THREE_TEXTURE | Opacity as greyscale, read from the green channel. Black is clear, white is solid. Needs transparent on. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| material | THREE_MATERIAL | The surface, for the material socket on Three Mesh. |