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,5))=1 _SSSPower("SSSPower",Range(0.1,5))=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); //float3 float3 Back=-normalize(L+N*_NormalDistortion); float NdV=pow(1-saturate(dot(N,V)),3)*0.2; float NdL=dot(N,L)*0.5+0.5; float NdH=pow(saturate(dot(N,H)),2)*0.1; float VdB=pow(saturate(dot(V,Back)),_SSSPower)*_SSSScale; float thickness=1-SAMPLE_TEXTURE2D(_Thickness,sampler_Thickness,i.uv).r*0.5; float3 sss=max(VdB,0.5)*thickness*_BaseColor; float3 reflectVec=reflect(-V,N); half4 rgbm = SAMPLE_TEXTURECUBE_LOD(unity_SpecCube0,samplerunity_SpecCube0,reflectVec, 4); float3 iblSpecular = DecodeHDREnvironment(rgbm, unity_SpecCube0_HDR); 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 = min(SAMPLE_TEXTURE2D_LOD(_MatCap, sampler_MatCap, matCapUV,2),0.5); //次表面散射+漫反射+高光+环境高光+matcap高光采样 c.rgb = sss+NdL*_BaseColor*_MainLightColor*0.5+NdH*_MainLightColor*saturate(dot(N,L))+iblSpecular*0.2+matCap*max(NdL,0.3)+NdV*_BaseColor; return c; } ENDHLSL } } }