Preview Material
An orbitable shader ball inside your graph
- base_color
- normal
- roughness
- metalness
- specular
- height
- ao
- opacity
- emissive
- clearcoat
- clearcoat_roughness
- anisotropy
- sheen_color
- sheen_roughness
- transmission
- thickness
- iridescence
- iridescence_thickness
- model_file
- preview_info
This is the flagship node of MKRShift Nodes' material family, and it's the one worth installing the pack for. x1PreviewMaterial takes your loose PBR maps - base color, normal, roughness, metalness, whatever you've derived - and assembles them into a real 3D material that you can orbit and inspect inside the node, via ComfyUI's built-in 3D viewer. No Blender round-trip, no exporting a test render and hoping. You see the material as a shader ball, lit, with the roughness and metalness actually responding.
The workflow that makes this valuable is the one the whole Surface branch is built around: derive maps with x1RoughnessMap / x1MetalnessMap / x1NormalMap, preview them here, and when it looks right, pack them with x1PBRPack. The preview step is where you'd otherwise be flying blind.
How it works
Under the hood it writes a self-contained .glb asset into ComfyUI/output/mkrshift/material_preview, then mounts ComfyUI's Load3D viewer in the node so you can orbit without leaving the graph. That file being self-contained matters: you can hand the output model_file path straight to a Preview3D node or any downstream consumer. The node is a builder, not a renderer - its real output is that .glb.
The input list is a full modern PBR surface: base_color, normal, roughness, metalness, specular, height, ao, opacity, emissive, clearcoat, clearcoat_roughness, anisotropy, sheen_color, sheen_roughness, transmission, thickness, iridescence, iridescence_thickness. Wire up any combination; unconnected slots fall back to the *_default values.
The controls that matter
preview_mesh-shader_ball,plane, orcubeuv_scale- repeats the texture coordinates on the mesh (useful when your maps are high-res and you want to see the tiling)normal_convention- directx (default) flips the incoming green channel into glTF/OpenGL space;openglpasses it through. This is the single most important setting: glTF expects OpenGL-space normals, and an engine-style DirectX map fed in asopenglwill look inverted. Leave it ondirectxfor most external maps, switch toopenglfor glTF-native ones orx1NormalMapoutput in OpenGL modeheight_to_normal_strength- converts your height map into supplemental preview normals (default 6.0)alpha_mode-autopicksblendfor soft transparency ormaskfor binary cutoutsadvanced_settings_json- the power user's escape hatch: IOR, attenuation, anisotropy rotation, iridescence ranges, even displacement mode (off/height/normal/height_normal). Leave empty to keep the core PBR behavior
Outputs
Just two: model_file (the generated .glb path) and preview_info (a summary string). There's no image output because the preview is the node - the 3D viewer is mounted inline.
Installing it
ComfyUI Manager (search "MKRShift Nodes") or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart. No model downloads, no ffmpeg. The 3D viewer is ComfyUI's built-in Load3D/Preview3D - if you've never used those, this is a gentle introduction since the node handles the mounting for you.
Where people get burned
The normal convention mismatch is the classic: a DirectX normal map fed as opengl renders with all the detail recessed, and it's easy to blame the node. If the shader ball looks "wrong in a lighting way," check normal_convention before anything else. And remember the exported .glb is what matters if you're handing off - the inline preview is fast feedback, but the file is the deliverable.
Inputs (30)
| Name | Type | Default | Description |
|---|---|---|---|
| preview_mesh | COMBO | 3 options: shader_ball, plane, cube | |
| uv_scale | FLOAT | 1.000.01–32 | — |
| roughness_default | FLOAT | 0.550–1 | — |
| metalness_default | FLOAT | 0.000–1 | — |
| normal_strength | FLOAT | 1.000–8 | — |
| normal_convention | COMBO | 2 options: directx, opengl | |
| height_to_normal_strength | FLOAT | 6.00–64 | — |
| emissive_strength | FLOAT | 1.000–8 | — |
| alpha_mode | COMBO | 3 options: auto, blend, mask | |
| asset_label | STRING | material_preview | — |
| advanced_settings_json | STRING | — | |
| model_file | STRING | — | |
| base_coloropt | IMAGE | — | |
| normalopt | IMAGE | — | |
| roughnessopt | IMAGE | — | |
| metalnessopt | IMAGE | — | |
| specularopt | IMAGE | — | |
| heightopt | IMAGE | — | |
| aoopt | IMAGE | — | |
| opacityopt | IMAGE | — | |
| emissiveopt | IMAGE | — | |
| clearcoatopt | IMAGE | — | |
| clearcoat_roughnessopt | IMAGE | — | |
| anisotropyopt | IMAGE | — | |
| sheen_coloropt | IMAGE | — | |
| sheen_roughnessopt | IMAGE | — | |
| transmissionopt | IMAGE | — | |
| thicknessopt | IMAGE | — | |
| iridescenceopt | IMAGE | — | |
| iridescence_thicknessopt | IMAGE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| model_file | STRING | — |
| preview_info | STRING | — |