咨询电话:400-810-1418服务与监督电话:400-810-1418转接2
  • 相关推荐
  • 引擎里面常见的渲染方式分享
  • 如何用mapbox几分钟做一张分析图?
  • Unity制作魔法火焰特效图文教程
  • Unity Shader视差遮蔽映射与局部差异导数函数
  • 如何用Unity制作逼真的自然场景
  • Unity制作次世代场景思路教程
  • U3D实时渲染教程之角色头发各向异性表达(上)

    发布时间:2020-08-17 10:54:38

    Hello . 大家好,我这次带来了完整的手游写实角色渲染合集,我是麦田。本次是写实头发的各向异性表达——Kajiya-Kay光照模型。一起来看这篇U3D实时渲染教程之角色头发各向异性表达(上)。

    这个系列主要分为三个部分:

    1.头发的渲染

    2.皮肤的渲染

    3.眼睛的渲染

    每个分为2个文章,第一篇讲基础理论,第二篇讲实际操作,最后的工程文件分别是Shader代码和Shader图表两种形式。

    一、观察

    在游戏内,出于性能的考虑。引擎不会做到和DCC软件使用离线渲染器渲染出来一样的毛发效果,如Maya的XGen这种质感。这时候我们就有了替代方案,即:使用面片头发。这就涉及到了如何去表达头发的质感问题。

    毛发的各异

    1-1.png

    螺纹不锈钢的各异

    1-2.png

    二、分析

    我们先从美术角度分析一下头发:

    我们可以看到头发上的高光和传统的球体的高光不一样,头发的高光更近似一个不规则的条状(如果放置在一个平面上)。

    2-1.png

    而且条状的上下似乎有一定的渐变规律,暗-亮-暗。金属器皿上的高光波纹近似。我们着重介绍头发的理论基础。

    2-2.jpg2-3.png

    上图圈1的区域是亮的,圈2是暗色,这里我们从观察可以得出头发的高光形状与明暗的变化。如果观察的仔细的话,可以回忆一下,生活中,看到姑娘的头发,会跟随看的方向和光产生偏移,以及透光性(散射)。

    三、总结

    从美术角度总结一下:

    1.需要用面片做出好看的头发模型。

    3.png

    2.头发想要好看必须要有一个这种形状的高光,并且有明暗过度。

    3.能受到灯光的影响,表达出她的透气感。

    我们再从程序的角度分析一下头发:

    找案例,Render Doc截帧,Profile,Frame Debug ,review源码,一气呵成(哈哈,开个玩笑)

    既然说到这里,我们就引入GDC2004的那片PDF的内容吧——Kajiya-Kay模型传送门:

    4-3.jpg

    (注:worldBinormal就是我们要的副切线,这里写做了副法线)

    可以看出利用cross(叉积)来得出向量,然后再乘上tangentSign得到最终确定方向的副切线。所以说副切线的方向主要是由tangentSign来决定的,而tangentSign是由v.tangent.w* unity_WorldTransformParams.w计算得出的。

    这里的法线切线副切线的基础内容,在知乎的Taecg的一片文章介绍的非常详细了。我这里只是拾人牙慧简单捋一遍。传送请走:https://zhuanlan.zhihu.com/p/103546030

    五、回归到公式理解

    5-1.png5-2.png

    T,即为上文讲到的切线。但是这里是副切线,H是什么呢?H是光入射方向L和视口方向V的中间向量,通常也称之为半角向量(Half),半角向量被广泛用于各类光照模型如Blinn—Phong。

    为什么会有这个H呢?我们来回想一下Blinn-Phong的光照模型和示意图:

    5-3.png

    Blinn-Phong和Ponng的区别就在于多了一个H

    当视线正好与反射向量对齐时,半程向量就会与法线完美契合。所以当观察者视线越接近于原本反射光线的方向时,镜面高光就会越强。

    获取半程向量的方法很简单,只需要将光线的方向向量和观察向量加到一起,并将结果归一化(Normalize)就可以了。

    在引入半向量H之后,我们现在应该就不会再看到Phong光照中高光断层的情况了。下面两个图片展示的是两种方法在镜面光分量为0.5时的对比:

    5-4.png

    除此之外Blinn-Phong就没什么好说的了,Blinn-Phong与Phong唯一的区别就是,Blinn-Phong测量的是法线与半程向量之间的夹角,而Phong测量的是观察方向与反射向量间的夹角。

    绕了一堆,不就是Blinn—Phong高光的计算公式么!

    我们知道了这两个数值,回到公式,我们再看一下,是不是了然了?

    哦!就是副切线和LightingDir+ViewDir的和,然后点积,然后平方,然后用1减去这个值后再开方!最后想要到这个效果我们再平方。

    六、实践光照模型

    我们用Graph复原一下逻辑,验证一下想法!

    6-1.png

    Graph逻辑图

    这个高光模型我们给到一个球上观察,OK,基本的环状效果已经有了,剩下的就是加入comb map 来细化了。

    观察

    6-2.png

    CombMap采样

    6-3.png

    写在后面:头发的光照模型我感觉更加近似一个经验值模型,是基于观察近似的算法而非基于理论模拟。我们可以在这个理论模型的基础上进行一些改进,让它更加符合我们想要的一个效果。原理虽然枯燥,但确实很重要。具体的改动,会在实操的第二章节介绍。

    头发卡我卡得最难受的地方可能就是半透排序的方式了。思路是从模型下手加上双Pass解决。

    七、完整内容效果

    7.webp.jpg

    八、完整内容预习

    以下是完整的Graph图表和Shader代码部分(手撸),有兴趣的朋友可以先看一下。具体工程下一篇讲完的时候放出来。

    8-1.webp.jpg8-2.png

    理解透彻光照模型后,具体实现的细节很容易了,下回见!

    来源:Thepoly公众号