Unity3d BTDF实时折射模拟有粗糙度的半透明物体



折射的原理是运用BTDF的一个球形高斯近似

需要考虑折射光的来源,一般会想到用环境贴图(IBL)或者grab texture,但是折射光不全都来自一个平面,所以选择环境贴图来作为折射光。
这个效果主要是BTDF计算折射光,和BRDF计算物体的反射光,二者加和即是最终结果。

我们需要用到的参数
 


我们的最终实现公式为:
 
fr是BRDF,ft是BTDF。

Fr

我们首先复习一下BRDF,因为BTDF也要用到BRDF的知识。详细BRDF请看这篇:Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF
BRDF来模拟真实世界光照主要是做到能量守恒,我们通过一些渲染模型来实现。
比如镜面反射模型:Phong,Blinn-Phong
漫反射模型:Lambert,Oren-Nayar

根据Mircofacet模型,fr的镜面反射公式为:
 
 
Mircofacet模型是假设平面上有无数方向不同(粗糙度)的光滑的微平面,以此来模拟粗糙度的反射

其中:
D项代表Normal Distribution Function,法线分布函数
表示Mircofacet中心法线和半球内任意方向(half-vector)朝向的分布概率

F项表示Fresnel函数
菲涅尔反射简单说就是物体表面的反射程度,与你的视线和物体表面法线夹角的大小所成的关系,视线与法线的夹角越小,反射率越低,就越容易看出物体本身的固有色和纹理,相反夹角越大,反射程度也就越大。

G项为几何衰减项(Geometry Attenuation Factor)
考虑被Mircofacet微平面遮挡的入射/反射光的数量函数(Visibility函数)

Ft

Fr解决了,我们再来看Ft的公式
 

ωi为入射光线,ωo为出射光线也就是反射光线
 

ωht为折射的半角向量
 

F,D,G是与BRDF相同的,但是注意传入参数不同

在G项与D项通过加入变量kG,kD来加入粗糙度

kG为:
 
kD为可变变量控制粗糙度
由此改进的D函数为
 

结果

把二者加在一起,
测试引擎:Unity 5.0


参考:Real-Time Rough Refraction

博主近期渲染:2016的渲染

                              ---- by wolf96 






原文地址:https://www.cnblogs.com/zhanlang96/p/5331588.html