PBR 六 材质参数

前言

本章主要介绍贴图(本章的参数)与上两章中的公式之间的映射,这种映射主要时为了用户或者美术能够方便的观察和调试参数。这个映射会影响最终效果。

参考资料

  1. Google Filament
  2. [Burley12] Brent Burley. 2012. Physically Based Shading at Disney. Physically Based Shading in Film and Game Production, ACM SIGGRAPH 2012 Courses.
  3. [Lagarde14] Sébastien Lagarde and Charles de Rousiers. 2014. Moving Frostbite to PBR. Physically Based Shading in Theory and Practice, ACM SIGGRAPH 2014 Courses.

Disney BRDF参数

在这里插入图片描述

  • baseColor:表面颜色,通常用纹理贴图提供
  • subsurface:通过次表面近似来控制漫反射形状(controls diffuse shape using a subsurface approximation)
  • metallic:0为电介质;1为金属。这是两个模型的线性混合参数。金属流没有diffuse量,反射是会带上baseColor的颜色(tinted incident specular)。
  • specular:入射光的反射量,这是显示折射率(IOR)的代替
  • specularTint:对反射颜色调色,让艺术家能够将反射颜色朝向baseColor
  • roughness:表面粗糙度,同时控制diffuse和specular
  • anisotropic:各向异性的程度,控制镜面高光的纵横比;0=各向同性,1=各向异性
  • sheen:光泽,额外的掠射角量,主要用于布料
  • sheenTint:类似specularTint,对sheen效果进行调色,让sheen光泽趋向于baseColor
  • clearcoat:清漆,一种特殊用途的高光波瓣
  • clearcoatGloss:控制清漆光泽度(0=缎外观satin appearance,1=光泽外观gloss appearance)

Google Filament

在这里插入图片描述图片来源:Figure 17 in https://google.github.io/filament/Filament.html

  • BaseColor:非金属材质为diffuse albedo;金属材质为specular color。Linear RGB,[0…1]
  • Metallic:0为电介质;1为金属导体。一般是0或者1的二值贴图。[0…1]
  • Roughness:粗糙度。[0…1]
  • Reflectance:对电介质表面,垂直光照的菲涅尔反射 F 0 F_0 F0;可代替IOR。[0…1]
  • Emissive:额外的漫反射参数,用来模拟发射表面(emissive surface),如霓虹灯neons等。在HDR管道中的bloom步骤中有很大作用。Linear RGB[0…1]+曝光补偿
  • Ambient Occlusion:定义表面点可以得到的环境光的数量,介于0到1之间的每个像素阴影系数。[0…1]
  • Anisotropy:各向异性的程度,控制镜面高光的纵横比;0=各向同性,1=各向异性
  • ClearCoat:清漆,一种特殊用途的高光波瓣。[0…1]
  • ClearCoatRoughness:控制清漆粗糙度(1=缎外观satin appearance,0=光泽外观gloss appearance)。[0…1]
  • SheenColor:反射颜色调色,用来创建两个色调的镜面织物(默认0.04以匹配标准反射率)
  • SubsurfaceColor:对材质散射和吸收后的漫反射颜色进行调色

下图为当Metallic=1,roughness=0.8时,ClearCoat从0到1的效果图
在这里插入图片描述
图片来源:Figure 25 in https://google.github.io/filament/Filament.html
下图为当Metallic=1,roughness=0.8,ClearCoat=1.0时,ClearCoatRoughness从0到1的效果图在这里插入图片描述
图片来源:Figure 26 in https://google.github.io/filament/Filament.html
下图为Anisotropy从0到1的效果图在这里插入图片描述
图片来源:Figure 28 in https://google.github.io/filament/Filament.html

这里的参数范围是shader代码所希望得到的,在UI或者用户交互时,应该使用更直接的数据格式。例如,BaseColor一般会用sRGB呈现给用户,在渲染前转换为线性RGB空间给到shader。

Filament参数的Remapping

BaseColor Remapping

材质的base color会收到metallic的影响,如下:

vec3 diffuseColor = (1.0 - metallic) * baseColor.rgb;

反射率映射

使用在[Lagarde14]中对电介质进行映射: F 0 = 0.16 ⋅ r e f l e c t a n c e 2 F_0=0.16\cdot reflectance^2 F0=0.16reflectance2
这是为了将specular图映射到一个区间,可以合适表示电介质(4% reflectance)和宝石(8%-16%)的菲涅尔值。在该映射中,在线性RGB灰度空间的128(或者0.5)所对应的菲涅尔反射率(Fresnel reflectance)为4%。
在这里插入图片描述
图片来源:Figure 18 in https://google.github.io/filament/Filament.html

