batteryDiagnosis/Assets/Culling_Mask/Shader/BeCulling.shader

171 lines
3.6 KiB
Plaintext

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Mask/BeCulling"
{
Properties
{
_InnerColor("InnerColor",color)=(1,1,1,1)
_InnerBright("InnerBright",range(0,1))=0.2
_Alpha("Alpha",range(0,1))=0.7
_Spec("Spec", range(0,1) )=0.5
_MainTex ("Texture", 2D) = "white" {}
_B("B",range(0,1))=1
_S("S",range(0,1))=1
_P("P",range(0,5))=1
}
SubShader
{
Tags { "RenderType"="Opaque" "queue"="transparent" }
LOD 100
Pass
{
cull front
alphatest greater 0
blend srcalpha oneminussrcalpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
#include "UnityCG.cginc"
struct v2f
{
float2 uv:TEXCOORD0;
float3 L: TEXCOORD3;
float3 V: TEXCOORD4;
float3 N: TEXCOORD5;
float4 vertex : SV_POSITION;
float3 wpos:TEXCOORD6;
};
float3 pV;
float3 pN;
sampler2D _MainTex;
float4 _MainTex_ST;
float _B,_S,_P;
float4 _InnerColor;
float _InnerBright,_Alpha,_Spec;
v2f vert (appdata_base v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
float3 i= WorldSpaceViewDir(v.vertex);
o.V= normalize(i);
float3 n= mul(float4( -v.normal,0), unity_WorldToObject).xyz;
o.N=normalize(n);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.L= WorldSpaceLightDir(v.vertex);
o.L= normalize(o.L);
o.wpos= mul(unity_ObjectToWorld, v.vertex).xyz;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col=tex2D(_MainTex, i.uv);
float diff= max(0, dot(i.L,i.N));
float spec= pow( max(0, dot(i.N, normalize(i.L+i.V))),64);
float fresnel= _B+ _S * pow( 1+ dot(-normalize(i.V+i.L),i.N),_P);
col= col * diff *_LightColor0 * _InnerColor+ _LightColor0* spec*_InnerColor*_Spec;
col+=_InnerBright;
//打开这句就为内部面计算Fresnel
// col = lerp(col, _LightColor0, fresnel);
float3 p= normalize( i.wpos-pV);
float3 n= normalize(pN);
float angle= dot(p,n);
col.a= _Alpha;
if(angle>=0)
col.a= 0;
return col;
}
ENDCG
}
//==============================
Pass
{
alphatest greater 0
blend srcalpha oneminussrcalpha
tags{"lightmode"="forwardbase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
#include "UnityCG.cginc"
struct v2f
{
float2 uv:TEXCOORD0;
float3 L: TEXCOORD3;
float3 V: TEXCOORD4;
float3 N: TEXCOORD5;
float4 vertex : SV_POSITION;
float3 wpos:TEXCOORD6;
};
float3 pV;
float3 pN;
sampler2D _MainTex;
float4 _MainTex_ST;
float _B,_S,_P;
float _Alpha,_Spec;
v2f vert (appdata_base v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
float3 i= WorldSpaceViewDir(v.vertex);
o.V= normalize(i);
float3 n= mul(float4( v.normal,0), unity_WorldToObject).xyz;
o.N=normalize(n);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.L= WorldSpaceLightDir(v.vertex);
o.L= normalize(o.L);
o.wpos= mul(unity_ObjectToWorld, v.vertex).xyz;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col=tex2D(_MainTex, i.uv);
float diff= max(0, dot(i.L,i.N));
float spec= pow( max(0, dot(i.N, normalize(i.L+i.V))),64);
float fresnel= _B+ _S * pow( 1+ dot(-normalize(i.V+i.L),i.N),_P);
col= col * diff *_LightColor0+ _LightColor0* spec*_Spec;
col = lerp(col, _LightColor0, fresnel);
col.a= _Alpha;
float3 p= normalize( i.wpos-pV);
float3 n= normalize(pN);
float angle= dot(p,n);
if(angle>=0)
col.a= 0;
return col;
}
ENDCG
}
}
}