首页 >> 大全

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

2023-12-24 大全 40 作者:考证青年

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

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

首先是全屏特效的实现。可以用实现,但是消耗太大,有点浪费。我们可以在相机前放置一个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值剔除即可。

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

首先是噪声生成。这边山寨了一个超快的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;}

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

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

	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;}

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

对随机取值就可以随机出不同的血液效果,改变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("Prefabs/effect/CamBlood")) as GameObject;_inst = gobj.GetComponent();}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;_inst.transform.parent = camera.transform;_inst.transform.localPosition = new Vector3(0f, 0f, 1f);_inst.transform.localEulerAngles = Vector3.zero;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);

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

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了