# 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_surfaceshader` node 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_weight` doesn't have a direct equivalent; Three.js uses `opacity` for 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_level` has 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 `transmission` weight 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):** 1. **Subsurface Scattering** - All 5 parameters (weight, color, radius, scale, anisotropy) 2. **Transmission Effects** - Color, scatter, dispersion (4 parameters) 3. **Coat Advanced** - Color, anisotropy, affect properties (5 parameters) 4. **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: ```xml ``` ### USD Format In USD files, OpenPBR materials appear as: ```usda def Material "MaterialName" { token outputs:surface.connect = 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: 1. **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 2. **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 `ior` parameter, ignore `specular_ior_level` 3. **Texture Handling:** - Map `inputs:base_color` texture → `map` - Map `inputs:base_metalness` texture → `metalnessMap` - Map `inputs:base_roughness` texture → `roughnessMap` - Map `inputs:emission_color` texture → `emissiveMap` - Map `inputs:normal` texture → `normalMap` ### 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](https://github.com/AcademySoftwareFoundation/OpenPBR) - [MaterialX Specification v1.38](https://www.materialx.org/) - [Three.js MeshPhysicalMaterial Documentation](https://threejs.org/docs/#api/en/materials/MeshPhysicalMaterial) - [TinyUSDZ OpenPBR Implementation](../src/usdShade.hh) - [Three.js MaterialX Loader](https://threejs.org/examples/webgpu_loader_materialx.html) --- ## Revision History | Date | Version | Changes | |------|---------|---------| | 2025-11-06 | 1.0 | Initial comprehensive parameter reference |