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
Unity3d BTDF实时折射模拟有粗糙度的半透明物体的更多相关文章
- Unity3d 实时折射和反射
这里只是张贴在实时折射和脚本反思shader, 大约NGUI第一部分请下载. 这个版本的主要缺点是折射平面部Layer必须是water层.假设有专家谁可以摆脱这一个.请记得把代码回该条,谢谢! Wat ...
- 实时折射、镜面反射shader
原文链接:http://www.ceeger.com/forum/read.php?tid=3162&fid=2 Unity没有原生的实时镜面反射Shader,分享几个自己写的,希望能抛砖引玉 ...
- Unity3d实现的十字路口的模拟(三)
http://blog.csdn.net/nijiayy/article/details/45366427
- 最近用unity5弄的一些渲染
unity5 人皮渲染 Skin Shading 换了一种方法,优化了一下代码,unity5效果很好,消耗不大 点开可查看大图 加入了次表面散射的阴影与自阴影 unity5 ocean real- ...
- 【SIGGRAPH】【最终幻想XV】的战斗场景实时演示的要点解说
[SIGGRAPH][最终幻想XV]的战斗场景实时演示的要点解说 原文:西川善司 http://www.4gamer.net/games/999/G999902/20160730004/ ...
- 模拟POST、Get 请求的工具----APIpost(中文版POSTMAN)
模拟POST.Get 请求的工具----APIpost(中文版POSTMAN) 快速生成.一键导出api文档 在线模拟调试,结果实时返回 模拟登录后请求API 支持团队协作 官网:https://ww ...
- Linux命令-实时监测命令:watch
watch 是一个非常实用的命令,基本所有的 Linux 发行版都带有这个小工具,如同名字一样,watch 可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行..在Linux下,watch是周期性 ...
- 3D游戏中的画质与效率适配
哪里来的需求? 众所周知,由于不同的设备配置不同.导致其CPU和GPU处理能力有高有低.同样的游戏想要在所有设备上运行流畅且画面精美,是不可能的.这就需要我们针对不同的设备能力进行画质调节,以保证 ...
- 3D建模与处理软件简介
[前言]自半年前笔者发表博客“什么是计算机图形学”以来,时常有人来向笔者询问3D模型的构建方法与工具.笔者的研究方向是以3D技术为主,具体包括3D建模,3D处理及3D打印三个方面,在3D建模与处理方面 ...
随机推荐
- 九度OJ 1087 约数的个数
题目地址:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- rsync 的使用和参数解释
备份往往可以为我们提供一种恢复的策略,因此在实际的生产应用中我们需要对系统的各个配置以及数据进行备份.然而普通的备份都是在本地磁盘或者相应的设备上进行,其实这样也存在一种缺陷,就是设备也出现问题怎么办 ...
- Python中dict详解
from:http://www.cnblogs.com/yangyongzhi/archive/2012/09/17/2688326.html Python中dict详解 python3.0以上,pr ...
- 规则引擎-BRMS在企业开发中的应用
1. 什么是规则复杂企业级项目的开发以及其中随外部条件不断变化的业务规则(business logic),迫切需要分离商业决策者的商业决策逻辑和应用开发者的技术决策,并把这些商业决策放在中心数据库或其 ...
- yii2源码学习笔记(十九)
view剩余代码 /** * @return string|boolean the view file currently being rendered. False if no view file ...
- 新浪微博登录接口(PHP版)
CI框架下 新浪微博登录接口完整版说明:本贴只适合CI框架.功能实现:登录接口跳转链接成功,获取用户信息(包括最重要的u_id)成功,将用户与本地平台连接起来,用户登录成功后信息的存储,本地数据库第三 ...
- CentOS使用sudo提示用户不在sudoers文件中的解决方法
1切换到root用户[linux@localhost ~]$ su root密码:[root@localhost ~]# 2查看/etc/sudoers文件权限,如果只读权限,修改为可写权限 [roo ...
- MySQL簇-cluster
http://www.php100.com/manual/MySQL/ndbcluster.html 先做个标记吧.
- 【python】for循环一列
a="哈哈哈哈,笑死我了"for i in a: print (i, end=' ') 结果 哈 哈 哈 哈 , 笑 死 我 了
- python从socket做个websocket的聊天室server
下面的是server端:把IP改成自己的局域网IP: #coding:utf8 import socket,select import SocketServer import hashlib,base ...