117 lines
4.5 KiB
Plaintext
117 lines
4.5 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,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
|
|
}
|
|
}
|
|
} |