Unity3d BTDF实时折射模拟有粗糙度的半透明物体
2016-03-29 08:04
513 查看
折射的原理是运用BTDF的一个球形高斯近似
需要考虑折射光的来源,一般会想到用环境贴图(IBL)或者grab texture,但是折射光不全都来自一个平面,所以选择环境贴图来作为折射光。
这个效果主要是BTDF计算折射光,和BRDF计算物体的反射光,二者加和即是最终结果。
我们需要用到的参数
我们的最终实现公式为:
fr是BRDF,ft是BTDF。
Fr
我们首先复习一下BRDF,因为BTDF也要用到BRDF的知识。详细BRDF请看这篇:Unity3d 基于物理渲染Physically-Based Rendering之specular BRDFBRDF来模拟真实世界光照主要是做到能量守恒,我们通过一些渲染模型来实现。
比如镜面反射模型: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
相关文章推荐
- Unity3d BTDF实时折射模拟有粗糙度的半透明物体
- 最新Unity5.3.4p1&4.7.1f1破解!
- Unity Shaders and Effects Cookbook (2-6) 在 C# 代码中创建 Texture2D 并赋值给 Shader
- C#的Socket编程基础——Unity的简单聊天室
- UnityNGUI序列帧动画代码
- 详解MVP矩阵之ViewMatrix
- 【翻译】 Unity3D VR 教程:1.VR概述
- Unity小知识随手记
- Unity UGUI实现图文混排
- Unity UGUI实现图文混排
- unity3d 代码改变贴图压缩格式
- [置顶] Unity加载本地文件夹中的所有文件
- Unity3D嵌入WPF教程
- Unity 5.3 官方VR教程(—)VR综述
- Unity和Android交互
- unity3d 更改C#脚本创建模版
- Unity3D手游开发日记(6) - 适合移动平台的水深处理
- Unity3D手游开发日记(5) - 适合移动平台的植被随风摆动
- Unity如何挂接Android程序
- [Unity官方文档翻译]Learning the Interface学习基础视窗