Shader "Custom/FirstMode"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_BaseColor ("BaseColor", Color) = (1,1,1,1)
_NormalTex("NormalTex",2D) = "bump"{}
_Gloss("Gloss",Range(1,100)) = 1
_ScapularSize("_ScapularSize",Range(0,1)) = 1
}
SubShader
{
Tags {
"RenderPipeline"="UniversalRenderPipline"
"RenderType"="Opaque"
}
HLSLINCLUDE
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
CBUFFER_START(UnityMaterial)
float4 _MainTex_ST;
float4 _BaseColor;
float _Gloss;
float _ScapularSize;
CBUFFER_END
//提前采样好贴图
TEXTURE2D (_MainTex);
SAMPLER(sampler_MainTex);
float4 MainTex (float2 uv)
{
return SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,uv);
}
TEXTURE2D(_NormalTex);
SAMPLER(sampler_NormalTex);
float3 NormalTex(float2 uv)
{
return UnpackNormal(SAMPLE_TEXTURE2D(_NormalTex,sampler_NormalTex,uv));
}
struct appdata
{
float4 Pos:POSITION;
float4 normal:NORMAL;
float2 uv : TEXCOORD0;
float4 tangent:TANGENT;
};
struct v2f
{
float4 Pos:SV_POSITION;
float2 uv:TEXCOORD0;
float4 tangent:TANGENT;
float4 Btangent:TEXCOORD1;
float4 normal:NORMAL;
float3 PosWS:TEXCOORD2;
};
ENDHLSL
pass
{
HLSLPROGRAM
#pragma vertex VERT
#pragma fragment FRAG
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOW_CASCADE
#pragma multi_compile _ _SHADOWS_SOFT //柔化阴影
v2f VERT( appdata i)
{
v2f o;
o.Pos = TransformObjectToHClip(i.Pos.xyz);
o.uv = TRANSFORM_TEX(i.uv, _MainTex);
o.PosWS = TransformObjectToWorld(i.Pos);
o.normal.xyz = normalize(TransformObjectToWorldNormal(i.normal.xyz));
o.tangent.xyz = normalize(TransformObjectToWorld(i.tangent.xyz));
o.Btangent.xyz= cross(o.normal.xyz,o.tangent.xyz) * i.tangent.w;
//把世界空间顶点坐标塞到TBN的w通道里
// float3 worldPos = TransformObjectToWorld(i.Pos.xyz);
// o.tangent.w = worldPos.x;
// o.Btangent.w = worldPos.y;
// o.normal.w = worldPos.z;
o.PosWS = TransformObjectToWorld(i.Pos.xyz);
return o;
}
float4 FRAG(v2f i):SV_TARGET
{
//计算带阴影衰减的主光源
Light light = GetMainLight(TransformWorldToShadowCoord(i.PosWS));
float3 lightColor = light.color;
//引入采样好的贴图
float4 Var_MainTex = MainTex(i.uv);
float3 Var_NormalTex = NormalTex(i.uv);
Var_NormalTex = float3(lerp(-Var_NormalTex.x,Var_NormalTex.x,dot(i.normal,light.direction)),lerp(-Var_NormalTex.y,Var_NormalTex.y,dot(i.normal,light.direction)),Var_NormalTex.z);
//准备向量
//TBN矩阵计算
float3x3 TBN = float3x3(i.tangent.xyz,i.Btangent.xyz,i.normal.xyz);
//利用TBN矩阵变换法线空间
float3 nDirWS = normalize(mul(float3(Var_NormalTex.x,Var_NormalTex.y,1),TBN));
float3 lDirWS = normalize(light.direction);
float3 vDirWS = normalize(_WorldSpaceCameraPos.xyz - i.PosWS);
float3 lrDirWS = reflect(-lDirWS,nDirWS);
//获取阴影衰减
float Shadow = light.shadowAttenuation;
Shadow *= max(0,dot(i.normal,lDirWS));
//高光
float3 Scapular = pow(max(0,dot(vDirWS,lrDirWS)),_Gloss) * Var_MainTex * _ScapularSize;
//获取环境光颜色
float3 ambient =half3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w);
//计算模型的光照数据
float HalfLambert =saturate (dot(nDirWS,lDirWS) *0.5 +0.6) ;
float4 Albedo = Var_MainTex * _BaseColor;
//叠加环境光颜色进阴影里
float3 finalRGB = lerp(Albedo * ambient , Albedo * light.color,Shadow);
return float4(finalRGB.rgb * Albedo * HalfLambert + Scapular,1);
//return Scapular.rgbb;
}
ENDHLSL
}
UsePass "Universal Render Pipeline/Lit/ShadowCaster"
}
}