threejs中phong和pbr有啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了threejs中phong和pbr有啥区别相关的知识,希望对你有一定的参考价值。

参考技术A 区别如下:
1.Keyboard input while dragging a selection will cancel the drag
2.Improved backspace behavior when use_tab_stops and translate_tabs_to_spaces are true
3.Improved shift+drag behavior
4.Improved double click drag select behavior
5.About Window shows the license key details
6.Fixed a Goto Anything issue where pressing backspace could scroll the overlay incorrectly
7.Fixed a crash triggered by double clicking in the Goto Anything overlay本回答被提问者采纳

计算机图形学(OPENGL):PBR理论

参考技术A 本文同时发布在我的个人博客上: https://dragon_boy.gitee.io

  PBR,全称phsically based rendering,即基于物理的渲染,是一系列基于相同理论的渲染技术的集合,更接近于真实的物理世界。因为PBR的目标是模拟真实的光照,它比Phong和Blinn-Phong更为真实,而且使用者可以不必调整一些不必要的参数区尽力模拟效果。
  PBR本身也并不是完全的真实的物理模拟,只是基于物理的规则。一个PBR光照模型,需要满足下面3个条件:

  所有的PBR技术都基于微表面模型的理论。该理论定义了,所有微观尺度的表面都可以被描述为微小独立的镜面,被称为微表面。由于表面的粗糙度不同,这些微小的镜面的排列会很不同:

  微表面模型的近似采用一组能量守恒公式:离开表面的光的能量不能高于与表面发生作用前的光的能量,即能量会有一部分损失在物体内部。从上面的图中我们看到,粗糙度越高,高光范围越大,但高光的亮度越低。
  对于能量守恒公式,我们需要区分漫反射和高光。当一束光线碰撞表面时,它就被分为折射部分和反射部分,反射部分形成高光,并不进入表面,这是广义上的高光光照。这是部分留在物体内部分吸收,这是广义上的漫反射光照。
  其实和广义上的模型相比还是有一细微差别,折射光线并不会马上被吸收。在物理层面,我们可以将光线认为是一个带有能量能量体,在失去所有能量前会一直向前移动,而失去能量的方式是碰撞。每个物体都可以考虑为内部包含大量的粒子,这些粒子会作为碰撞体和光线进行碰撞,每次碰撞,这写粒子会吸收一部分光线的能量并转化为热能:

  所有进入物体内部的折射光线的能量并不会被完全吸收,大多数都会向各个方向散射离开表面,而这些能量被吸收过的光线会参与表面的漫反射颜色计算。在PBR中,我们简化这一流程,我们假定所有的折射光线被吸收的能量接着在一个很小的范围内散射,忽略会离开表面一定距离的光线。有一些着色技术考虑了这些离开一定距离的光线,这一技术称为次表面散射,被应用于模拟皮肤、大理石蜡烛这些材质。
  一个额外的差别是金属和非金属表面的区别(也被称为电解质和非电解质)。金属表面的反射和折射所基于的原则和上述一致,但折射光线全被吸收不考虑散射,这就意味着金属表面不考虑漫反射颜色只考虑高光。而非金属表面和上面的原则完全一致。正因为这种金属和非金属的差别,它们在PBR流程中会被区别对待。
  反射和折射的区别也给予了我们另一个不同于能量守恒公式的结论:它们两个是相互排斥的。当光线反射时它永远不会被吸收能量,所以进入表面的能量就全部都是折射光线。
  这样我们可以根据能量守恒公式首先计算高光部分,代表原光线能量被反射的部分,接着剩下的部分的能量直接用来计算折射,即漫反射部分|

  通过这种方式,我们同时拥有了进入光线的反射值和折射值,同时也秉承了能量守恒原则。通过这种方式,让反射值和折射值超过1是不可能的,这确保了它们的能量值的和不会超过进入的光线的能量。

  根据上面讲述的理论,我们可以得出一个名为渲染方程的工具,这个方程时目前模拟光照的最好的方法。基于物理的渲染使用的渲染方程的版本称为反射方程,下面给出反射方程:

  我们将积分区域分为按w所在轴100等分,对每一份dW值,我们计算相应的辐射率,循环将值叠加得到辐照率的结果。
  反射方程将半球 内照射到 点的入射光的辐射率叠加起来,经由 缩放,并返回从观察者方向的反射光辐射率 的总和。入射光辐射率可以来自光源或环境贴图。
   方法代表BRDF方程,也就是双向反射分布方程,可以基于物体的材质属性缩放入射光的辐射率权重。

  BRDF,即双向反射分布方程,将入射光方向,反射光方向,法线,表面粗糙度作为输入参数。BRDF近似描述了每个输入光对最后反射光的贡献,例如,一个类似镜面的表面,BRDF方程对几乎所有的输入光返回0值,除了与反射光方向 呈反射关系的输入光返回1值。
  BRDF基于微表面模型近似模拟材质的反射和折射属性。为了让BRDF的结果物理上可信,它必须遵循能量守恒方程。技术上来说,Blinn-Phong其实是使用相同的 和 作为输入的BRDF,但由于Blinn-Phong并不遵守能量守恒定律,它也不是基于物理的模拟。目前存在许多不同种类的BRDF来基于物理模拟表面材质,对于实时渲染的PBR流程使用的是Cook-Torrance BRDF。
  Cook-Torrance BRDF包含一个漫反射和一个高光部分:

  这里我们使用Trowbridge-Reitz GGX:

  几何函数描述的是每个微表面之间的相互遮挡关系:

  菲涅尔等式描述了不同观察视角的反射光和折射光的比率。每个表面或材质都有一个基础反射率,对应垂直观察表面,从其它角度观察反射会更加明显。举个例子,看看周围的桌子,或木制,或金属制,从垂直方向观察的话会得到基础反射率的效果,如果近乎平行表面观察的方向观察表面,反射会非常明显。所有的表面从这种近乎平行的方向观察得到的强烈反射结果就是菲涅尔效应。
  菲涅尔等式本身十分复杂,这里使用Fresnel-Schlick来近似模拟:

  Fresnel-Schlick函数实现:

  通过Cook-Torrance BRDF的每个组件,我们可以获得最终的反射方程:

  这个反射方程完整的描述了一个PBR模型。

  在实际工作中,往往使用各种贴图来控制PBR流程中的表面的参数,描述了平面中的某一点对光照的反应,即:这个点的金属度,粗糙度,平面如何应对不同波长的光。
  下面是PBR流程中使用的几张贴图,并使用这几张贴图进行渲染输出:

  最后,给出原文地址供参考: https://learnopengl.com/PBR/Theory

以上是关于threejs中phong和pbr有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学(OPENGL):PBR理论

threejs color 和 emissive 有啥区别

cesium 和 Three.js有啥区别,以及二者与WebGL 的关系

使用JSONLoader在threejs上导入3d对象

C# 中各种线程同步选项有啥区别?

Three.js:Lambert 和 Phong 之间的确切区别是啥?