卡通冰材质的简单实现

卡通冰材质的简单实现

参考示例:

崩坏三冰律Boss中的冰块效果

卡通冰材质的简单实现_第1张图片

卡通冰材质的简单实现_第2张图片
塞尔达荒野之息中的冰材质
卡通冰材质的简单实现_第3张图片

实现效果

卡通冰材质的简单实现_第4张图片
卡通冰材质的简单实现_第5张图片

实现思路

材质-1:

查看动图可以发现材质是半透材质然后由两层闪烁的亮部(一层较亮,一层较暗)、一层固有色、高光外加一个外勾边组成。

外勾边的实现就不赘述了,两层高光的实现想法如下我的想法是计算lambert模型后step出两层的范围,Blinn-Phong模型计算的高光范围。

卡通冰材质的简单实现_第6张图片

 half secondBulingArea = step(0.8,Lambert);

卡通冰材质的简单实现_第7张图片

half firstBulingArea = step(0.6,Lambert) - secondBulingArea;

卡通冰材质的简单实现_第8张图片

half spec = pow(max(0, dot(normalize(lightDir + viewDir), normalDir)), 8);

卡通冰材质的简单实现_第9张图片

half baseArea = 1 - firstBulingArea - secondBulingArea;
  • 但是动图中的视角是在旋转的,可是面向我们的一面都是有在闪烁的,我的想法是:会不会光源方向也是一同旋转的,我就拿一个空物体挂在相机上,调整好合适位置后计算和冰块材质的向量作为光源方向传给shader。
    闪烁部分拿三层颜色做lerp,Time做周期闪烁,加上随机即可。*

材质-2:

首先是半透材质,有uv流动,扭曲和折射效果外加一层边缘光。

折射部分:
卡通冰材质的简单实现_第10张图片
卡通冰材质的简单实现_第11张图片
这个折射实现是对抓取屏幕的_GrabTexture的uv使用Normal的xy相乘得到偏移并叠加到屏幕坐标的xy上。

float2 offset = tanNormal.xy*_Distortion*_RefractionTex_TexelSize.xy;
i.scrPos.xy += offset;

扭曲和uv滚动部分:

我使用了三张噪声图,(可以把三张图存在一张图的三个通道里)一张图横向滚动另一张纵向滚动,第三张计算扭曲:拿该噪声图的xy叠加到流动噪声图的uv上,(类似热扭曲的计算),再将横向流动乘上纵向流动,并使用该值作为透明度A值。

即可得到如下图所示效果
卡通冰材质的简单实现_第12张图片
固有色部分:

MainColor * BaseTexture即可。

边缘光部分:

使用的是Fresnel值做step乘上RimColor(边缘光颜色)

float3 rimLight = pow( 1 - dot(Normal,ViewDir),_FresnelPower)* _RimColor;

最后将固有色部分乘上扭曲和uv滚动部分再加上边缘光部分即可。
卡通冰材质的简单实现_第13张图片

你可能感兴趣的:(Unity3D,Unity,Shader,Shader)