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\)
  1. 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. ↩︎
  2. https://argos.vu/wp-content/uploads/2016/03/PBR_Guide_Vol.1.pdf ↩︎
  3. https://autodesk.github.io/standard-surface/ ↩︎
  4. https://helpx.adobe.com/substance-3d-general/adobe-standard-material.html ↩︎
  5. https://docs.blender.org/manual/en/latest/render/shader_nodes/shader/principled.html ↩︎
  6. https://academysoftwarefoundation.github.io/OpenPBR/ ↩︎

OpenPBR介绍
https://reddish.fun/posts/Article/OpenPBR-intro/
作者
bit704
发布于
2024年1月18日
许可协议