如果折射率(IOR)已知,例如空气-水的IOR为1.33,其菲涅尔反射率: F o = ( n i o r − 1 ) 2 ( n i o r + 1 ) 2 F_o=\frac{(n_{ior}-1)^2}{(n_{ior}+1)^2} Fo=(nior+1)2(nior1)2
同样如果已知菲涅尔反射率,其IOR: n i o r = 1 1 − f o − 1 n_{ior}=\frac{1}{1-\sqrt{f_o}}-1 nior=1fo 11
下面列举了常见的反射率,现实世界中,没有小于0.02的材质。
在这里插入图片描述
图片来源:Table 4 in https://google.github.io/filament/Filament.html
对于导体(金属)而言, F 0 = B a s e C o l o r ⋅ m e t t a l i c F_0=BaseColor\cdot mettalic F0=BaseColormettalic
下图列举了几种常见金属的 F 0 F_0 F0,值得注意的是这些值是sRGB,在使用的时候应转换为Linear RGB。
在这里插入图片描述
统一一起,代码如下:

vec3 f0 = 0.16 * reflectance * reflectance * (1.0 - metallic) + baseColor * metallic;

Roughness

用户设置的粗糙度一般称为perceptualRoughness,其映射公式为: α = p e r c e p t u a l R o u g h n e s s 2 \alpha=perceptualRoughness^2 α=perceptualRoughness2
在这里插入图片描述
上图的上半部分是使用映射的,下半部分是没有使用映射;可以发现不适用映射,高亮的金属的粗糙度范围很小[0.0,0.05]。在[Burley12]中指出,简单的平方映射以最小的计算代价得到一个好的视觉和感官效果。在实际运用中,一般会用到 α − 2 \alpha^{-2} α2,这样对于非常小的roughness则会带来一些溢出问题(出现除0),特别是使用半精度浮点的手机GPU上。

半精度的最小值为 2 − 14 2^{-14} 214 6.1 × 1 0 − 5 6.1\times 10^{-5} 6.1×105,为了使 α 2 \alpha^{2} α2不小于这个值,一般会将perceptualRoughness截取的0.089,此时, α 2 = 6.274 × 1 0 − 5 \alpha^{2}=6.274\times 10^{-5} α2=6.274×105

而且,如果想高光具有一个最小大小(roughness=0基本没有高光),我们也需要将perceptualRoughness限制在一定的范围;同样,过小的roughness还会带来反射锯齿。在Frostbite引擎中,perceptualRoughness会截取到0.045来抗锯齿。

小结

BaseColor:尽量排除光照信息, except for micro-occlusion.
Metallic:大部分应该是一个二值,0代表非金属,1代表金属。尽量使得值靠近0和1,中间值表示的是表面类型的过渡。

非金属:
BaseColor代表的是反射颜色,sRGB值应该是在50-240 (strict range),或者30-240 (tolerant range).
Reflectance:如果不知道是多少,可以设为127 sRGB,即线性RGB的0.5,代表4%反射率。在sRGB空间不应该低于90,即线性RGB的0.35,代表2%反射率

金属:
BaseColor代表的是反射颜色和反射率。使用sRGB在170-255,代表亮度在67%-100%。氧化或者脏的金属可以更低。
Reflectance:该参数会被忽略,从BaseColor中计算得到。

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当涉及到手写 PBR(Physically Based Rendering,基于物理的渲染)材质着色器时,以下是一个简单的示例,用于实现标准的 PBR 材质模型: ```c // 着色器属性 uniform vec3 uAlbedo; // 反射率颜色 uniform float uRoughness; // 粗糙度 uniform float uMetallic; // 金属度 // 表面法线和视图方向 in vec3 vNormal; // 顶点法线 in vec3 vViewDir; // 视图方向 // 光源属性 uniform vec3 uLightDir; // 光源方向 uniform vec3 uLightColor; // 光源颜色 void main() { // 计算使用 Cook-Torrance BRDF 模型的光照 vec3 N = normalize(vNormal); vec3 V = normalize(vViewDir); vec3 L = normalize(uLightDir); vec3 H = normalize(V + L); // 半向量 // 计算漫反射项 float NdotL = max(dot(N, L), 0.0); vec3 diffuse = uAlbedo * NdotL; // 计算镜面反射项(使用 Cook-Torrance BRDF) float NdotH = max(dot(N, H), 0.0); float roughnessSquared = uRoughness * uRoughness; float F0 = mix(0.04, 1.0, uMetallic); vec3 specular = vec3(0.0); if (NdotL > 0.0) { float NdotV = max(dot(N, V), 0.001); float NdotH2 = NdotH * NdotH; float alpha = roughnessSquared; float D = exp((NdotH2 - 1.0) / (alpha * NdotH2)); float F = F0 + (1.0 - F0) * pow(1.0 - NdotV, 5.0); vec3 F_specular = vec3(F); float G = min(1.0, min(2.0 * NdotH * NdotV / NdotL, 2.0 * NdotH * NdotL / NdotV)); vec3 G_specular = vec3(G); specular = D * F_specular * G_specular / (4.0 * NdotL * NdotV); } // 最终颜色 = 漫反射 + 镜面反射 vec3 finalColor = diffuse + specular; // 输出颜色 gl_FragColor = vec4(finalColor, 1.0); } ``` 这只是一个简单的 PBR 材质着色器示例,实际中可能还包含其他的贴图、光照模型或者其他参数。这段代码可以作为一个起点,你可以根据需要进行修改和扩展。请记住,PBR 材质着色器通常需要更多的计算和参数,以便更真实地模拟光照和材质的物理特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值