折射的原理是运用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 

Unity3d BTDF实时折射模拟有粗糙度的半透明物体的更多相关文章

  1. Unity3d 实时折射和反射

    这里只是张贴在实时折射和脚本反思shader, 大约NGUI第一部分请下载. 这个版本的主要缺点是折射平面部Layer必须是water层.假设有专家谁可以摆脱这一个.请记得把代码回该条,谢谢! Wat ...

  2. 实时折射、镜面反射shader

    原文链接:http://www.ceeger.com/forum/read.php?tid=3162&fid=2 Unity没有原生的实时镜面反射Shader,分享几个自己写的,希望能抛砖引玉 ...

  3. Unity3d实现的十字路口的模拟(三)

    http://blog.csdn.net/nijiayy/article/details/45366427

  4. 最近用unity5弄的一些渲染

    unity5 人皮渲染  Skin Shading 换了一种方法,优化了一下代码,unity5效果很好,消耗不大 点开可查看大图 加入了次表面散射的阴影与自阴影 unity5  ocean real- ...

  5. 【SIGGRAPH】【最终幻想XV】的战斗场景实时演示的要点解说

    [SIGGRAPH][最终幻想XV]的战斗场景实时演示的要点解说 原文:西川善司 http://www.4gamer.net/games/999/G999902/20160730004/        ...

  6. 模拟POST、Get 请求的工具----APIpost(中文版POSTMAN)

    模拟POST.Get 请求的工具----APIpost(中文版POSTMAN) 快速生成.一键导出api文档 在线模拟调试,结果实时返回 模拟登录后请求API 支持团队协作 官网:https://ww ...

  7. Linux命令-实时监测命令:watch

    watch 是一个非常实用的命令,基本所有的 Linux 发行版都带有这个小工具,如同名字一样,watch 可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行..在Linux下,watch是周期性 ...

  8. 3D游戏中的画质与效率适配

      哪里来的需求? 众所周知,由于不同的设备配置不同.导致其CPU和GPU处理能力有高有低.同样的游戏想要在所有设备上运行流畅且画面精美,是不可能的.这就需要我们针对不同的设备能力进行画质调节,以保证 ...

  9. 3D建模与处理软件简介

    [前言]自半年前笔者发表博客“什么是计算机图形学”以来,时常有人来向笔者询问3D模型的构建方法与工具.笔者的研究方向是以3D技术为主,具体包括3D建模,3D处理及3D打印三个方面,在3D建模与处理方面 ...

随机推荐

  1. 淘宝可以传照片搜索商品,verygood.雅客VC多味水果糖

    奶奶喜欢吃点硬糖.在当地买了些说是不好.到是一个亲戚买的一种糖比较满意(好久了都快融化了). 但是我只有照片,能知道品牌,在jd没这样一样的商品了. 还好借助淘宝的传照片功能,找到了.

  2. 07_MyBatis原始的Dao编写方法

    [UserDao.java ] package com.Higgin.Mybatis.dao; import com.Higgin.Mybatis.po.User; public interface ...

  3. C# 利用TextBox的Text属性实现换行加字符 "\r\n"

    要让一个TextBox显示多行文本就得把它的Multiline属性设置为true,可是如果你是要把TextBox的Text属性设置多行文本时,换行符由两个字符组成:"\r\n". ...

  4. (转) sphinx 高亮显示搜索词

    http://hi.baidu.com/tewuapple/item/7a7bc34adbda24a8df2a9fe5  (转)

  5. 利用iptables来配置linux禁止所有端口登陆和开放指定端口

    from:http://www.myhack58.com/Article/sort099/sort0102/2011/31781.htm 1.关闭所有的 INPUT FORWARD OUTPUT 只对 ...

  6. webbench

    Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测 ...

  7. Python学习笔记——面向对象基础

    1.类和实例 1.1类的定义 类的定义使用class关键字,其后紧跟类名(通常大写开头),紧接着是(object),object是该类继承的类名,没有就继承object类. 实例化时就是类名+(),有 ...

  8. 面试题:m个长度为n的ordered array,求top k 个 数字

    package com.sinaWeibo.interview; import java.util.Comparator; import java.util.Iterator; import java ...

  9. Python socket编程应用

    最近因为考试各种复习顺便刷电视剧,感觉跟小伙伴玩的越来越不开心了,一定是最近太闲了,恩.于是想研究一下代理服务器,下载了一份代码,发现竟然还涉及到socket编程,所以把之前网络课的socket聊天室 ...

  10. Jersey的异常处理

    Jersey框架为我们提供了更为通用异常处理方式.通过实现ExceptionMapper接口并使用@Provider注解将其定义为一个Provider,可以实现通用的异常的面向切面处理,而非针对某一个 ...