1.厚度模拟
厚度的话我这边采用的方法就是世界位置(worldposition)到一个固定位置的距离, 也就是WorldPosition直接distance一个自定义位置,然后控制下值域和渐变范围就可以了。注意要将世界位置转换到本地位置,不然算出来的厚度会随模型位置的变化而变化。
基础的厚度节点
基础厚度的初步效果
有了这个第一步后我们会发现模型只有正面出现厚度信息了,背面没有,如下图:
模型背面没有厚度信息
那么接下来就做一次背面的,很简单,只要把自定义的位置取下反(x,y取反,z轴我这边还是需要正的)然后再算一次和上面的取下最小值Min就可以了。
加上背面厚度计算的节点
背面也出现了厚度
现在背面厚度也有了,但是发现效果并不对,因为我们需要把这个计算的中心移动到物体的中心处,也就是需要动一下自定义位置z的位置。
z移动后的正面结果
z移动后的背面结果
两这样两边的效果都对了,我们在这个基础上加一个beerslaw(朗伯比尔定律) ,这个方法是上篇我次表面文章的时候 戴巍前辈提出来的,这次给他加上。有兴趣的可以自行百度这个定律。加上这个节点后我们稍微调整一下参数可以得到以下结果。
加上beerslaw的节点
加上beerslaw的效果
是不是更具有通透感了,那么厚度的计算到这边就结束了。
2.和主光源的一些简单交互
我们由于是使用自发光的,所以暂时只能和主光源进行一定程度的交互,我们这边直接可以取天空大气的光照度,也就是SkyAtmosphereLightIlluminance,这里面包含了天空大气的光照颜色和强度,我们为了让翡翠本身颜色在光照颜色变化的情况下也产生一定的变化,可以直接取了这个值然后乘到原来的颜色上,但是需要降低一点饱和度,并且限制下最大亮度。结果如下:
带主光源影响
带主光源影响的效果
3.高冰的翡翠效果
高冰的翡翠效果比起糯种的翡翠主要就是一个边缘通透感,我们用菲涅尔是可以做出边缘,但是方向不对,我这边采用的方法是用主光源的方向去点积顶点法线的方向,结果如下:
主光源和法线点积结果
我们需要的就是让黑的部分亮 (背光部分产生高光),这样就能产生通透感。
加上背光面高光节点
背光面高光的效果
这样一来就基本完成了冰种翡翠的效果。
4.移动端性能优化
关于性能问题的话,细心的朋友已经发现我basecolor上是没有颜色的,也就是说,我在有光照的情况下用到的只有roughness,那么为了更省性能我们可以直接舍弃光照,用cubemap去模拟它的反射,
Cubemap反射
cubemap反射的效果
最后就是四个效果的性能,从左到右分别是无光照不带高光,无光照带高光,有光照不带高光,有光照带高光
最终四种效果
着色器复杂度
最终节点各拆分部分
最终节点组合部分