Unity3D Shader:夜视

shader代码:

Shader "Unlit/Test"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="AlphaTest" "IgnoreProjector"="True" }
LOD 100


Cull Off
ZWrite Off


Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#pragma multi_compile _ Use_Vigent

#include "UnityCG.cginc"


struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};


struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};


sampler2D _MainTex;
sampler2D _CameraTex;
float4 _MainTex_ST;
float4 _NVColor;
float4 _TargetColor;
float _BaseLight;
float _Light;


v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}

fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
fixed4 dif=tex2D(_CameraTex,i.uv);
//得到灰度值
float lum=Luminance(col.rgb);


col=dot(col,_NVColor);


col.rgb=lerp(col.rgb,_TargetColor,lum*_Light);


col.rgb=lerp(col.rgb,dif.rgb,lum+_BaseLight);


#if Use_Vigent
float dist=distance(i.uv,float2(0.5f,0.5f));
col*=smoothstep(0.5,0.45,dist);
#endif


col.rb=max(col.r-0.75,0)*4;
return col;
}
ENDCG
}
}

}

C#代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class Shader_TouShi : MonoBehaviour {
    public Shader test_20;
    Material mat;
    [SerializeField]
    public Color m_NVColor = new Color(0f, 1f, 0.1724138f, 0f);
    [SerializeField]
    public Color m_TargetColor = new Color(1f, 1f, 1f, 0f);
    [Range(0f, 0.1f)]
    public float m_BaseLight = 0;
    [Range(0f, 128f)]
    public float m_Light = 0;
    public bool UsingVigent;
    private void Awake()
    {
        if (mat == null)
        {
            mat = CreatMat(test_20);
            
        }
        
    }
    Material CreatMat(Shader shader)
    {
        if (shader == null)
        {
            return null;
        }
        if (shader.isSupported == false)
        {
            return null;
        }
        mat = new Material(shader);
        mat.hideFlags = HideFlags.DontSave;
        return mat;
    }
    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        mat.SetColor("_NVColor", m_NVColor);
        mat.SetColor("_TargetColor", m_TargetColor);
        mat.SetFloat("_BaseLight", m_BaseLight);
        mat.SetFloat("_Light", m_Light);
        if (UsingVigent == true)
        {
            mat.EnableKeyword("Use_Vigent");
        }
        else
        {
            mat.DisableKeyword("Use_Vigent");
        }
        Graphics.Blit(source, destination, mat);
    }

}


猜你喜欢

转载自blog.csdn.net/weixin_42452001/article/details/80798481