【Shader】简单的屏幕喷血渐溶效果

阅读: 评论:0

【Shader】简单的屏幕喷血渐溶效果

【Shader】简单的屏幕喷血渐溶效果

一般FPS中的屏幕溅血效果可以使用UI贴图制作,简单,缺点是效果生硬,不够逼真。这边提供一种方案思路,可以随机生成血液喷溅并慢慢溶解的效果。

首先是全屏特效的实现。可以用OnPostRender实现,但是消耗太大,有点浪费。我们可以在相机前放置一个Quad面片,然后其渲染至整个屏幕。再在这个面片上进行纹理绘制即可。

	v2f vert(appdata_base v){v2f o;o.pos = v.vertex;o.vertex = fixed4(v.vertex.x * 2, v.vertex.y * 2, 0, 1);return o;}

然后就正题:随机的血液效果了。根据屏幕坐标采集噪声图像值,跟颜色叠加,将半透的alpha值剔除即可。

首先是噪声生成。这边山寨了一个超快的value噪声函数。

	float noise(float3 x){x *= 4.0;float3 p = floor(x);float3 f = frac(x);f = f*f*(3.0 - 2.0*f);float2 uv = (p.xy + float2(37.0, 17.0)*p.z) + f.xy;float2 rg = tex2D(_NoiseOffsets, (uv + 0.5) / 256.0).yx;return lerp(rg.x, rg.y, f.z);}float noise_sum(float3 p){float f = 0.0;f += (1.0000 * noise(p)); p = 2.0 * p;f += (0.5000 * noise(p)); p = 2.0 * p;f += (0.2500 * noise(p)); p = 2.0 * p;f += (0.1250 * noise(p)); p = 2.0 * p;//f += 0.06255 * noise(p); return f;}

_NoiseOffsets是一个噪声图像,可以在这边下载:.asset

然后,简单的颜色叠加即可:

	fixed4 frag(v2f i) :SV_Target{fixed4 c;c = _Color * noise_sum(i.pos * _NoiseSize + _NoisePos);if (c.a <= _Fade){c.a = 0f;}return c;}


对NoisePos随机取值就可以随机出不同的血液效果,改变Color的alpha值,我们就能慢慢溶解绘制出来的血液。

public class CamBlood : MonoBehaviour
{float startVal;Material curMat;int propIdColor;int propIdNoisePos;float durTime;float curTime;static CamBlood _inst;public static CamBlood Inst{get{if (_inst == null){GameObject gobj = Instantiate(Resources.Load<GameObject>("Prefabs/effect/CamBlood")) as GameObject;_inst = gobj.GetComponent<CamBlood>();}return _inst;}}void Awake(){curMat = renderer.sharedMaterial;propIdColor = Shader.PropertyToID("_Color");propIdNoisePos = Shader.PropertyToID("_NoisePos");}void Update(){if (curTime <= durTime){//显示中curTime += Time.deltaTime;float val = (1 - (curTime / durTime)) * this.startVal;curMat.SetColor(propIdColor, new Color(0.19f, 0.03f, 0.03f, val));}else if(durTime > 0){curMat.SetColor(propIdColor, new Color(0.19f, 0.03f, 0.03f, 0f));}}public void Create(Camera camera, float val, float durTime){this.startVal = val;_ansform.parent = ansform;_ansform.localPosition = new Vector3(0f, 0f, 1f);_ansform.localEulerAngles = ;curMat.SetVector(propIdNoisePos, new Vector4(0, 0, Random.Range(0f, 1f), 1));curMat.SetColor(propIdColor, new Color(0.19f, 0.03f, 0.03f, val));this.durTime = durTime;curTime = 0f;}
}

需要创建时,调用即可

CamBlood.Inst.Create(cam, startVal, dur);

完整的项目资源下载: 点击打开链接

本文发布于:2024-02-01 14:24:45,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170676868537232.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:喷血   屏幕   效果   简单   Shader
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23