OpenPBR介绍
OpenPBR Surface shading model
超级着色器(über-shader)即覆盖各种情况的单一整体材质,它拥有一组定义明确的参数,可以调整这些参数来创作现实中和想象中的材质。例如Disney的Principled Shader[1]、Allegorithmic的PBR shading model[2]、Autodesk的Standard Surface shader[3]、Adobe的Standard Material[4]、Blender的Principled BSDF[5]等。 OpenPBR旨在成为不同产品之间的通用接口,覆盖大多数日常用例(未涵盖更专业的用例,如非常高端的皮肤、头发、布料或体积着色)。
OpenPBR(Github)作为MaterialX的一个子项目于2023年8月2日由ASWF发布。该项目由Autodesk和Adobe开发,用MaterialX编写,任何已经支持MaterialX都可以自动支持OpenPBR。
已有Pixar USD、SideFX Houdini、Autodesk Maya、Autodesk 3ds Max、Apple VisionOS、Unreal Engine、NVIDIA Omniverse、Autodesk Arnold、Pixar RenderMan、Chaos V-Ray支持MaterialX。
MaterialX(Github)是在计算机图形学中表示丰富材质和外观开发内容的开放标准,它使美工能够以通用的网络形式描述材质,从而为资产提供跨渲染器和平台的一致外观。本质上,MaterialX是一种使用XML格式文件在不同DCC工具之间交换数据的机制。
使用MaterialX Graph
Editor编辑OpenPBR的参考实现open_pbr_surface.mtlx
的节点图:
节点图中空着的槽对应的属性可以在MaterialXView中调整:
OpenPBR结构[6]如下:
由金属或电介质的混合物构成的base substrate。该基层的界面(电介质或金属)提供主镜面反射波瓣。电介质基底代表三种成分中的任一种,可以统计混合:
- Glossy-diffuse:具有不透明内部介质的电介质,如木材、花岗岩、混凝土、纸板和墙漆。
- Subsurface:具有致密高散射内部介质的电介质,如塑料、大理石、皮肤、植物和食物。
- Translucent-base:具有半透明内部介质的电介质,如玻璃、晶体和液体。
Coat:可选的电介质层,可具有吸收介质,充当base substrate顶部的涂层。该层的电介质界面提供次镜面反射波瓣。
Fuzz:可选层,表示来自在其他所有物体之上的微纤维(例如细毛、桃绒、纺织线和灰尘颗粒)的反射。
参数设计如下:
Identifier | Label | Type | Range | Norm | Default | Unit |
---|---|---|---|---|---|---|
Base | ||||||
base_weight |
Weight | float | \([0,1]\) | \(1\) | ||
base_color |
Color | color3 | \([0,1]^3\) | \((0.8,0.8,0.8)\) | ||
base_roughness |
Roughness | float | \([0,\infty)\) | \([0,1]\) | \(0\) | |
base_metalness |
Metalness | float | \([0,1]\) | \(0\) | ||
Specular | ||||||
specular_weight |
Weight | float | \([0,1]\) | \(1\) | ||
specular_color |
Color | color | \([0,1]^3\) | \((1,1,1)\) | ||
specular_roughness |
Roughness | float | \([0,\infty)\) | \([0,1]\) | \(0.3\) | |
specular_anisotropy |
Anisotropy | float | \([0,1]\) | \(0\) | ||
specular_rotation |
Rotation | float | \([0,1]\) | \(0\) | ||
specular_ior |
IOR | float | \((0,\infty)\) | \([1,3]\) | \(1.5\) | |
specular_ior_level |
IOR level | float | \([0,1]\) | \(0.5\) | ||
Transmission | ||||||
transmission_weight |
Weight | float | \([0,1]\) | \(0\) | ||
transmission_color |
Color | color | \([0,1]^3\) | \((1,1,1)\) | ||
transmission_depth |
Depth | float | \([0,\infty)\) | \([0,1]\) | \(0\) | \(length\) |
transmission_scatter |
Scatter | color | \([0,1]^3\) | \((0,0,0)\) | ||
transmission_scatter_anisotropy |
Anisotropy | float | \([-1,1]\) | \(0\) | ||
transmission_dispersion_abbe_number |
Abbe number | float | \((0,\infty)\) | \([9,91]\) | \(20\) | |
transmission_dispersion_scale |
Dispersion scale | float | \([0,1]\) | \(0\) | ||
Subsurface | ||||||
subsurface_weight |
Weight | float | \([0,1]\) | \(0\) | ||
subsurface_color |
Color | color | \([0,1]\) | \((0.8,0.8,0.8)\) | ||
subsurface_radius |
Radius | float | \([0,\infty)\) | \([0,1]\) | \(1\) | \(length\) |
subsurface_radius_scale |
Radius scale | vector | \([0,1]^3\) | \((1.0,0.5,0.25)\) | ||
subsurface_anisotropy |
Anisotropy | float | \([-1,1]\) | \(0\) | ||
Coat | ||||||
coat_weight |
Weight | float | \([0,1]\) | \(0\) | ||
coat_color |
Color | color | \([0,1]^3\) | \((1,1,1)\) | ||
coat_roughness |
Roughness | float | \([0,\infty)\) | \([0,1]\) | \(0\) | |
coat_anisotropy |
Anisotropy | float | \([0,1]\) | \(0\) | ||
coat_rotation |
Rotation | float | \([0,1]\) | \(0\) | ||
coat_ior |
IOR | float | \((0,\infty)\) | \([1,3]\) | \(1.6\) | |
coat_ior_level |
IOR level | float | \([0,1]\) | \(0.5\) | ||
Fuzz | ||||||
fuzz_weight |
Weight | float | \([0,1]\) | \(0\) | ||
fuzz_color |
Color | color | \([0,1]^3\) | \((1,1,1)\) | ||
fuzz_roughness |
Roughness | float | \([0,1]\) | \(0.5\) | ||
Emission | ||||||
emission_luminance |
Luminance | float | \([0,\infty)\) | \([0,1000]\) | \(0\) | \(nits\) |
emission_color |
Color | color | \([0,1]^3\) | \((1,1,1)\) | ||
Thin-film | ||||||
thin_film_thickness |
Thickness | float | \([0,\infty)\) | \([0,2000]\) | \(0\) | \(nanometers\) |
thin_film_ior |
IOR | float | \((0,\infty)\) | \([1,3]\) | \(1.5\) | |
Geometry | ||||||
geometry_opacity |
Opacity | float | \([0,1]\) | \(1\) | ||
geometry_thin_walled |
Thin walled | boolean | \(\{false, true\}\) | \(false\) | ||
geometry_normal |
Normal | vector | \(N/A\) | \(unperturbed\ normal\) | ||
geometry_tangent |
Tangent | vector | \(N/A\) | \(unperturbed\ normal\) | ||
geometry_coat_normal |
Coat Normal | vector | \(N/A\) | \(unperturbed\ normal\) |
- McAuley S, Hill S, Hoffman N, et al. Practical physically-based shading in film and game production[M]//ACM SIGGRAPH 2012 Courses. 2012: 1-7. ↩︎
- https://argos.vu/wp-content/uploads/2016/03/PBR_Guide_Vol.1.pdf ↩︎
- https://autodesk.github.io/standard-surface/ ↩︎
- https://helpx.adobe.com/substance-3d-general/adobe-standard-material.html ↩︎
- https://docs.blender.org/manual/en/latest/render/shader_nodes/shader/principled.html ↩︎
- https://academysoftwarefoundation.github.io/OpenPBR/ ↩︎