134 lines
5.2 KiB
Plaintext

Shader "Unlit URP Shader"
{
Properties
{
_BaseColor("Base Color",color) = (1,1,1,1)
_BaseMap("BaseMap", 2D) = "white" {}
_Thickness("Thickness",2D)="white"{}
_MatCap("MatCap",2D)="white"{}
_NormalDistortion("NormalDistortion",Range(0,1))=1
_SSSPower("SSSPower",Range(0.1,50))=1
_SSSScale("_SSSScale",Range(0.1,5))=1
}
SubShader
{
Tags { "Queue"="Geometry" "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
LOD 100
Pass
{
Tags {"LightMode" = "UniversalForward"}
HLSLPROGRAM
// Required to compile gles 2.0 with standard srp library
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x
#pragma multi_compile _ LIGHTMAP_ON
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS //接受主光源阴影
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE //投射主光源的阴影
#pragma multi_compile _ _SHADOWS_SOFT //软阴影
#pragma multi_compile _ _ADDITIONAL_LIGHTS //附加光源
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
float3 normal:NORMAL;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
float3 Wnormal : TEXCOORD1;
float3 Wpos:TEXCOORD2;
};
CBUFFER_START(UnityPerMaterial)
half4 _BaseColor;
float4 _BaseMap_ST;
CBUFFER_END
TEXTURE2D (_BaseMap);SAMPLER(sampler_BaseMap);
TEXTURE2D (_Thickness);SAMPLER(sampler_Thickness);
TEXTURE2D (_MatCap);SAMPLER(sampler_MatCap);
float _NormalDistortion;
float _SSSPower;
float _SSSScale;
Varyings vert(Attributes v)
{
Varyings o = (Varyings)0;
o.positionCS = TransformObjectToHClip(v.positionOS.xyz);
o.uv = TRANSFORM_TEX(v.uv, _BaseMap);
o.Wpos = TransformObjectToWorld(v.positionOS);
o.Wnormal=TransformObjectToWorldNormal(v.normal);
return o;
}
half4 frag(Varyings i) : SV_Target
{
half4 c;
half4 baseMap = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, i.uv);
c = baseMap * _BaseColor;
float3 L=normalize(_MainLightPosition);
float3 V=normalize(_WorldSpaceCameraPos.xyz-i.Wpos.xyz);
float3 N=normalize(i.Wnormal);
float3 H=normalize(V+L);
float VdH=max(dot(N,V),0.00001);
float NdL=max(dot(N,L),0.00001);
float3 Back=-normalize(L+N*_NormalDistortion);
float NdV=max(dot(N,V),0.00001);
float NdH=max(dot(N,H),0.00001);
float VdB=pow(saturate(dot(V,Back)),_SSSPower)*_SSSScale;
float thickness=1-SAMPLE_TEXTURE2D(_Thickness,sampler_Thickness,i.uv).r*0.9;
float3 sss=VdB*_BaseColor*_MainLightColor*0.1;
//return float4(sss,1);
float3 viewNorm = normalize(mul((i.Wnormal),(float3x3)UNITY_MATRIX_I_V));
float3 viewPos = normalize(TransformWorldToView(i.Wpos).xyz);
float3 viewCross = cross(viewPos, viewNorm);
viewNorm = float3(-viewCross.y, viewCross.x, 0.0);
float2 matCapUV = viewNorm.xy* 0.5 + 0.5;
half4 matCap = SAMPLE_TEXTURE2D_LOD(_MatCap, sampler_MatCap, matCapUV,2)*0.5;
float _Me=0.0;//干净的透明玻璃漫反射少,所以金属度直接拉满
float _R=0.05;
float aa=1;
BRDFData brdfData;
InitializeBRDFData(_BaseColor,_Me,1,1,aa, brdfData);
half3 ambient_contrib = SampleSH(float4(N, 1));
float3 ambient = 0.3 * _BaseColor;// 随便乘个暗的系数
float3 iblDiffuse = max(half3(0, 0, 0), ambient.rgb + ambient_contrib);
//间接高光和漫反射
float3 inssp=GlobalIllumination(brdfData,iblDiffuse,1,i.Wpos,N,V);
//直接光高光
float f=pow(1-NdV,2)*100;
float ggG=D_GGX(NdH,_R);
float ggV=V_SmithJointGGX(NdL,NdV,_R,1);
float ggF=F_Schlick(0.1,VdH);
float3 gg=ggG*ggV*ggF*PI*NdL*_MainLightColor*0.1+f*inssp*_BaseColor;
gg=min(gg,0.2);
//次表面散射+高光+环境高光+matcap高光采样
c.rgb = gg+inssp+matCap+sss+_BaseColor*0.2;
return c;
}
ENDHLSL
}
}
}