BRDF·基于物理的着色技术学习总结

基于物理的着色真的不是特别好理解···在这里记录一下自己比较粗浅的认识···立体角要了解BRDF的相关内容,首先要对立体角有一定的理解。立体角是对平面角在三维空间的一个扩展。平面角就是一个顶点两条射线围成的那个角度,它的大小等于单位圆上的弧长,单位是弧度或者度,那么类比到三维空间,立体角就是从一个顶点发出的一个锥体所围成的一个三维角度,它的大小等于单位球上的面积,单位是球面度,一个单位...
摘要由CSDN通过智能技术生成

基于物理的着色真的不是特别好理解···在这里记录一下自己比较粗浅的认识···

立体角

要了解BRDF的相关内容,首先要对立体角有一定的理解。立体角是对平面角在三维空间的一个扩展。平面角就是一个顶点两条射线围成的那个角度,它的大小等于单位圆上的弧长,单位是弧度或者度,那么类比到三维空间,立体角就是从一个顶点发出的一个锥体所围成的一个三维角度,它的大小等于单位球上的面积,单位是球面度,一个单位球的面积是4π,因此一个球面的立体角就是4π。 w=A/r2 w = A / r 2 ,其中A是视锥与球相交的面的面积,r^2是球的半径,由此可知,和平面角与圆的大小无关一样,立体角是与球的大小无关的。
这里写图片描述
那么为什么要引入立体角这一概念呢?设想现在要做光线追踪,从视点朝像素的方向发出一条射线,这条射线最终落在几何物体上的颜色就是像素的颜色,可是这样做是不准确的,事实上像素并不是一个点,它是有面积的,也就是说原则上不能实现“从视点朝像素的方向发出一条射线”这样的操作,因为这样的射线是有无数条的。那么正确的做法应该是:像素的颜色是视点朝像素的平面发出的射线构成的视锥与几何体相交的那个曲面的颜色,然而这种做法几乎不可能实现,因为求相交面这样的操作很难做到。而又想更为精确的绘制一个像素的颜色,这就需要用到立体角了。
不妨将像素就看做一个点,从视点朝像素方向发出一条射线,与几何体相交,此时不直接将几何体落点的颜色作为像素的颜色,而是在落点面向其法线方向做一个单位半球,如图所示,
这里写图片描述
将照过来的这一条光线看做是照在这个棕色视锥里的一束光线,也就是说,现在采用的方式是将投影区域作为一个点,然后将这个椎体与半球的相交的这个面来作为投影面积捕获光照信息,这一过程就是在对立体角作积分,很显然,这种方式也是不准确的,是一种近似的手段,但它相较于之前的模型已经有了很大的改进。
关于立体角还有一个问题就是它的微分式的代换:

dω=sinθdθdψ d ω = s i n θ d θ d ψ

推导过程:由立体角的定义可知,
ω=Ar2 ω = A r 2

那么:
dω=dAr2(1) (1) d ω = d A r 2

由球面微分的代换式(将x、y换元然后雅克比行列式):
dA=sinθr2dθdψ(2) (2) d A = s i n θ r 2 d θ d ψ

将2式带入1式即可。

辐射学理论

基于物理的着色都是遵循了一定的物理规律,其中最根本的就是辐射学理论,以下是辐射学的基本量:
辐射通量(Radiant Flux)
也叫辐射通率,光子都是有能量的,辐射通量就是指光在单位时间内通过表面的能量的总量,用符号 ϕ ϕ 表示, ϕ=dQdt ϕ = d Q d t
辐照度(Irradiance)和辐出度(Radiant Existance)
辐照度指的是单位时间内通过单位面积的能量的总量,也可以看做是辐射通量对面积的密度,用符号E表示, E=dϕdA E = d ϕ d A 。而辐出度也表示辐射通量对面积的密度,不同的是辐照度衡量的是到达表面的光,而辐出度表示的是离开表面的光。
这里写图片描述
现在需要考虑这个面积指的是哪个面积,如果光是垂直设向这个表面的,很显然,面积就是表面的面积,但是如果光是倾斜地射向表面的呢?如图所示,倾斜照射的情况下,相同的辐射通量的光到达的表面变大了,也就是说这个时候辐照度是变小了的,因此在光线倾斜的时候,应该只考虑表面垂直与光线的那一部分面积,即将表面投影到与光线垂直的地方,用式子来表示这一关系:

E0=dϕdA0=dϕdAcosθ=Ecosθ E 0 = d ϕ d A 0 = d ϕ d A c o s θ = E c o s θ

其中 E0 E 0 表示光线完全垂直照射到表面时的辐照度, cosθ c o s θ 表示光线与法线的夹角,因此倾斜光线的辐照度为 E=E0cosθ E = E 0 c o s θ
现在假设一个点光源放在一个球的球心位置,那么它朝着各个方向的辐射通量都是相同的,那么通过整个球面的辐照度就是 E=ϕ4πr2 E = ϕ 4 π r 2 ,当也就是说辐照度实际上是与球的半径的平方成反比,也就是说光的衰减与距离的平方成正比。
辐射强度(Radiant Intensity)
如果要衡量一个点的辐射通量密度该怎么做?显然不能用辐照度来衡量,因为一个点是没有面积的,点的辐照度肯定为零。前文所描述立体角时所说的实际在做光线追踪的时候,对于一个像素,是将其看成一个点,然后求光线与几何体的交点,然后再在这个交点的位置做一个半球,将光线视作一个锥体射向了交点,这样做是因为光线不仅有方向也有粗细,它不只是一条简单的射线。那么也就是说,可以对一个点衡量它的单位立体角的辐射通量,那么这就是辐射强度的定义。辐射强度用 I I 表示, I = d ϕ d w ,立体角是不随距离的变化而变化的,因此辐射强度也不随着距离的变化而变化。
辐射率(Radiance)
这里写图片描述
首先有一点一定要记住就是,在基于物理的着色中辐射率就是最终人眼看到的颜色。现在考虑人眼看物体的一个事实:在正常情况下,对于一个物体来说,它离人眼的距离并不影响人眼看到的这个物体的颜色,一个物体离人眼越远,它确实会变小,但它的颜色还是不变的,该是蓝色的汗是蓝色,而不会因为离的远了,就变成了红色或者其他颜色,因此辐射率首先一定是与距离无关的。再进一步想一下,当物理离人眼远了,那么物体的辐照度实际上是变小了的,也就是人眼收到的辐射通量肯定是变化了的,那么为什么颜色还能不变?原因就是在辐照度变小的同时,立体角也变小了,如图所示。既然辐射率表示颜色,那么在辐照度一定的时候,辐射率与立体角就成反比;在立体角一定的时候,辐射率就与辐照度成正比,那么就可以大胆地写出辐射率的定义式: L=Edw=ϕdA0dw L = E d w = ϕ d A 0 d w ,其中L是辐射率, A0 A 0 是投影面积。

这就是辐射学的一些基本量的定义,最困扰我的地方是为什么这么多量要考虑单位面积、单位立体角下的辐射通量?我个人的理解是,这要考虑人眼看物体的规律,假设一个面发出了一定能量的光,那么换个更大的平面发出等量的光,人眼看到的实际效果还会一样吗?肯定不会,因为分散到平面上的每个部分的光实际上是变化了的,因此这个平面整体的颜色是会变化的。再考虑有一个光源,它发出的光线粗细发生变化,但光的能量通量还是不变,肯定是更细的显得更加刺眼,因为它分散到每个方向上的光的通量更大,这也就是为什么要考虑到单位立体角的原因。还有一些光源,它在各个方向上发出的光的通量还是不同的,那么这就更需要考虑到立体角了。
还有一个问题就是,立体角与面积的大小是有关系的,可能在理解单位立体角和单位面积的时候总觉得它们是有关系的,容易混淆。可以这样想,立体角实际上是方向的集合,面积是位置的集合,考虑单位面积时一般是对一个有面积的区域作分析,而考虑单位立体角时一般是对一个点作分析,这两者在辐射学基本量的定义中其实是没什么联系的。

BRDF的定义与性质

BRDF的全名是bidirectional reflectance distribution function,它的定义式为

f(l,v)=dL0(v)dE(l) f ( l , v ) = d L 0 ( v ) d E ( l )

其中 L0(v) L 0 ( v ) 是出射光的辐射率, E(l) E ( l ) 是入射光的辐照度。
这样一个式子有两个问题:
1.它为什么要定义两个微分的比值? 2.为什么是辐射率和辐照度的比值?
第一个问题在《Real Time Rendering》关于BRDF的这一章中有这样的描述:

The discussion in this chapter is restricted to shading with non-area
light sources such as point or directional lights. In this case, the BRDF
definition can be expressed in a non-differential form.

由此可见,微分的形式是为了表示面光源的情形,我的理解是微分是用来表示面光源的微小点光源
对于第二个问题,查阅了一些资料,较权威的解释是跟测度有关,详情可见brdf为什么要定义为一个单位是sr-1的量?
个人感觉其实不太必要在这个地方纠结,BRDF只是一个反映入射光和反射光关系的函数,理解这一点就好了。
BRDF的非微分形式为

f(l,v)=L0(v)ELcosθi f ( l , v ) = L 0 ( v ) E L c o s θ i

这个式子应该很好理解,分子就是出射光在v方向上的辐射率,分母是入射光l在垂直于它的平面上的辐照度。
而我们着色要做的是求出射光的辐射率,因此我们的目标是利用已知的 f(l,v) f ( l , v ) 来计算 L0(v) L 0 ( v )
L0(v)=i=1kf(lk,v)ELkcosθik L 0 ( v ) = ∑ i = 1 k f ( l k , v ) ⨂ E L k c o s θ i k

其中k是光源的编号 。 符号表示各个分量相乘,因为BRDF和辐射率、辐照度都是三维向量,分别表示RGB的数据。
BRDF的性质
有两个物理约束,第一
f(l,v)=f(v,l) f ( l , v ) = f ( v , l )

就是说互换入射光和反射光的方向,BRDF的结果应该是不变的,这一点是基于光路的可逆性,这个性质可以用来判断给定的BRDF的物理理论方面的可靠程度。
第二就是能量守恒,出射的能量不能高于入射的能量,在离线渲染中为了保证最终渲染的效果,这一点是要被严格遵守的,而在实时渲染中,只需要近似地接近能量守恒就好了。

半球定向反射率(directional-hemispherical reflectance)

半球定向反射率 R(l) R ( l ) 是一个和BRDF有关的函数,它被用来衡量一个BRDF的能量守恒的程度,尽管它的名字看起来好像很屌,实际上也不过是一个很普通的概念。它测定从一个给定方向的入射光一共反射了多少出去,而不考虑它反射到哪些方向上去了,从根本上来说,它其实描述了一个给定方向的入射光的能量损失。它的定义式为:

R(l)=dBdE(l) R ( l ) = d B d E ( l )

同样地,由于我们目前只考虑非面光源,它的非微分形式为:
R(l)=MElcosθi R ( l ) = M E l c o s θ i

其中 Elcosθi E l c o s θ i
  • 18
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值