the pbr guide总结

# brief
- pbr的核心是对材质的建模、对金属非金属的明显区分、参数取值的限制
- pbr的特点:BRDF(能量守恒导致不会反直觉、Fresnel和roughness/glossiness更真实地描述材质)、线性算光照也是导致不会反直觉
- metallic/roughness
    - basemap/metal的值在metal和非metal情况下有完全不同的意义,dielectric的F0被写死成0.4,metal的albedo写死成0
    - roughness只是描述表面粗糙度,随意
- specular/glossiness
    - 和metallic/roughness没啥本质不同,核心shader公式都是公用的.只是对开参数、内存占用更大更容易出错
    - 完全开放了albedo和specular,犯错可能性提升
    - glossiness就是1-roughness




# Microfacet Theory
- 所谓microfacet theory,就是把表面建模成:认为surface微观上是一个个小平面,每个小平面有朝向、并根据normal做镜面反射,但是也有被其他表面遮蔽(shadowing(light被遮挡), masking(view被遮挡))的情况.由于反射方向不平行,所以粗糙表面高光是模糊的
- surface irregularity: roughness, smoothness, glossiness等名字
- GGX vs Phong, GGX有shorter peak和longer tail,说是显得真实


# Fresnel Effect
- 就是在界面上,随着入射角越来越大,反射增强,折射减弱
- F0,就是逆着normal方向从空气入射表面时,反射出来的光强/入射光强的比例,fresnel reflectance at 0 degree
- 对于rough surface,就算90度入射也不会100%反射,因为microfacet上各个表面有不同的normal
- dielectric和conductor.dielectric的F0通常0.02-0.5, 而conductor是0.5-1.0
- authorizing的时候关心的是F0,对于dielectric是个greyscale,对于conductor是个RGB,区分金属和非金属
- 在算上了roughness后,dielectric的fresnel就不明显了


# metal
- metal的reflectance高,refraction都被吸收。所以metal没有diffuse color(都被吸收了)
- corrode(侵蚀),绣、涂料可能都是dielectric


# non-metal
- refraction更多,所以有albedo color
- F0在2%-5%,sRGB 40-75(变成浮点数后要gamma矫正以得到linear值)


# linear space rendering
- standard的srgb到linear转换是个分段函数,srgb比较小的时候是线性的
- performance reason我们用Clinear = CsRGB ** 2.2


# benefit of pbr
- easy to create realistic-looking assets
- look accurate in all lighting condition
- consistent even between different artists


# metal/roughness workflow
- 用到的map
    - basecolor(3channel),metal和dielectric的relfectance都存在这里
        - 对于metal来说是reflectance value,值一般在70%-100%(180-255 sRGB)
        - 对于non-metal来说是reflected color,看上去应该显得对比不高,暗不超过30-50 sRGB,明不超过240 sRGB
        - 不应该包含AO信息
        - F0对于dielectric在metal/roughness里是写死成4%的。substance和UE4里有时候通过一个specular level让你调dielectric的反射率,2%-5%
    - roughness(1channel)
        - smooth surface的specular是focused,rough surface的表面是dim-looking
    - metallic(1channel),mask是不是金属.非金属写死用4%的F0
        - metallic map的内容应该和basecolor的内容保持一致,金属非金属的取值范围
        - 基本上是非0即1,如果是metal,则metal值为235-255 sRGB,此时对应的basecolor应该是180-255 sRGB
    - 复杂情况
        - 被喷漆、侵蚀的金属
            - 刮过的地方,raw metal,就是metal
            - 绣、漆算是dielectric
        - 偏金属的渐变(氧化、锈的渐变)
            - 正经的锈迹和氧化还是dielectric
            - metal值低于 sRGB 235,此时basecolor也要相应变低(low reflectance)
- 金属非金属交接处的白边(artifact)
    - 使用metal/roughness时是白边,使用specular/glossiness时时黑边(不那么明显)
    - 原因是texture interpolation导致的0.5 metal值
    - 可以用transition来缓解
    - UV、texture resolution都可能引发问题


- pros & cons
    - pros
        - 生产容易,不容易出错
        - 使用texture更省
        - widely adopted
    - cons
        - F0没法控制
        - edge更明显(比起黑的)


# specular/glossiness workflow
- 用到的map
    - albedo(diffuse)(3channel)
        - 这个就真的只是albedo了,纯金属就应该是黑的,但是生锈、氧化啥的就会有
    - specular(3channel)
        - 对于metal就是reflectance
        - 对于dielectric就是F0(这样就可以真的控制,而不是像metallic/roughness里一样写死0.04了)
    - glossiness(1channel)
        - 其实就是metallic/roughness里的roughness,只不过是倒过来


- problem
    - 由于开放了specular,所以更容易出错了,比如albedo=1.0,specular=1.0,那就不能量守恒了
    - 虽然名字变了,但是存的东西其实和metallic/roughness workflow差不多,所以取值范围还是一样


# 能量守恒
- 这么看来,就算是metallic/roughness,在metal不是1.0的时候也是有犯错误的可能的,而specular/glossiness就更加容易出问题了,因为有2个RGB值...
- 另外,metallic/roughness在metal和basecolor对不上的时候(一边是金属一边是非金属)也会不守恒,比如非金属特亮、金属特暗?


# 都有的map
- AmbientOcclusion:注意,只应影响diffuse,不影响specular,另外也不应该搞到basecolor里
- height:咱不用
- normal:是个人都知道




# reference
- 面向对象是美术,但是程序不熟PBR也是应该完全搞懂的:https://www.allegorithmic.com/pbr-guide

猜你喜欢

转载自blog.csdn.net/killer4747/article/details/80848910
PBR