遮擋顯示
Shader "Unlit/MyOwnShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_MarginColor ("_MarginColor",COLOR)=(1,1,1,1)
_Float ("_Float", Range(0.1,10)) = 0.1
_BrightFloat ("_BrightFloat", Range(0.1,50)) = 0.1
_WardColor ("_WardColor",COLOR)=(1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" "LightMode"="ForwardBase"} //向前渲染模式
LOD 100
Pass
{
ZWrite off
//將第一個通道的深度隱藏
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
//引用庫"Lighting.cginc",而在以庫類里面已引用了庫"UnityLightingCommon.cginc";
//所以只需引用庫"Lighting.cginc"即可;
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
float3 worldViewDir:POSITION1; //物體頂點到相機的世界坐標
float3 worldNormDir:POSITION2; //物體頂點法線的世界坐標
float3 worldLightDir:POSITION3; //物體頂點到光源的世界坐標
float3 worldBrightLightFDir:POSITION4; //太陽光的反射光的世界坐標
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _MarginColor;
float _Float;
float _BrightFloat;
//基于頂點渲染
v2f vert (appdata_base v)
{
v2f o;
o.worldNormDir = normalize(UnityObjectToWorldNormal(v.normal));
//將頂點的法線的本地坐標轉化成世界坐標 轉化成單位向量用于點乘計算
o.worldViewDir = normalize(WorldSpaceViewDir(v.vertex));
//將頂點本地坐標到攝像機本地坐標的向量轉化成世界的 轉化成單位向量用于點乘計算
o.worldLightDir = normalize(UnityWorldSpaceLightDir(v.vertex));
//將頂點本地坐標到光源本地坐標的向量轉化成世界的 轉化成單位向量用于點乘計算
o.worldBrightLightFDir = normalize(reflect(-o.worldLightDir,o.worldNormDir));
//得到光線反射的世界坐標 轉化成單位向量用于點乘計算
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
//基于像素渲染
fixed4 frag (v2f i) : SV_Target
{
fixed4 theCol = _MarginColor * pow(1 - (saturate(dot(i.worldViewDir,i.worldNormDir))), _Float);
fixed4 theDiffuseCol = _LightColor0 * saturate(dot(i.worldLightDir,i.worldNormDir)) + UNITY_LIGHTMODEL_AMBIENT;
// _LightColor0 是 "UnityLightingCommon.cginc" 里面的,他表示世界的燈光的顏色
//UNITY_LIGHTMODEL_AMBIENT是環境光
//渲染里面: + 代表顏色更深,* 代表顏色更淺
fixed4 theBrightLightCol =_LightColor0 * pow(saturate(dot(i.worldBrightLightFDir,i.worldViewDir)),_BrightFloat);
//高光顏色
fixed4 col = tex2D(_MainTex, i.uv) * theDiffuseCol + theCol + theBrightLightCol;
return col;
}
ENDCG
}
Pass
{
blend SrcAlpha OneMinusSrcAlpha
//透明通道
ZTest greater
//被擋住顯示,被擋住就渲染這個通道
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
//引用庫"Lighting.cginc",而在以庫類里面已引用了庫"UnityLightingCommon.cginc";
//所以只需引用庫"Lighting.cginc"即可;
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
float3 worldViewDir:POSITION1; //物體頂點到相機的世界坐標
float3 worldNormDir:POSITION2; //物體頂點法線的世界坐標
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _MarginColor;
float _Float;
fixed4 _WardColor;
//基于頂點渲染
v2f vert (appdata_base v)
{
v2f o;
o.worldNormDir = normalize(UnityObjectToWorldNormal(v.normal));
//將頂點的法線的本地坐標轉化成世界坐標 轉化成單位向量用于點乘計算
o.worldViewDir = normalize(WorldSpaceViewDir(v.vertex));
//將頂點本地坐標到攝像機本地坐標的向量轉化成世界的 轉化成單位向量用于點乘計算
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
//基于像素渲染
fixed4 frag (v2f i) : SV_Target
{
fixed4 theCol = _MarginColor * pow(1 - (saturate(dot(i.worldViewDir,i.worldNormDir))), _Float);
fixed4 col = tex2D(_MainTex, i.uv) * _WardColor + theCol;
return col;
}
ENDCG
}
}
FallBack "Diffuse"
//設置回滾投機取巧偷懶,讓物體的陰影為Diffuse的陰影
}
人物描邊
Shader "Unlit/Outline"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Color ("_Color",COLOR)=(1,1,1,1)
}
SubShader
{
Tags { "Queue"="Transparent"}
LOD 100
Pass
{
blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Color;
v2f vert (appdata_base v)
{
v2f o;
v.vertex.x *= 1.08;
v.vertex.y *= 1.08;
v.vertex.z *= 1.08;
//放大了再將本地坐標轉化成投影坐標
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return _Color;
}
ENDCG
}
Pass
{
ZTest greater
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata_base v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}