Unity 镜头烟雾特效的笔记贴

效果:烟雾缭绕

实现思路的探索:

最直接的思路就是用粒子模拟,粒子特效特效跟随摄像机,然后布拉布拉的往外喷。效果还可以接受,但是用默认shader实现的粒子特效,会跟墙体地面等场景物品产生明显的接缝。这个问题起始解决起来也比较方便,把默认的粒子shader复制一遍,然后关闭ZTest。


但是,虽然这个效果也可以接受,但是,为了压缩这一点点的性能开销,还是像尝试使用UV实现。

PS4上看到一款游戏《路弗兰的什么什么什么魔女旅团》,在进入迷宫以后,就会根据当前迷宫,产生不同的烟雾效果。但是它的实现方式很简单,直接在摄像机前贴了几张贴图,然后让UV滚起来。静止条件下效果还是可以,但是在摄像机转动和移动的过程中,这个贴图始终是跟随摄像机的。这就尴尬了,完全是白内障效果啊!


本人对效果要求是比较高的,虽然这种实现方式的性能开销完全可以忽略不计,但是本人还是要追求效果的。

首先,我们的要求是

1,烟雾是会变形的

2,烟雾是跟随场景的,而不是摄像机没擦干净的效果


烟雾的形变,用噪声图做扰动就好了。准备一张四方连续的噪声图,然后按照网上的代码,用时间_Time参与uv运算。


half2 offsetColor = tex2D(_NoiseTex, i.texcoord + _Time.zx * _NoiseSpeed).rg;

i.texcoord.x += ((offsetColor.r + offsetColor.r) - 1) * _NoiseForce;
i.texcoord.y += ((offsetColor.g + offsetColor.g) - 1) * _NoiseForce;

fixed4 col = 1.5 * i.color * _TintColor * tex2D(_MainTex, i.texcoord);

本来是采样两次,用不同的值影响uv的x和y,但是尝试一次采样效果差不多,就把第二次采样省掉了。

这样的效果也不是很自然,思索半天,决定将扰动效果同时施加到alpha上。

col = fixed4(col.rgb, col.a * (offsetColor.r + offsetColor.g));

随便写写,效果好多了。

接下来解决第二个问题,怎么样使得就是贴在上相机上的白内障,看起来是场景中的。

这个问题分两步解决,第一,摄像机在转动的时候,烟雾也跟随场景一起在视野中转动。

把摄像机角度的x和y分别传给shader,然后计算到烟雾的uv上。

fixed2 temp = fixed2(fixed2((_Time.y), 0)* _MoveSpeed + fixed2(_RotateY, -_RotateX));
i.texcoord += fixed2(temp.x/2, temp.y);

其中_RotateY和_RotateX分别是摄像机角度的x分量和y分量分别经过一定计算以后的结果。

fogMat[i].SetFloat("_RotateY", transform.eulerAngles.y / 90);
fogMat[i].SetFloat("_RotateX", transform.eulerAngles.x / 90);

这里的处理比较简单粗暴,没有进行更严格的测试。

效果很棒!

然后下一贴解决摄像机移动的时候,烟雾怎样跟随场景。





你可能感兴趣的:(unity,渲染)