This commit adds comprehensive OpenPBR documentation and a powerful synthetic environment map generation tool for testing and visualization workflows. ## OpenPBR Parameters Reference (doc/openpbr-parameters-reference.md) - Complete mapping of all 38 OpenPBR parameters - Blender v4.5+ MaterialX export parameter names - Three.js MeshPhysicalMaterial support status with detailed notes - Parameter categories: base, specular, transmission, subsurface, sheen, coat, emission, and geometry - Support summary: 15 fully supported (39%), 7 partial (18%), 16 not supported (42%) - Critical limitations clearly marked (subsurface, transmission effects, advanced coat) - Conversion recommendations for Three.js WebGL target - Blender MaterialX and USD format examples - 8KB comprehensive reference with all technical details ## HDRGen Tool (tools/hdrgen/) Pure Node.js synthetic HDR/EXR/LDR environment map generator with zero dependencies. ### Version 1.0.0 Features: - Three presets: white-furnace (testing), sun-sky (outdoor), studio (3-point lighting) - Dual projections: lat-long and cubemap (6 faces) - HDR output: Radiance RGBE format with proper encoding - Procedural generation: Hosek-Wilkie sky approximation, studio lighting model - Comprehensive CLI with preset-specific options - Full test suite: 8 unit tests, all passing - Documentation: 15KB README, quick start guide, examples ### Version 1.1.0 Features (added in this commit): - Image rotation: rotate environment maps around Y axis with bilinear filtering - Intensity scaling: global brightness multiplier for testing and adjustment - LDR output formats: PNG (8-bit RGB), BMP (24-bit), JPEG placeholder - Tone mapping: three operators (simple, Reinhard, ACES filmic) - Exposure control: EV-based exposure adjustment - Gamma correction: configurable gamma for different displays ### Code Statistics: - Total: ~1,500 lines of pure JavaScript - Core library: 913 lines (hdrgen.js) - CLI: 254 lines (cli.js) - Tests: 194 lines - Zero external dependencies ### Technical Implementation: - HDR: Proper RGBE encoding with 8-bit mantissa + shared exponent - PNG: Uncompressed RGB with CRC32 validation - BMP: 24-bit RGB with proper padding - Tone mapping: Reinhard, ACES filmic, simple clamp operators - Image transforms: Bilinear filtering for rotation - Math utilities: Vec3, coordinate conversions, color space operations ### Output Examples Included: - test_furnace.hdr (white furnace for energy conservation testing) - test_sunsky.hdr (procedural sky with sun disk) - test_studio.hdr (3-point studio lighting) - test_cube_*.hdr (cubemap faces, 6 files) - studio_test.png (LDR preview with tone mapping) - sky_test.bmp (BMP format example) ### Use Cases: - Material energy conservation validation (white furnace) - IBL testing and debugging - Web-friendly environment map previews (LDR output) - Lighting direction adjustment (rotation) - Brightness testing (intensity scaling) - DCC integration (Blender, Houdini, Maya, Unreal, Unity) ## Documentation Updates (doc/materialx.md) - Added "Related Documentation" section linking to OpenPBR parameters reference - Cross-reference for developers working with OpenPBR materials - Better discoverability of comprehensive parameter mappings ## Testing All functionality tested and verified: - HDR output: Valid Radiance RGBE format - PNG output: Valid PNG with correct CRC32 - BMP output: Valid 24-bit bitmap - Rotation: Smooth 90° rotation with bilinear filtering - Intensity scaling: Correct 0.5x and 2.0x multipliers - Tone mapping: All three methods produce correct output 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
15 KiB
OpenPBR Parameters Reference
Overview
This document provides a comprehensive mapping of OpenPBR (Open Physically-Based Rendering) parameters as implemented in TinyUSDZ, their corresponding Blender v4.5+ MaterialX export names, and Three.js MeshPhysicalMaterial support status.
Key Points:
- OpenPBR is the Academy Software Foundation's open standard for PBR materials
- Blender v4.5+ exports MaterialX with
ND_open_pbr_surface_surfaceshadernode definition - Three.js MeshPhysicalMaterial has limited support for advanced OpenPBR features
- TinyUSDZ supports full OpenPBR parameter set for parsing and conversion
Parameter Categories
Legend
| Symbol | Meaning |
|---|---|
| ✅ | Fully supported in Three.js MeshPhysicalMaterial |
| ⚠️ | Partially supported or requires workarounds |
| ❌ | Not supported in Three.js (no equivalent parameter) |
| 🔄 | Supported but with different semantic interpretation |
1. Base Layer Properties
The base layer defines the fundamental appearance of the material - its color, reflectivity, and surface texture.
| TinyUSDZ Parameter | Blender/MaterialX Name | Type | Default | Three.js Support | Three.js Mapping | Notes |
|---|---|---|---|---|---|---|
base_weight |
inputs:base_weight |
float | 1.0 | ⚠️ | opacity |
Affects overall opacity in Three.js; not a direct base layer weight |
base_color |
inputs:base_color |
color3f | (0.8, 0.8, 0.8) | ✅ | color |
Direct 1:1 mapping to diffuse color |
base_roughness |
inputs:base_roughness |
float | 0.0 | ✅ | roughness |
Direct mapping for microfacet roughness |
base_metalness |
inputs:base_metalness |
float | 0.0 | ✅ | metalness |
Direct mapping for metallic workflow |
Three.js Notes:
base_weightdoesn't have a direct equivalent; Three.js usesopacityfor transparency- Base layer is the foundation of the PBR material in both OpenPBR and Three.js
2. Specular Reflection Properties
Specular properties control the shiny, mirror-like reflections on dielectric (non-metallic) surfaces.
| TinyUSDZ Parameter | Blender/MaterialX Name | Type | Default | Three.js Support | Three.js Mapping | Notes |
|---|---|---|---|---|---|---|
specular_weight |
inputs:specular_weight |
float | 1.0 | ⚠️ | reflectivity (r170+) |
Three.js r170+ has limited support |
specular_color |
inputs:specular_color |
color3f | (1.0, 1.0, 1.0) | ⚠️ | specularColor (limited) |
Only available in certain material types |
specular_roughness |
inputs:specular_roughness |
float | 0.3 | ✅ | roughness |
Same as base_roughness in Three.js |
specular_ior |
inputs:specular_ior |
float | 1.5 | ✅ | ior |
Index of refraction, directly supported |
specular_ior_level |
inputs:specular_ior_level |
float | 0.5 | ❌ | — | No equivalent in Three.js |
specular_anisotropy |
inputs:specular_anisotropy |
float | 0.0 | ⚠️ | anisotropy (r170+) |
Experimental support in recent Three.js |
specular_rotation |
inputs:specular_rotation |
float | 0.0 | ⚠️ | anisotropyRotation (r170+) |
Requires anisotropy support |
Three.js Notes:
- Anisotropic reflection is experimental and not widely supported
specular_ior_levelhas no Three.js equivalent- Most specular properties require custom shader implementations for full fidelity
3. Transmission Properties (Transparency/Glass)
Transmission properties control light passing through the material, used for glass, water, and translucent materials.
| TinyUSDZ Parameter | Blender/MaterialX Name | Type | Default | Three.js Support | Three.js Mapping | Notes |
|---|---|---|---|---|---|---|
transmission_weight |
inputs:transmission_weight |
float | 0.0 | ✅ | transmission |
Supported in MeshPhysicalMaterial |
transmission_color |
inputs:transmission_color |
color3f | (1.0, 1.0, 1.0) | ❌ | — | NOT SUPPORTED - Three.js uses white |
transmission_depth |
inputs:transmission_depth |
float | 0.0 | ⚠️ | thickness |
Approximate mapping, different semantics |
transmission_scatter |
inputs:transmission_scatter |
color3f | (0.0, 0.0, 0.0) | ❌ | — | NOT SUPPORTED - Volume scattering |
transmission_scatter_anisotropy |
inputs:transmission_scatter_anisotropy |
float | 0.0 | ❌ | — | NOT SUPPORTED - Advanced scattering |
transmission_dispersion |
inputs:transmission_dispersion |
float | 0.0 | ❌ | — | NOT SUPPORTED - Chromatic dispersion |
Three.js Notes:
- ❌ Transmission is NOT fully supported - Only basic
transmissionweight is available - ❌ Colored transmission, volume scattering, and dispersion require custom shaders
- Glass materials will appear simplified compared to OpenPBR specification
4. Subsurface Scattering Properties
Subsurface scattering simulates light penetrating and scattering beneath the surface, crucial for skin, wax, marble, etc.
| TinyUSDZ Parameter | Blender/MaterialX Name | Type | Default | Three.js Support | Three.js Mapping | Notes |
|---|---|---|---|---|---|---|
subsurface_weight |
inputs:subsurface_weight |
float | 0.0 | ❌ | — | NOT SUPPORTED |
subsurface_color |
inputs:subsurface_color |
color3f | (0.8, 0.8, 0.8) | ❌ | — | NOT SUPPORTED |
subsurface_radius |
inputs:subsurface_radius |
color3f | (1.0, 1.0, 1.0) | ❌ | — | NOT SUPPORTED |
subsurface_scale |
inputs:subsurface_scale |
float | 1.0 | ❌ | — | NOT SUPPORTED |
subsurface_anisotropy |
inputs:subsurface_anisotropy |
float | 0.0 | ❌ | — | NOT SUPPORTED |
Three.js Notes:
- ❌ Subsurface scattering is NOT supported in standard Three.js materials
- Requires custom shader implementations (e.g., via shader chunks)
- Materials with SSS will fall back to standard diffuse appearance
- Community solutions exist but are not part of core Three.js
5. Sheen Properties (Fabric/Velvet)
Sheen adds a soft, velvet-like reflective layer, commonly used for cloth, fabric, and microfiber materials.
| TinyUSDZ Parameter | Blender/MaterialX Name | Type | Default | Three.js Support | Three.js Mapping | Notes |
|---|---|---|---|---|---|---|
sheen_weight |
inputs:sheen_weight |
float | 0.0 | ✅ | sheen |
Supported in MeshPhysicalMaterial |
sheen_color |
inputs:sheen_color |
color3f | (1.0, 1.0, 1.0) | ✅ | sheenColor |
Directly supported |
sheen_roughness |
inputs:sheen_roughness |
float | 0.3 | ✅ | sheenRoughness |
Directly supported |
Three.js Notes:
- ✅ Sheen is well supported in Three.js MeshPhysicalMaterial
- Good for fabric and cloth materials
6. Coat Layer Properties (Clear Coat)
Coat layer simulates a clear protective coating on top of the base material, like car paint or lacquered wood.
| TinyUSDZ Parameter | Blender/MaterialX Name | Type | Default | Three.js Support | Three.js Mapping | Notes |
|---|---|---|---|---|---|---|
coat_weight |
inputs:coat_weight |
float | 0.0 | ✅ | clearcoat |
Direct mapping |
coat_color |
inputs:coat_color |
color3f | (1.0, 1.0, 1.0) | ❌ | — | NOT SUPPORTED - Three.js clearcoat is always white |
coat_roughness |
inputs:coat_roughness |
float | 0.0 | ✅ | clearcoatRoughness |
Direct mapping |
coat_anisotropy |
inputs:coat_anisotropy |
float | 0.0 | ❌ | — | NOT SUPPORTED |
coat_rotation |
inputs:coat_rotation |
float | 0.0 | ❌ | — | NOT SUPPORTED |
coat_ior |
inputs:coat_ior |
float | 1.5 | ⚠️ | ior |
Uses same IOR as base material |
coat_affect_color |
inputs:coat_affect_color |
color3f | (1.0, 1.0, 1.0) | ❌ | — | NOT SUPPORTED |
coat_affect_roughness |
inputs:coat_affect_roughness |
float | 0.0 | ❌ | — | NOT SUPPORTED |
Three.js Notes:
- ⚠️ Clear coat support is basic - only weight and roughness
- ❌ Colored clear coats not supported
- ❌ Anisotropic coat reflections not supported
- ❌ Advanced coat interactions (affect_color, affect_roughness) not supported
7. Emission Properties (Glow/Light)
Emission makes materials glow and emit light, used for light sources, LEDs, neon signs, etc.
| TinyUSDZ Parameter | Blender/MaterialX Name | Type | Default | Three.js Support | Three.js Mapping | Notes |
|---|---|---|---|---|---|---|
emission_luminance |
inputs:emission_luminance |
float | 0.0 | ✅ | emissiveIntensity |
Direct mapping |
emission_color |
inputs:emission_color |
color3f | (1.0, 1.0, 1.0) | ✅ | emissive |
Direct mapping |
Three.js Notes:
- ✅ Emission is fully supported
- Works well for glowing materials and light-emitting surfaces
8. Geometry Properties
Geometry properties affect surface normals and tangent space, used for bump mapping, normal mapping, etc.
| TinyUSDZ Parameter | Blender/MaterialX Name | Type | Default | Three.js Support | Three.js Mapping | Notes |
|---|---|---|---|---|---|---|
opacity |
inputs:opacity |
float | 1.0 | ✅ | opacity + transparent flag |
Direct mapping |
normal |
inputs:normal |
normal3f | (0.0, 0.0, 1.0) | ✅ | normalMap |
Normal map support |
tangent |
inputs:tangent |
vector3f | (1.0, 0.0, 0.0) | ⚠️ | Computed internally | Three.js computes tangents automatically |
Three.js Notes:
- ✅ Opacity and normal mapping fully supported
- Tangent vectors are usually computed by Three.js from geometry
9. Outputs
| TinyUSDZ Parameter | Blender/MaterialX Name | Type | Three.js Support | Notes |
|---|---|---|---|---|
surface |
token outputs:surface |
token | ✅ | Output connection for shader graph |
Summary Statistics
Support Overview
| Category | Parameters | Fully Supported | Partially Supported | Not Supported |
|---|---|---|---|---|
| Base Layer | 4 | 3 | 1 | 0 |
| Specular | 7 | 2 | 3 | 2 |
| Transmission | 6 | 1 | 1 | 4 |
| Subsurface | 5 | 0 | 0 | 5 |
| Sheen | 3 | 3 | 0 | 0 |
| Coat | 8 | 2 | 1 | 5 |
| Emission | 2 | 2 | 0 | 0 |
| Geometry | 3 | 2 | 1 | 0 |
| Total | 38 | 15 (39%) | 7 (18%) | 16 (42%) |
Critical Limitations for Three.js
❌ NOT SUPPORTED (requires custom shaders):
- Subsurface Scattering - All 5 parameters (weight, color, radius, scale, anisotropy)
- Transmission Effects - Color, scatter, dispersion (4 parameters)
- Coat Advanced - Color, anisotropy, affect properties (5 parameters)
- Specular Advanced - IOR level (1 parameter)
⚠️ LIMITATIONS:
- Transmission is basic (only weight supported, no colored transmission)
- Coat layer cannot be colored or anisotropic
- Anisotropic reflections are experimental
- No volume scattering or participating media
✅ WELL SUPPORTED:
- Base PBR (color, metalness, roughness)
- Emission (color and intensity)
- Sheen (fabric materials)
- Basic clear coat
- Normal mapping and opacity
Blender MaterialX Export Format
When Blender v4.5+ exports OpenPBR materials to MaterialX, it uses this structure:
<materialx version="1.38" colorspace="lin_rec709">
<material name="MaterialName">
<shaderref name="SR_OpenPBRSurface" node="OpenPBRSurface">
<!-- Parameter bindings -->
<bindinput name="base_color" type="color3" value="0.8, 0.8, 0.8" />
<bindinput name="base_metalness" type="float" value="0.0" />
<bindinput name="base_roughness" type="float" value="0.5" />
<!-- Texture connections -->
<bindinput name="base_color" type="color3" nodename="image_basecolor" />
</shaderref>
</material>
<image name="image_basecolor" type="color3">
<input name="file" type="filename" value="textures/base_color.png" />
</image>
<open_pbr_surface name="OpenPBRSurface" type="surfaceshader">
<!-- Full parameter list -->
</open_pbr_surface>
</materialx>
USD Format
In USD files, OpenPBR materials appear as:
def Material "MaterialName"
{
token outputs:surface.connect = </Materials/MaterialName/OpenPBRSurface.outputs:surface>
def Shader "OpenPBRSurface"
{
uniform token info:id = "OpenPBRSurface"
# Or: uniform token info:id = "ND_open_pbr_surface_surfaceshader"
color3f inputs:base_color = (0.8, 0.8, 0.8)
float inputs:base_metalness = 0.0
float inputs:base_roughness = 0.5
# ... all other inputs
token outputs:surface
}
}
Conversion Recommendations
For Three.js WebGL Target
When converting OpenPBR to Three.js MeshPhysicalMaterial:
-
Use Supported Parameters:
- Base color, metalness, roughness → Direct mapping
- Emission color and luminance → Direct mapping
- Sheen weight, color, roughness → Direct mapping
- Clearcoat weight and roughness → Direct mapping
- Transmission weight → Basic transparency
-
Handle Unsupported Parameters:
- Subsurface Scattering: Approximate with albedo color darkening
- Transmission Color: Warn user, fall back to white
- Coat Color: Warn user, fall back to white clearcoat
- Advanced Specular: Use base
iorparameter, ignorespecular_ior_level
-
Texture Handling:
- Map
inputs:base_colortexture →map - Map
inputs:base_metalnesstexture →metalnessMap - Map
inputs:base_roughnesstexture →roughnessMap - Map
inputs:emission_colortexture →emissiveMap - Map
inputs:normaltexture →normalMap
- Map
For Three.js WebGPU Target
With WebGPU and MaterialX node support:
- More parameters may become available
- Custom node implementations can handle advanced features
- Refer to Three.js MaterialXLoader documentation
References
- OpenPBR Specification
- MaterialX Specification v1.38
- Three.js MeshPhysicalMaterial Documentation
- TinyUSDZ OpenPBR Implementation
- Three.js MaterialX Loader
Revision History
| Date | Version | Changes |
|---|---|---|
| 2025-11-06 | 1.0 | Initial comprehensive parameter reference |