cubemap
先将场景环境渲染到cubemap中,可以离线渲染,也可以实时渲染。对于静态的效果,离线就可以。离线还可以使用外部资源,如拍摄的全景图生成cubemap。
想象cubemap是一个包围在场景外的立方体。通过从场景中心向其发射射线来采样上面的颜色。
反射
对于反射,想象cubmap上有一个像素发射光线到表面然后反射到眼睛中,为获取这个颜色,需要从视线方向反推出入射光线的方向,即使用视线的反方向计算出折射方向来采样cubemap上面的颜色,就是入射像素的颜色。
折射
对于折射,要根据折射定律计算出折射光线,即 n1sina = n2sinb, 其中n1,n2是两个界面的折射率,a是入射角,b是折射角。实际上经常使用n1/n2即透射比。因为入射方向已知,透射比已知,所以可以计算出折射方向。计算时同样使用视线方向作为入射方向,根据光路可逆性,使用计算出的折射方向来采样cubmap即可。
菲涅耳反射
对于菲涅耳反射
菲涅耳现象:当光线照射到物体表面上时,一部分发生反射,一部分进入物体内部,发生折射或散射。被反射的光和入射光之间存在一定的比率关系。根据观察方向,反射光的量是不同的。比如视线垂直看往水面,能看到水下的情景,此时被水面反射的光线很少,因此能看到水下物体;而看远处的水面时几乎看不见水下的情景,此时被水面反射的光线很多,因此极少有光线从水下反射回来,从而几乎看不到水下的情景。
为了模拟这个现象,采样一个近似公式去计算反射光的强度: F(v,n) ,其中v是视线方向,n是表面法线。
有多种近似公式,如Schlick菲涅耳近似等式:Fschlick(v,n) = F0 + (1-F0)(1- dot(v,n)) ^ 5
其中F0是一个用于控制菲涅耳发射强度的系数,范围0~1, 当F0为1时,没有菲涅耳效果,完全反射;当F0为0时,完全使用计算出来的反射光比例。公式计算的结果和dot(v,n)成反比,即v和n的夹角越小,反射光越弱,当v和n夹角为0时,完全没有反射光;而v和n夹角接近90度时,反射光特别强。也就是在边缘处反射光最强,从而模拟了菲涅耳现象。
根据菲涅耳近似等式计算的结果,去调节反射光的比例,从而模拟了菲涅尔现象。即在普通反射的基础上,使用fresnel值对reflection值进行调节即可。当F0为1时,物体完全反射cubemap中的图像;当F0为0时,是一个具有边缘光照效果的漫反射物体。