unity3d Hair real time rendering 真实头发实时渲染
先放上效果
惊现塞拉酱
算法是Weta Digital根据siggraph2003的论文加以改进,改进之前使用的是Kajiya and Kay’s 模型,它能量不守恒,也就是说不是基于物理的,不准确
电镜下真实头发丝纤维的照片,我们发现上面有很多重叠的角质层叫做毛小皮也叫毛鳞片,他们相对根部的倾斜角度大约为3°,近似模型如下图
头发纤维的模型
R为反射(reflection),T为穿透(transmission),也就是折射
这里假设光有三种传播方式R, TT, TRT
R是直接反射,
TT是经过两次折射
TRT是穿透(折射)进头发内部,在头发内部进行反射,在穿透(折射)出,详细如图
人头发纤维主要由两部分组成:表皮与皮质。表皮作为外鞘保护内部皮质层,在光散射方面表皮很重要,因为他是折射的边缘,
头发核心部有颜色的东西叫做髓质,在皮质与髓质中的色素决定了头发的颜色,
我们研究头发的光学属性有两种要素:1.折射参数η(大约为1.55)2.横截面的吸收率σa
几何图如上图,
头发方向从根部到尖部,我们假定u是头发的tan值,向量v和w是一个右手标准正交基,光线入射方向为ωi,散射出的光的方向为ωr,角度分别为θi,θr(0°垂直于头发,u为90°)。围绕着头发的方位角表示为φi和φr(v为0°w为+90°),差角(θi-θr)/2表示为θd相关方位角为(φr-φi)/2表示为φd。φr-φi表示为φ。平均值θh = (θi+θr)/2为半角。
头发的吸光性主要取决于真黑色素(eumelanin)和伪黑色素(pheomelanin),他们的浓度我们分别定义为ρe和ρp,他们的吸收率分别为σa,e和σa,p,光谱吸收率为μa = ρeσa,e + ρpσa,p。
光线离开头发前变化(折射,反射)次数为p。p ∈ {R = 0, TT = 1, TRT = 2, TRRT = 3, ...}
总反射函数S是所有的纵向散射(longitudinal scattering)函数Mp 和方位角散射函数Np之积的和
我们的最终目标就是把0-3的p所有的S相加,也就是R, TT, TRT , TRRT所有光线之和。
纵向散射(longitudinal scattering)
接下来是高斯Mp纵向散射(longitudinal scattering)函数的求法。
在头发是完美圆弧的光滑表面的情况下θr = −θi,如图所示
在光滑的表面反射,形成一个单一的锥形(左图)。因为表面粗糙,Mp模拟了一个没有高光的表面,这种像锥形一样的散射会被缩放,更偏向于法平面(右图)。光散射范围更宽,能量也随之减少。
因为表面粗糙而不能产生完美反射的高光,Marschner使用了半角的高斯函数来求Mp
<span style="font-size:14px;"> inline fixed G(fixed beta, fixed theta){return pow(E, -(theta*theta) / (2 * beta * beta)) / (sqrt(2 * PIE)* beta);}</span>
G函数是一个以纵向倾角θ为参数的标准高斯函数,β是粗糙程度(在纵向的光滑锥形上的标准偏差角),αp是皮质层倾角的一个简单函数。但是求得的Mp能量不守恒,有如下原因
1. g函数中的θ ∈ {−∞,∞},但是θh ∈{−π/2,π/2}。使用θh代替θ会使反射能量增倍。
2. 当θi = −θr时,从锥形高光偏光−θi到θr涉及到缩放锥形。在Marschner中只有大约1/cos ²θd
3. 偏转光照角度移动了相当大的能量导致成角大于θ ∈{−π/2,π/2}(角过大,永远不会接收到,导致能量损失)
我们使用一种能量守恒的Mp
这种方法在球形重新分配反射角度,使用球形高斯卷积(spherical- Gaussian convolution)得到
G经过一系列的变形化简得到最终的Mp:
<span style="font-size:18px;">Mp = (1 / ((pow(E, V) - pow(E, -V))*V))*pow(E, (sin(-Theta_i)*sin(Theta_r) / V))*I0(cos(-Theta_i)*cos(Theta_r) / V);</span>
在这里v = β²是粗糙度的平方
I0函数为第一类贝塞尔函数
得到的能量守恒的纵向散射曲线如下
锥形高光是不对称的,off-specular peak近似于二维BRDF所有粗糙度是能量守恒的
方位角散射(Azimuthal Scattering)
接下来计算方位角散射(Azimuthal Scattering)Np
Marschner利用在发丝是光滑圆情况下的Bravais特性,研究在发丝纤维内部的方位角散射。
修正折射指数η’
方位角改变方向Φ与在发丝中的偏移h ∈ {−1,1}和p值有关,反射模式为:
γi = arcsin(h) , γt = arcsin(h/η’ )
由于h不可求,所以我们采用另一种可以模拟h的方法
Marschner使用立方近似来模拟h,但是尚未验证其准确性,当p值较大或反射指数较低时(头发在水中)
粗糙度方位角散射(Roughened Azimuthal Scattering)函数Np
我们用高斯分布模拟一个变形法平面表面粗糙度的效果。在发丝纤维中的每一个偏移h 产生了一个方位角的连续的分布Dp(φ−Φ(p,h)),这个分布是由φ中的高斯和光滑头发中的离散方位角Φ(p,h)产生的。如下图所示:
粗糙离散角散射(TT):在光滑发丝上的偏移h能产生确定的方位角Φ(p,h),可以求出方位角的高斯分布Dp(φ−Φ(p,h))。
全部的出射光线集成在一起:
A(p,h)是光线吸收和菲涅尔产生的衰减。我们使用一个新的标准高速分布函数Dp称之为Gaussian detector
<span style="font-size:14px;"> for (fixed i = -1; i < 1; i += 0.1){Mu_a_d = Mu_a / cos(i / Eta_d);ref_1 = acos(cos(Theta_d) * cos(asin(i)));f = -_SC + (1 + _SC)*pow(2, -10 * dot(ref_1, _Eta));T = exp(-2 * Mu_a_d*(1 + cos(2 * asin(i / Eta_d))));A = pow((1 - f), 2) * pow(f, p - 1) * T;// Np += A * Dp(Phi - Phi_p_h(p, i, Eta_d));Np += A * Dp(Phi - Phi_p_h(i, Eta_d));}Np *= 0.5;</span>
到此我们所有公式全部完事,我们可以用for循环累加不同p值的S得到最终结果
经过论文中的测量σa,e = {0.419,0.697,1.37}σa,p ={0.187,0.4,1.05}得到结果相对真实。
上图论文中的实现结果
博主目前能力不够不能在Unity中弄出这样的头发(感觉他这个头发像是曲面细分生成的),只能用个好一点的模型来凑数了:
本文为部分翻译的加上博主自身的理解与实现,如有不正确的地方欢迎批评指正
参考:
1. An Energy-Conserving Hair Reflectance Model
2. Light Scattering from Human Hair Fibers
-----by wolf96 http://blog.csdn.net/wolf96
unity3d Hair real time rendering 真实头发实时渲染相关推荐
- unity给头发添加物理_unity3d Hair real time rendering 真实头发实时渲染
先放上效果 惊现塞拉酱 算法是Weta Digital根据siggraph2003的论文加以改进,改进之前使用的是Kajiya and Kay's 模型,它能量不守恒,也就是说不是基于物理的,不准确 ...
- Real-Time Rendering 4th Edition 实时渲染第四版 第三章 图形处理单元(The Graphics Processing Unit)
3.5 The Vertex Shader(顶点着色器) 顶点着色器是图3.2中展示的功能性管线中的第一个阶段.由于这是第一个直接在编程者控制下的阶段,故而需要注意在这个阶段前发生了一些数据操作.在被 ...
- 【原】实时渲染中常用的几种Rendering Path
[原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 -- polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...
- 【《Real-Time Rendering 3rd》提炼总结】完结篇:系列合集电子书PDF下载实时渲染知识网络图谱新系列预告
本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处. 文章链接: https://zhuanlan.zhihu.com/p/34207965 按照专栏之前的计划,[<Real-Tim ...
- 【Unity3D】2018实时渲染电影短片《死者之书》技术文章合集
本篇文章首发于作者个人博客,原链:https://www.huozk.com/2018/unity3d-bookofthedead.html 古埃及人相信,人死后要先经历一段去往冥国的旅程,通过各种考 ...
- 渲染路径-实时渲染中常用的几种Rendering Path
http://www.cnblogs.com/polobymulberry/p/5126892.html?utm_source=tuicool&utm_medium=referral 回到顶部 ...
- 【Unity3D】2017实时渲染短片《ADAM》技术文章合集
本文章首发于作者个人博客:https://www.huozk.com/2017/unity3d-adam.html ADAM Adam是一部获得多项奖项的短片,由Unity游戏引擎创建并实时呈现.旨在 ...
- 剖析Unreal Engine超真实人类的渲染技术Part 3 - 毛发渲染及其它
目录 四.毛发渲染 4.1 毛发的构造及渲染技术 4.1.1 毛发的构造 4.1.2 Marschner毛发渲染模型 4.1.3 毛发的间接光照 4.2 毛发的底层实现 4.3 毛发的材质解析 4.3 ...
- 实时渲染、离线渲染、实时云渲染、混合渲染是什么?
渲染,就是将 3D 模型转换成 2D 图像,并最终呈现在屏幕上的过程.虽然这里只有一句话,但是这一句话里面包含了太多的数学.物理和计算机方面的知识,它描述了我们用计算机来虚拟化真实世界的基本逻辑.渲染 ...
最新文章
- 《Nmap渗透测试指南》—第6章6.4节IP欺骗
- 仓库码放要求_货物码放规范
- 类似人手的手部假肢相关研究登上Science子刊封面
- java中channelmessage,MessagePack在Netty中的应用
- .tex类型文件怎么阅读_Python用于NLP :处理文本和PDF文件
- 用 Python 读写 Excel 表格,就是这么的简单粗暴且乏味
- 创建自定义Maven原型
- (王道408考研操作系统)第四章文件管理-第一节2:文件的逻辑结构
- 在JavaScript里 (a ==1 a== 2 a==3) 有可能是 true 吗?
- java 获取物理路径_JSP---jsp页面获取物理路径
- 清华学霸组团的工业 AIoT 创企再获数千万融资:玩家应推动在边缘 AI 芯片上跑算法...
- C语言 · 冒泡法排序
- 摘抄 ander图片上传
- 关闭数字健康 android 魅族,魅族手机隐私模式开启关闭使用方法详解
- USB3.0高清视频和音频采集处理芯片——MS2131
- android创建桌面快捷方式
- java mail 群发邮件_javamail群发邮件
- 开展网络口碑营销的前提
- 基于PGC相位生成载波调制及其解调算法实例分析
- 面向开发人员的 ChatGPT 提示词教程 - ChatGPT Prompt Engineering for Developers
热门文章
- String转int数组
- [转]Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- unity3d 取锚点位置_《王者荣耀》破晓之心碎片在哪 破晓之心碎片位置介绍
- 浅析Gompertz模型
- 硬盘主分区和逻辑驱动器的区别
- VMWare 文件格式详解 .VMX .VMSD .VMDK
- Entrust 将不再签发超过13个月有效期的SSL证书
- 新手提问!求解答QAQADODB.Recordset 错误 #x27;800a0bb9#x27; 参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。
- PhotoScan:为冲印的照片拍摄无眩光照片
- 前端js 面试题 forEach 和 map 有什么区别?