//使用用途:同于屏幕掉血的后处理特效
//请结合和脚本:BloodScreen 挂载至摄像机使用本特效
//本特效设计之初未考虑兼容移动设备,请注意
//使用说明:
//掉血获取此脚本,将showBlood设置为true,如果您需要更深的效果可将Alpha控制调节更高,控制上程序限制不小于0.5
//如果让血消失将showBlood设置为false即可
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
[AddComponentMenu("Learn/BloodScreen")]
public class CameraFilterPack : MonoBehaviour
{
public Shader SCShader;
[Range(0, 1)]
public float Alpha =0.5f;
public bool showBlood = false;
[Range(0, 1f)]
public float LightReflect = 1f;
private Material SCMaterial;
public Texture2D Texture2;
Material material
{
get
{
if (SCMaterial == null)
{
SCMaterial = new Material(SCShader);
SCMaterial.hideFlags = HideFlags.HideAndDontSave;
}
return SCMaterial;
}
}
// Start is called before the first frame update
void Start()
{
Texture2 = Resources.Load("aab") as Texture2D;
SCShader = Shader.Find("BloodScreen");
if (!SystemInfo.supportsImageEffects)
{
enabled = false;
return;
}
}
void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
{
if (SCShader != null)
{
if (!showBlood)
{
Alpha = 0;
}
else
{
if (Alpha < 0.5f)
{
Alpha = 0.5f;
}
}
material.SetFloat("_Alpha", Alpha);
material.SetTexture("_BloodTex", Texture2);
Graphics.Blit(sourceTexture, destTexture, material);
}
else
{
Graphics.Blit(sourceTexture, destTexture);
}
}
void Update()
{
#if UNITY_EDITOR
if (Application.isPlaying != true)
{
SCShader = Shader.Find("BloodScreen");
Texture2 = Resources.Load("aab") as Texture2D;
}
#endif
}
void OnDisable()
{
if (SCMaterial)
{
DestroyImmediate(SCMaterial);
}
}
}
shader代码:
//使用用途:同于屏幕掉血的后处理特效
//请结合和脚本:CameraFilterPack 挂载至摄像机使用本特效
//本特效设计之初未考虑兼容移动设备,请注意
Shader "BloodScreen"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_BloodTex ("Blood Texture", 2D) = "white" {}
_Alpha("Alpha",Range(0.0,1.0))=1
}
SubShader
{
Pass
{
Cull Off ZWrite Off ZTest Always
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _BloodTex;
float4 _BloodTex_ST;
fixed _Alpha;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);
o.uv.zw = TRANSFORM_TEX(v.uv, _BloodTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 base = tex2D(_MainTex, i.uv.xy);
fixed4 blood=tex2D(_BloodTex,i.uv.zw);
blood*=_Alpha;
fixed4 col=base*blood+base*(1-_Alpha);
return col;
}
ENDCG
}
}
}
贴图:(源自网络)ps自己画也行