签到

05月05日
尚未签到

共有回帖数 0

    我们会发光

    等级:
    次表面散射材质就是我们大家常说的3S材质,生活中的3S材质大概有玉石,玛瑙,番茄,塑料,树叶等。次表面散射简称3S,是光射入非金属材质后再内部发生次表面散射,最后射出物体并进入视野中产生的现象,是指光从表面进入物体经过内部散射,然后又通过物体表面的其他顶点出射的光线传递过程。

    一般在3d软件中,使用的是真实的光线追踪算法,有着极度复杂的算式,我曾经想尝试过做过一次,但基本上都失败了。这种算法的好处就是绝对的真实,缺点就是太烧配置。在3d软件中,渲染一帧次表面散射材质平均时间一分钟。

    而3s材质有什么效果呢,这里,我找了几张有代表性的比较炫酷的图,作为分析。









    首先,大家发现,有3S材质的物体并不像普通物体明暗那么明显,其实,就是所有的3S材质都有一个共同属性,那就是透光度。而为什么有的3S材质看起来表面很硬,有的看起来很软呢?当然高光是一个重要参数。但是第一个物体,没有高光,为什么也感觉很硬呢(欢迎大家来讨论)。
    大家会发现,那些过渡很规律,透光很平滑的一般都是硬表面3S材质,因为光在其中主要是透射,而散射比例比较低。一般在玉石,有色玻璃中表现尤为明显。而像一些软的东西,蜡烛,树叶,塑料等,他们本身透射并不高,但是散射比例就比较大。


    其实这里面有一定的科学道理可言,硬的东西结构致密有规律,光更容易从中穿过。而软的东西,物体结构相对松散,光从中穿过障碍重重,所以散射大于透射。
    在unity中,要表现3S材质,必须要做到的一点就是 兼顾透射和次表面散射。


    因为,unity是实时渲染引擎,不可能用光线追踪去慢慢模拟。必须用最直接了当的方式去表现。
    而一般酷炫的3S硬表面材质,这里,说一下透光度的实现原理吧。


    一般情况下,光是从上往下打的。所以物体会出现上亮下暗的情况。


    如果我这里有一个从下往上的向量,和物体的法线做点乘,那么,是不是就有一点点透射的效果了?


    当然,只做这一步是远远不够的。因为只有透射,远远达不到SSS效果,必须有散射效果。
    这个时候就需要把光照范围从虚拟光照面扩散到整个模型。
    比方说,把输入的颜色区间从(0-1)重定义为(0.5-1)

    接下来,利用frensl,调节整体亮度,边缘亮度,中心亮度。
    最后把亮度信息利用lerp映射到亮色和暗色上。(我那个玉石是亮绿和暗绿)
    软表面呢,主要是散射,所以尽量不要有透光,所以开始一定要常规的方向和模型进行dot(点乘) 之后的散射是重点 一定要平滑 同时,后期的调色也尽量做到模型通体明暗变化微弱。并且整体向光面(就算有凹凸)也基本无暗面。
    最后说一下高光部分。

    同是硬表面,怎么区别塑料,玻璃和玉石的区别呢?有个光学现象叫菲尼尔反射。
    代表便是蓝色的那个人头。菲尼尔反射(Fresnel)的特点是越到边缘反射越强烈。
    常见于透光度较低的硬表面材质。
    刚开始我打算用基于布林(Blinn)的里反射算法乘以fresnel,结果就是仅仅是中心亮度没了,还是无法显示出边缘反射。后来基于unity5.0的PBL高光算法(5.0的标准材质球用的就是这套算法),当反射越锐利的时候,Fresnel现象就越强。很多人都反映过,unity5.0把光泽度调高后,有些像塑料包装效果了。
    这里 说一下法线贴图如何用于表现3S的纹理细节,这里分3种实现方法。(这里先不讲内部纹理,先讲表皮凹凸纹理)


    第一种,也是最真实的,效果最炫酷的,凹凸感明暗相对来说较差(强了就不是SSS了),实现起来较麻烦,多层混合则更麻烦。
    基于真正的光照凹凸模拟。
    比方说伪灯光(0,-1,0)和物体normal点乘,得到结果b。
    比如说这里float a;a和法线贴图dot;
    那么得到的值要加上(1-a),最后和b相乘即可。至于多层混合,稍后研究,我之前用的是方法2.


    第二种,用起来比较简单,也容易理解,多层混合也很方便。且无视伪平行光的方向,效果也不错。
    设第一步得到的结果还是b。
    a和法线贴图dot后,有了一个亮度值,然后减去a,即可得到以0为基准,凹凸分别是正负亮度的贴图,然后和b进行相加。如果再有一个纹理贴图进行混合,则把最后结果再相加即可。


    第三种,其实和第二种原理一样,唯一的区别是第二种其实还是光线强度信息阶段,最后还要lerp亮度颜色(亮绿,亮蓝都可)和暗色(比较暗的颜色都行),达到带颜色的凹凸效果。而第三种,是在lerp取值完,变成彩色材质之后,在add一次凹凸。特点是无视颜色的凹凸阴影效果叠加。优点是凹凸效果明显。如果这个材质不是3S,基本上只输出自发光时都用这种方法表现凹凸效果。
    这里补充一个技术细节,一个数值和法线贴图进行dot(点乘),可以得到基于该数值的法线明暗的效果。
    方法一,主要是用该明暗贴图和之前的效果相乘。所以当该数值比较小的时候,得到的贴图是很暗的,所以要add一个(1-该数值),这样,这个图整体亮度就几乎等于1了。然后就可以和之前的结果相乘了。


    方法二,主要是用该明暗贴图和之前的效果相加。所以当该数值比较大的时候,得到的贴图就很亮,所以在相加之前,需要减去一下该数值。这样,整个图整体亮度就几乎等于0了。然后就可以和之前的结果相加了。


    方法三,主要是因为该效果是3S而专门存在的,核心区别则是把法线贴图混合到哪个进度。其实方法3也可以以方法一的方式进行。这样的缺点就是,忽视当前效果是3S效果,把当前效果当做最普通的材质去处理。凹凸的真实度会很高,但是3s效果却降低。
    至于多层内嵌凹凸纹理,则是利用视差贴图,提前对法线贴图的UV进行纵深化即可。至于视差贴图的算法,网上有详细的讲解。这里我就不再细说明了。


    这里说一下用方法一的多纹理混合,其实也很简单,就是贴图之间不断的相乘即可(感觉运算量貌似比方法二大很多,方法二是不断的相加,不过无所谓了,是计算机做这些事也不是你做,放心好了)。

    楼主 2016-10-30 13:38 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知