# 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

the pbr guide总结相关推荐

  1. Substance PBR Guide

    https://academy.substance3d.com/courses/the-pbr-guide-part-1 转载于:https://www.cnblogs.com/lilei9110/p ...

  2. 【PBR系列四】PBR核心原理及材质属性查询

    本文核心知识主要参照知乎毛星云浅墨的游戏编程文章总结归并,并根据个人学习方向进行了筛选摘抄,如有错误或不完整之处,可参照原文阅读. 本部分将主要关注基于物理的渲染的核心理论与渲染的光学原理,以在整个系 ...

  3. 【基于物理的渲染(PBR)白皮书】(二) PBR核心理论与渲染光学原理总结

            本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处           文章链接: https://zhuanlan.zhihu.com/p/56967462 这是[基于物理的 ...

  4. 两种不同的PBR工作流介绍

    本文介绍两种常用的PBR材质工作流:金属/粗糙度工作流(Metal/Roughness)和镜面反射/光泽度工作流(Specular/Glossiness).这两种工作流都可以用来制作一个支持PBR的材 ...

  5. [引擎开发] PBR材质的原理

    [本文大纲] 基础概念篇 引入 光线与介质的作用 光线的传播路径 体积散射和表面光照 光线和介质外观 微平面理论 概念介绍 中间向量 能量守恒定律 微平面理论的不足 光照计算 半球积分 单位光照 反射 ...

  6. 基于物理的渲染学习心得——面向使用的PBR理论

    本文是笔者在学习PBR理论中的一些心得,并试图以结合Substance系列软件为例,从使用(实用)层面介绍PBR理论. PBR的定义: PBR全称是基于物理的渲染(Physically Based R ...

  7. 图形API学习工程(28):实现基于Cook-Torrance与GGX的PBR渲染

    工程GIT地址:https://gitee.com/yaksue/yaksue-graphics 目标 本篇基本上是对<[翻译]Coding Labs :: Physically Based R ...

  8. 美术 2.7 Metallic与Speculer流程

    本篇参考B站视频[技术美术百人计划]美术 2.7 Metallic与Speculer流程_哔哩哔哩_bilibili 参考知乎链接:https://zhuanlan.zhihu.com/p/53086 ...

  9. 引导分区 pbr 数据分析_如何在1小时内引导您的分析

    引导分区 pbr 数据分析 by Tim Abraham 蒂姆·亚伯拉罕(Tim Abraham) 如何在1小时内引导您的分析 (How to bootstrap your analytics in ...

  10. 【Unity URP】手写PBR:从build-in转到URP

    写在前面 后续要在URP下实现PBR+NPR的风格化渲染,所以这里要赶紧把之前手写的PBR挪到URP管线下.由于URP各个版本更新换代太快了,贴一下项目环境,给后面看到这篇文章的小伙伴提个醒,我的项目 ...

最新文章

  1. 谷歌和Facebook正在吸走欧洲的人才
  2. NeurIPS 2019 | 适用于众多模型的Embedding正则化方法
  3. spring boot+mybatis-plus+SQL server调用有返回值的存储过程
  4. 一个亿万富翁和一个陌生人的换钱计划
  5. Spring Boot Cache使用与整合
  6. 开发不能上外网怎么查资料_中考生不能复读,近一半上不了高中,怎么办?
  7. oracle em搭建,【oracle】手动安装EM
  8. Java基础学习总结(153)——HashMap、Hashtable、ConcurrentHashMap的原理与区别
  9. 简单mysql程序_【备忘】mysql简单操作程序
  10. vue 打包后本地先自己启动服务 anywhere 非常好用
  11. 一个按钮多个ajax,如何为表格中的多个按钮设置AJAX调用
  12. Redis内存相关知识
  13. ZYNQ7020 FPGA如何从Flash启动的详细步骤
  14. java程序设计精编教程第3版电子版课后答案_java程序设计精编教程第3版答案
  15. spark-sql 方差和标准差
  16. excel打不开html格式的文件,excel文件打不开提示格式无效怎么解决【图文】
  17. 增强型MOSFET导通条件
  18. 卸载删除gitlab
  19. 矩阵的特征值和特征向量
  20. [应用广播], 一览华夏文化,诗词三万首震撼上线

热门文章

  1. Unity5.0 烘焙物体导入其他场景
  2. 暑假2019培训:Day3Day4提高组测试赛
  3. [pip安装]There was a problem confirming the ssl certificate
  4. JavaScript Navigator
  5. python获取mac地址_python获取mac地址的方法
  6. 桌面快捷方式图标异常怎么办
  7. android开发 节省流量,流量节省程序模式  |  Android 开源项目  |  Android Open Source Project...
  8. 基于Android Tv制作一个Tv桌面(三)
  9. 现代笑话二则2 木子家创作
  10. 无法启用家庭计算机共享,无法启用共享访问,详细教您无法启用共享访问怎么解决...