[材质贴图] 冰霜效果的思考和实现

查看:406 |回复:0 | 2019-5-28 07:50:34

您需要 登录 才可以下载或查看,没有账号?注册

x
由于最近要做一个冰系的角色,就想能不能做一些冰霜效果。那么就试试吧,先弄一张原图:
2_53622_5f7c68676ccd141.jpg

1.常规的冰霜,最简单的要数霜冻的颜色变化,只需要减少亮度,增加蓝色分量。

片段着色器:

texcol *= fixed4(0.9, 0.9, 0.9, 1f);
texcol.b += 0.2;

效果如下:
2_53622_a50fa7280ccd7df.jpg
虽然简单,但效果也十分一般。

2.如果你玩过冰火围城,它里面的冰冻效果则是更加金属化,给人的感觉是一层灰色滤镜再增加一点蓝色,然后顶部会更亮。

首先,我们要计算法线夹角,方便处理顶部更亮这部分。

顶点着色器:

float3 normal = mul(SCALED_NORMAL, (float3x3)_World2Object);
fixed dotProduct = dot(normal, fixed3(0, 1, 0)) / 2;
if(dotProduct <= 0)
{
         dotProduct = 0;
}
  o.color = dotProduct.xxx;

然后灰化整个角色,并且增加顶部亮度。

片段着色器:

float grey = dot(texcol.rgb, float3(0.299, 0.587, 0.114)) + i.color.x;
texcol = fixed4(grey, grey, grey, texcol.a);
texcol.r -= 0.15;
texcol.b += 0.15;
效果如下:

不过由于这个模型本身比较暗,所以看上去有点像雕像。但这似乎不是我们想要的效果呢,于是我打算换一个思路,让材质先变成霜。

增加了一张贴图,看看霜的效果:

哈哈,有点像冰棍了呢。但霜应该要亮一些,我打算增加下亮度,同时增加外发光。

顶点着色器:

fixed3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
fixed dotProduct = 1 - dot(v.normal, viewDir);
o.color = smoothstep(0, 1, dotProduct);     
o.color *= _RimColor;

片段着色器:

texcol.rgb += i.color;


效果:

可是这样就完全是冰棍了呢,我想要混合一下原始的像素,于是增加一个变量,控制一下混合。

片段着色器:

texcol = texcol * _Frezz +  alpha * (1 - _Frezz);


设置效果:

通过控制滚动条可以调整混合比例,这个大概是64开的比例,看着还行吧。


但这样就结束的话还是差强人意,因为冰霜的变化太过规则了,我们很多时候希望的是随机变化,显得更自然。

再增加一张噪点贴图,通过获得贴图的值调整混合比例。

float ClipTex = tex2D (_RandomTex, i.uv).r ;
float ClipAmount = (_Frezz - ClipTex) / 2 + 0.5;
if(ClipAmount < 0)
{
          ClipAmount = 0;
}
if(ClipAmount > 1)
{
           ClipAmount = 1;
}

效果如下:

这样马马虎虎吧,如果还要继续就需要法线贴图,遗憾的是这个模型没有法线贴图。

如果有法线贴图,我们可以再法线贴图层面上增加冰霜的颜色变化。


评分

参与人数 3元素币 +5 活跃度 +30 展开 理由
大西几 + 5 + 10 有点意思
七濑丸 + 10 不错的效果
诺一 + 10 支持一下!

查看全部评分

2019-5-28 07:50:34  
 赞 赞 0

使用道具 登录

0个回答,把该问题分享到群,邀请大神一起回答。

CG 游戏行业专业问题

图文教程技术文章技术文库3D建模
显示全部 9
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表