庄懂老师https://space.bilibili.com/6373917?spm_id_from=333.788.b_765f7570696e666f.1第九课
Shader "Shader Forge/code Matcap" {
Properties {
_NormalMap ("法线贴图", 2D) = "bump" {}
_matcap ("matcap", 2D) = "grey" {}
_fransnal ("菲涅尔次幂", Range(0, 5)) = 4.223301
_EnvSpecInt ("环境镜面反射强度次幂", Range(0, 1)) = 0
}
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 _fransnal;
uniform float _EnvSpecInt;
struct VertexInput {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 tangent: TANGENT;
float2 uv0 : TEXCOORD0;
};
struct VertexOutput {
float4 pos : SV_POSITION;
float2 uv0 : TEXCOORD0;
float3 tdirWS : TEXCOORD1;
float3 ndirWS : TEXCOORD2;
float3 bdirWS : TEXCOORD3;
float3 posWS : TEXCOORD4;
};
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.pos = UnityObjectToClipPos( v.vertex );
o.posWS = mul(unity_ObjectToWorld, v.vertex);
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);
return o;
}
float4 frag(VertexOutput i) : COLOR {
//准备向量
float3 ndirTS = UnpackNormal(tex2D(_NormalMap, i.uv0)).rgb;// 采样法线纹理并解码 切线空间nDir
float3x3 TBN = float3x3(i.tdirWS,i.bdirWS,i.ndirWS); // 构建TBN矩阵
float3 ndirWS = normalize(mul(ndirTS,TBN));
float3 ndirVS = mul(UNITY_MATRIX_V,float4(ndirWS,0.0));
float3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);//Vdir
//中间量准备
float2 matcapUV = ndirVS.rg * 0.5 + 0.5;
float ndotv = dot(ndirWS,vDirWS);
//光照模型
float3 matcap = tex2D(_matcap,matcapUV);
float fresnel = pow(1-ndotv,_fransnal);
float3 envSpecLighting = matcap *fresnel*_EnvSpecInt;
return float4(envSpecLighting,1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}
Shader "Shader Forge/CupeMap" {
Properties {
_Cubemap ("环境球", Cube) = "_Skybox" {}
_Normalmap ("法线贴图", 2D) = "bump" {}
_Cubemapmip ("环境球MIP", Range(0, 7)) = 4.078261
_FrasnalPws ("菲涅尔次幂", Range(0, 10)) = 3.913043
_EnvSpecInt ("环境镜面反射强度", Range(0, 5)) = 0.5913044
}
SubShader {
Tags {
"RenderType"="Opaque"
}
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
uniform samplerCUBE _Cubemap;
uniform sampler2D _Normalmap;
uniform float _Cubemapmip;
uniform float _FrasnalPws;
uniform float _EnvSpecInt;
struct VertexInput {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 tangent: TANGENT;
float2 uv0 : TEXCOORD0;
};
struct VertexOutput {
float4 pos : SV_POSITION;
float2 uv0 : TEXCOORD0;
float3 tdirWS : TEXCOORD1;
float3 ndirWS : TEXCOORD2;
float3 bdirWS : TEXCOORD3;
float3 posWS : TEXCOORD4;
};
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.pos = UnityObjectToClipPos( v.vertex );
o.posWS = mul(unity_ObjectToWorld, v.vertex);
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);
return o;
}
float4 frag(VertexOutput i) : COLOR {
//准备向量
float3 ndirTS = UnpackNormal(tex2D(_Normalmap, i.uv0)).rgb;// 采样法线纹理并解码 切线空间nDir
float3x3 TBN = float3x3(i.tdirWS,i.bdirWS,i.ndirWS); // 构建TBN矩阵
float3 ndirWS = normalize(mul(ndirTS,TBN));
float3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);//Vdir
float3 vrDirWS = reflect(-vDirWS,ndirWS);
//中间量准备
float ndotv = dot(ndirWS,vDirWS);
//光照模型
float3 Cubemap=texCUBElod(_Cubemap,float4(vrDirWS,_Cubemapmip));
float fresnel = pow(max(0,1-ndotv),_FrasnalPws);
float3 envSpecLighting =Cubemap*fresnel*_EnvSpecInt;
return float4(envSpecLighting,1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}