上文简单过了一遍Unity Standard材质,而Standard材质的核心便是UNITY_BRDF_PBS函数,Unity的BRDF模型。本文主要的目的就是根据资料分析BRDF模型,加深对Unity BRDF的理解。

上来先开门见山说明下BRDF,双向反射分布函数(Bidirectional Reflectance Distribution Function),用来定义给定入射方向上的辐射照度(irradiance)如何影响给定出射方向上的辐射率(radiance)。更笼统地说,它描述了入射光线经过某个表面反射后如何在各个出射方向上分布——这可以是从理想镜面反射到漫反射、各向同性(isotropic)或者各向异性(anisotropic)的各种反射,而我们在Unity里面使用BRDF模型的目的就是为了模拟真实光照。那我们首先来回顾下光照以及Unity的光照模型。

光照现象

只要学过基础物理课程的,对光学都有大概的了解,光是由光源发出,物体本身的颜色是因为该物体可以反射更多对应颜色波长,吸收了其他颜色波长。在光学中,用来定量描述辐射能强度的量有两类,一类是物理的辐射度量学,是用能量单位描述光辐射能的客观物理量。另一类是生理的光度量学,是描述光辐射能为平均人眼接受所引起的视觉刺激大小的强度,我们暂不讨论。

辐射照度即辐射度(irradiance)的定义就是投射在单位面积上的辐射通量。

whereΦe is the radiant flux received;

A is the area.

以平行光l为例,它的辐射度可以通过计算垂直于l的单位面积上单位时间穿过的能量。物体表面通常和l不垂直,由下图可以得出倾斜的光在单位面积上接收的光线数量要更少一些,可以得出辐射度与d/cosθ成反比,cosθ可以通过光源与表面法线的点积得到。

而光线照射到物体表面会有两种结果,散射和吸收。散射只改变光线的方向,不改变光线的密度和颜色。而吸收只改变光线的密度和颜色,不改变光线的方向。散射后光线会有两种方向,到物体内部的称为折射,到物体外部的称为反射。为了区分这两种散射现象,我们在光照模型中分别用Specular(高光反射)模拟表面反射,Diffuse(漫反射)来模拟光线折射、吸收以及重新散射出去的部分。

而出射光线的方向和数量,同样有着量化的单位。辐射出射度即出射度(Radiant exitance)的定义就是辐射体在单位面积内所辐射的通量。

whereΦe is the radiant flux emitted;

A is the area.

光照模型

辐射度和出射度之间是满足线性关系的,它们之间的比值就是材质的高光反射和漫反射属性。而着色(shading)指的是,根据材质属性、光源信息,使用一个等式去计算某个方向出射度的过程。同时我们也把这个等式称为光照模型(Lighting Model)。

光照模型有很多的种类,早期的游戏引擎只使用一个光照模型,这个模型就是标准光照模型。也就是Phong光照模型,是由裴祥风提出的使用漫反射(兰伯特模型)和高光反射的和来对反射光线进行进行建模,并且提出了基于经验计算高光反射的方法,之后Blinn模型简化了高光反射部分的计算而衍生出了Blinn-Phong光照模型。运算简单,适合早期硬件实现,在显卡只支持固定管线(Fixed Pipeline)的年代,Blinn-Phong模型是设计在显卡硬件中的,OpenGL/Direct3D固定管线的光照模型就是Blinn-Phong模型。

Unity的标准光照模型包含了环境光、自发光、漫反射、高光反射。但是这类光照模型都有一个共同的缺陷,就是各项同性(isotropic)即我们固定视角和光源方向旋转表面,反射不会发生任何变化。如果应用到各项异性(anisotropic)的表面上如毛发、拉丝金属,光照的不真实性就会凸显。而且如果想要模型渲染出高质量的图像,需要繁复地调参数。

近几年比较流行的次时代游戏基本上都采用了PBR技术,然而基于物理的渲染已经提出好多年了。基于物理的、保能量的渲染模型可以很容易地建立出在不同光照环境下都接近真实的材质表现。事实上基于物理的渲染并不会比传统上的经验模型更难实现,计算量也相差不多。不过在Unity中,在传统的经验模型下,我们通常会采用离线渲染的方式烘焙光照贴图,规避实时光带来的额外计算量。

BRDF

在有了上面的理论基础,我们再来看BRDF函数本身,就没有那么难理解了。概况地说,BRDF是一个抽象的工具用来描述光子撞击材料的宏观行为,这样说可能比较难理解,我们用BRDF的目的就是给定一个入射方向后,算出所有出射方向上的反射和散射的光线分布。

用f(I,v)来表示的话(I为入射方向,v为观察方向),当光线沿着入射方向I到达表面的时候,f(I,v)表示了有多少能力反射到了观察方向v上。

未完待续...

References:

2. [基于物理着色:BRDF](Maple:基于物理着色:BRDF)

3. [基于物理着色(四)- 次表面散射](文刀秋二:基于物理着色(四)- 次表面散射)

pbr发光 unity_Unity PBR—BRDF相关推荐

  1. pbr发光 unity_PBR的基础理论

    参考文献: 腾讯课堂taecg 冯乐乐shader入门精要 浅墨CSDN博客文章 传统的贴图渲染技术与PBR渲染的区别: 传统的贴图渲染技术: 传统的贴图渲染技术一般是使用3张贴图来表现模型的效果:漫 ...

  2. 【PBR系列三】BRDF方程及渲染方程

    本文核心知识主要参照<现代计算机图形学入门-闫令琪课程课件PPT>,后续光线追踪系列知识也源于此处. 一.BRDF方程 通过上一部分所有辐射度量学各种概念的定义之后,我们可以从这样一个角度 ...

  3. linux pbr模块安装,PBR with Linux :Linux Advanced Routing Traffic Control HOWTO

    Prerequisites You should make sure that you have the userland tools installed. This package is calle ...

  4. 【笔记】PBR,BRDF总结

    bsdf = brdf + btdf brdf:用于描述光(辐射能量)在两个物体交界处怎么反射.怎么折射 这个定律的前提是两个表面是光学光滑的,而现实世界中基本不存在这样的表面,所以又搞出来个微表面理 ...

  5. PBR中BRDF的实现

    文章目录 PBR中BRDF的实现 白说 辐射度量学(Radiometry) Radiant flux Radiant Intensity 立体角(Solid Angle) 圆心角 Irradiance ...

  6. 【技术美术图形部分】PBR直接光部分:Disney原则的BRDF和次表面散射模型

    写在前面 补充去年遗漏下的知识.很多叙述都是参考了众多大佬的文章!因为是作为个人学习总结的博客,所以直接卑微的借鉴过来了,后面会给出所有参考的文章. 另外,放上一个忘了在哪一篇知乎评论里的截图: 说的 ...

  7. [图形学] 基于物理的渲染(PBR)

    reference :<real-time rendering 4> BRDF 概述 基于物理的渲染即计算沿着视线进入相机的光照辐射.如果不考虑吸收或散射的介质,则进入相机的辐射等于离开相 ...

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

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

  9. UnityShader32:PBR(一)

    一.整装待发 1.1:万事俱备 UnityShader相关: UnityShader1:渲染流水线 ~ UnityShader24:最简单的屏幕后处理例子 最好还是了解一个图形接口:OpenGL 或者 ...

  10. unity build-in管线中的PBR材质Shader分析研究

    PBR分析 前言 我理解的PBR PBR组成部分 直接光漫反射 直接光镜面反射(高光) 间接光漫反射 间接光镜面反射 最终加和 结果 前言 近来,用到了几次Surface Shader,对于其封装好的 ...

最新文章

  1. python编程有哪些-python编程工具有哪些
  2. VTK:PolyData之RemoveOutsideSurface
  3. CodeForces - 1110C-Meaningless Operation(打表找规律)
  4. 美团外卖iOS多端复用的推动、支撑与思考
  5. 腾讯视频中如何把视频进行收藏
  6. cocos2d-x Lua与OC互相调用
  7. Invoke and BeginInvoke BeginInvoke和EndInvoke方法 (转)2
  8. strcmp() Anyone? UVA - 11732 左孩子右兄弟Trie/计数
  9. verilog之状态机详细解释(一)
  10. 一键安装thrift-0.9.0的脚本
  11. 程序员转公务员之Hello World
  12. 国考省考行测:继续讲结构分析法的分总、总分、分分、分总分、总分总的真题例题讲解,错项的特点规律
  13. Spring Boot当中获取request的三种方式
  14. 阅读《人类简史》-- 1.认知革命
  15. MSVCRTD.lib
  16. docker-compose 启动mysql、mongodb
  17. FlowNet2.0 win10系统疑难问题解决
  18. vb 复制 剪贴板 html,用vb实现将脚本的输出复制到剪贴板
  19. small用于不连续数组_shell 编程进阶与自动化脚本expect的运用
  20. 深蓝学院SLAM理论与实践课程

热门文章

  1. 模拟django-simple-captcha实现中文验证码、数字及字母验证码、计算题验证码功能
  2. 利用python批量查询企业信息_Python 实现批量查询域名可用性
  3. rdt协议的java实现_rdt3.0发送方程序(Java实现)
  4. 一张纸的厚度是0.0001米,将纸对折,问对折多少次厚度超过珠穆朗玛峰8848米
  5. qt获取 扫码枪_QT获取激光扫描枪获取条形码数据
  6. 自定义控件1_切换按钮
  7. CSS控制多行文本省略--显示省略号
  8. poj-2115 C Looooops 扩展欧几里德算法求最小非负整数解
  9. 说说 褥羊毛和薅羊毛的那些事
  10. 计算机网络常见面试知识点总结