先放上效果

惊现塞拉酱

算法是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 真实头发实时渲染相关推荐

  1. unity给头发添加物理_unity3d Hair real time rendering 真实头发实时渲染

    先放上效果 惊现塞拉酱 算法是Weta Digital根据siggraph2003的论文加以改进,改进之前使用的是Kajiya and Kay's 模型,它能量不守恒,也就是说不是基于物理的,不准确 ...

  2. Real-Time Rendering 4th Edition 实时渲染第四版 第三章 图形处理单元(The Graphics Processing Unit)

    3.5 The Vertex Shader(顶点着色器) 顶点着色器是图3.2中展示的功能性管线中的第一个阶段.由于这是第一个直接在编程者控制下的阶段,故而需要注意在这个阶段前发生了一些数据操作.在被 ...

  3. 【原】实时渲染中常用的几种Rendering Path

    [原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 -- polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...

  4. 【《Real-Time Rendering 3rd》提炼总结】完结篇:系列合集电子书PDF下载实时渲染知识网络图谱新系列预告

    本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处.   文章链接: https://zhuanlan.zhihu.com/p/34207965 按照专栏之前的计划,[<Real-Tim ...

  5. 【Unity3D】2018实时渲染电影短片《死者之书》技术文章合集

    本篇文章首发于作者个人博客,原链:https://www.huozk.com/2018/unity3d-bookofthedead.html 古埃及人相信,人死后要先经历一段去往冥国的旅程,通过各种考 ...

  6. 渲染路径-实时渲染中常用的几种Rendering Path

    http://www.cnblogs.com/polobymulberry/p/5126892.html?utm_source=tuicool&utm_medium=referral 回到顶部 ...

  7. 【Unity3D】2017实时渲染短片《ADAM》技术文章合集

    本文章首发于作者个人博客:https://www.huozk.com/2017/unity3d-adam.html ADAM Adam是一部获得多项奖项的短片,由Unity游戏引擎创建并实时呈现.旨在 ...

  8. 剖析Unreal Engine超真实人类的渲染技术Part 3 - 毛发渲染及其它

    目录 四.毛发渲染 4.1 毛发的构造及渲染技术 4.1.1 毛发的构造 4.1.2 Marschner毛发渲染模型 4.1.3 毛发的间接光照 4.2 毛发的底层实现 4.3 毛发的材质解析 4.3 ...

  9. 实时渲染、离线渲染、实时云渲染、混合渲染是什么?

    渲染,就是将 3D 模型转换成 2D 图像,并最终呈现在屏幕上的过程.虽然这里只有一句话,但是这一句话里面包含了太多的数学.物理和计算机方面的知识,它描述了我们用计算机来虚拟化真实世界的基本逻辑.渲染 ...

最新文章

  1. 《Nmap渗透测试指南》—第6章6.4节IP欺骗
  2. 仓库码放要求_货物码放规范
  3. 类似人手的手部假肢相关研究登上Science子刊封面
  4. java中channelmessage,MessagePack在Netty中的应用
  5. .tex类型文件怎么阅读_Python用于NLP :处理文本和PDF文件
  6. 用 Python 读写 Excel 表格,就是这么的简单粗暴且乏味
  7. 创建自定义Maven原型
  8. (王道408考研操作系统)第四章文件管理-第一节2:文件的逻辑结构
  9. 在JavaScript里 (a ==1 a== 2 a==3) 有可能是 true 吗?
  10. java 获取物理路径_JSP---jsp页面获取物理路径
  11. 清华学霸组团的工业 AIoT 创企再获数千万融资:玩家应推动在边缘 AI 芯片上跑算法...
  12. C语言 · 冒泡法排序
  13. 摘抄 ander图片上传
  14. 关闭数字健康 android 魅族,魅族手机隐私模式开启关闭使用方法详解
  15. USB3.0高清视频和音频采集处理芯片——MS2131
  16. android创建桌面快捷方式
  17. java mail 群发邮件_javamail群发邮件
  18. 开展网络口碑营销的前提
  19. 基于PGC相位生成载波调制及其解调算法实例分析
  20. 面向开发人员的 ChatGPT 提示词教程 - ChatGPT Prompt Engineering for Developers

热门文章

  1. String转int数组
  2. [转]Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
  3. unity3d 取锚点位置_《王者荣耀》破晓之心碎片在哪 破晓之心碎片位置介绍
  4. 浅析Gompertz模型
  5. 硬盘主分区和逻辑驱动器的区别
  6. VMWare 文件格式详解 .VMX .VMSD .VMDK
  7. Entrust 将不再签发超过13个月有效期的SSL证书
  8. 新手提问!求解答QAQADODB.Recordset 错误 #x27;800a0bb9#x27; 参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。
  9. PhotoScan:为冲印的照片拍摄无眩光照片
  10. 前端js 面试题 forEach 和 map 有什么区别?