Shader "Unlit/matcap"{
//matcap
Properties{
_NormalMap("法线贴图", 2D) = "bump" {}
_Matcap("matcap", 2D) = "white" {}
_FresnelPow("菲涅尔强度",Range(0,5)) = 1
_EnvSpeInt("环境反射强度",Range(0,5)) = 1
}
SubShader{
Tags {
"RenderType" = "Opaque"
}
Pass {
Name "FORWARD"
Tags {
"LightMode" = "ForwardBase"
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
//输入参数
uniform sampler2D _NormalMap;
uniform sampler2D _Matcap;
uniform float _FresnelPow;
uniform float _EnvSpeInt;
//输入结构
struct VertexInput {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 tangent : TANGENT;
float2 uv0 : TEXCOORD0;
};
//输出结构
struct VertexOutput {
float4 pos : SV_POSITION;
float2 uv0 : TEXCOORD0;
float3 nDirWS : TEXCOORD1;
float3 tDirWS : TEXCOORD2;
float3 bDirWS : TEXCOORD3;
float3 posWS : TEXCOORD4;
};
VertexOutput vert(VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.uv0 = v.uv0;
o.nDirWS = UnityObjectToWorldNormal(v.normal);
o.tDirWS = normalize(mul(unity_ObjectToWorld, float4(v.tangent.xyz, 0.0)).xyz);
o.bDirWS = normalize(cross(o.nDirWS, o.tDirWS) * v.tangent.w);
o.pos = UnityObjectToClipPos(v.vertex);
o.posWS = mul(unity_ObjectToWorld,v.vertex);
return o;
}
//像素shader
float4 frag(VertexOutput i) : COLOR{
//向量准备
float3 nDirTS = UnpackNormal(tex2D(_NormalMap, i.uv0)).rgb;
float3x3 tbn = float3x3(i.tDirWS, i.bDirWS, i.nDirWS);
float3 nDirWS = normalize(mul(nDirTS, tbn));
float3 nDirVS = mul(UNITY_MATRIX_V,float4(nDirWS,0.0));
float3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);
//中间量准备
float2 mapUV = nDirVS.rg * 0.5 + 0.5;
float ndotv = dot(nDirWS,vDirWS);
//光照模型
float3 matcap = tex2D(_Matcap, mapUV);
float fresnel = pow(1.0-ndotv, _FresnelPow);
float3 envSpcLighting = matcap * fresnel * _EnvSpeInt;
//返回值
return fixed4(envSpcLighting,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
实现效果: