150 lines
5.3 KiB
Plaintext
150 lines
5.3 KiB
Plaintext
/*
|
|
Author:gzg
|
|
Date:2019-09-12
|
|
Desc:创建角色场景使用的皮肤
|
|
*/
|
|
Shader "Ares/Special/CreatePlayer/Skin"
|
|
{
|
|
Properties
|
|
{
|
|
_MainTex ("Texture", 2D) = "white" {}
|
|
_SquareFactor("SquareFactor",Range(0,1))=1
|
|
_LutTex ("Lut", 2D) = "white" {}
|
|
_PRB_Metallic("Metallic",Range(0,1)) = 1
|
|
_PBR_Roughness("Roughness",Range(0.08,1)) = 0.1
|
|
_EyeAdaptionLevel("_EyeAdaptionLevel",Range(0,10))=1.005
|
|
_HDRMax("_HDRMax",Range(0,2))=2
|
|
_HDRMin("_HDRMin",Range(0,0.5))=0.3
|
|
[HDR]_HDRColor("_HDRColor",Color)=(1.6,1.496,1.463,1)
|
|
_PointLightColor("_PointLightColor",Color) = (0,0,0,0)
|
|
_PointLightPos("_PointLightPos",Vector) = (0,0,0,0)
|
|
_EmissiveFactor("EmissiveFactor",Range(0,1)) =1
|
|
_ShadowDepthBias("_ShadowDepthBias",Range(0,0.005)) = 0.001
|
|
|
|
}
|
|
CGINCLUDE
|
|
|
|
#include "../../Gonbest/Include/Base/CommonCG.cginc"
|
|
#include "../../Gonbest/Include/Base/MathCG.cginc"
|
|
#include "../../Gonbest/Include/Specular/GGXCG.cginc"
|
|
#include "../../Gonbest/Include/Diffuse/LambertCG.cginc"
|
|
#include "../../Gonbest/Include/Base/FresnelCG.cginc"
|
|
#include "../../Gonbest/Include/Shadow/ShadowCG.cginc"
|
|
#include "../../Gonbest/Include//Base/EnergyCG.cginc"
|
|
|
|
struct v2f
|
|
{
|
|
float4 vertex : SV_POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
float3 wn : TEXCOORD1;
|
|
float4 wp : TEXCOORD2;
|
|
GONBEST_SHADOW_COORDS(3)
|
|
|
|
};
|
|
|
|
sampler2D _MainTex;
|
|
sampler2D _LutTex;
|
|
float4 _MainTex_ST;
|
|
uniform float _PBR_Roughness;
|
|
uniform float _PRB_Metallic;
|
|
float _EyeAdaptionLevel;
|
|
float3 _HDRColor;
|
|
float _HDRMin;
|
|
float _HDRMax;
|
|
float _SquareFactor;
|
|
float _EmissiveFactor;
|
|
|
|
v2f vert (appdata_full v)
|
|
{
|
|
v2f o;
|
|
o.wp = mul(unity_ObjectToWorld,v.vertex).xyzw;
|
|
o.vertex = mul(UNITY_MATRIX_VP,o.wp);
|
|
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
|
|
o.wn = GBNormalizeSafe(mul(v.normal.xyz,(float3x3)unity_WorldToObject));
|
|
//阴影处理
|
|
GONBEST_TRANSFER_SHADOW_WPOS(o,o.wp,v.texcoord1);
|
|
return o;
|
|
}
|
|
|
|
fixed4 frag (v2f i) : SV_Target
|
|
{
|
|
// sample the texture
|
|
fixed4 col = tex2D(_MainTex, i.uv);
|
|
col =lerp(col,col*col,_SquareFactor);
|
|
|
|
float4 P = i.wp;
|
|
float3 V = GBNormalizeSafe(_WorldSpaceCameraPos.xyz - i.wp.xyz);
|
|
float3 L = V;//GBNormalizeSafe(_WorldSpaceLightPos0.xyz);
|
|
float3 N = GBNormalizeSafe(i.wn);
|
|
float3 H = GBNormalizeSafe(V+L);
|
|
float3 LoVRaw = dot(L,V);
|
|
float3 NoVRaw = dot(N,V);
|
|
|
|
float NoLRaw = dot(N,L);
|
|
float NoL = saturate(NoLRaw);
|
|
|
|
|
|
float rim = abs(saturate(((1.0 - NoVRaw) - 0.5)/ 0.5));
|
|
rim *=rim;
|
|
float3 rimColor = rim* float3(0.64,0.41,0.3)* dot(N,float3(1,1,0)) ;
|
|
float3 EmissColor =(saturate(1- dot(-L,N)) * 0.1 * col.xyz ) * _EmissiveFactor ;
|
|
|
|
float NoL01 = NoLRaw *0.5 + 0.5;
|
|
float2 lutuv1 = float2(NoL01,0);
|
|
float3 sss_lut = tex2D(_LutTex,lutuv1);
|
|
sss_lut *= sss_lut;
|
|
|
|
float3 specColor = lerp(float3(0.04,0.04,0.04),col,_PRB_Metallic);
|
|
|
|
float _InvLenH = rsqrt((2.0 + (2.0 * LoVRaw)));
|
|
float NoH = saturate((NoLRaw + NoVRaw) * _InvLenH);
|
|
float VoH = saturate(_InvLenH + (_InvLenH * LoVRaw));
|
|
float NoV = saturate(abs(NoVRaw));
|
|
float3 F = GBFresnelTermFastWithSpecGreen(specColor,NoH);
|
|
float D = GBGGXTerm(NoH,_PBR_Roughness);
|
|
float Vis = 1;//GBSmithJointGGXVisibilityTerm(NoV,NoL,_PBR_Roughness);
|
|
float3 spec = F*D*Vis ;
|
|
float3 sun = saturate(col.xyz + spec );
|
|
sun *= sss_lut + col.xyz * saturate(1-dot(L,N)) * 0.3;
|
|
|
|
float lum = 0.168;// tex2D(_LumTex,i.uv.xy).x;
|
|
lum*= _EyeAdaptionLevel;
|
|
lum = min(max(lum,_HDRMin),_HDRMax);
|
|
|
|
sun *= _HDRColor;
|
|
sun *= 0.25;
|
|
sun /= lum;
|
|
sun = sun*(sun * 2.51 + 0.03)/(sun * (sun * 2.43 + 0.59) + 0.14);
|
|
sun = sqrt(sun);
|
|
|
|
col.xyz = sun + EmissColor;
|
|
|
|
//阴影处理
|
|
//float shadow = GONBEST_DECODE_SHADOW_VALUE_DEPTH(i,P);
|
|
//shadow = saturate(shadow * max(0,dot(N,L)) + 0.1);
|
|
//col.xyz *= lerp(0.6,1,shadow);
|
|
#if defined(_GONBEST_SPEC_ALPHA_ON)
|
|
col.a = GBLuminance(EmissColor);
|
|
#endif
|
|
return col;
|
|
|
|
}
|
|
ENDCG
|
|
SubShader
|
|
{
|
|
Tags {"LightMode" = "ForwardBase" "RenderType"="Opaque" "Queue" = "Geometry"}
|
|
LOD 100
|
|
Pass
|
|
{
|
|
CGPROGRAM
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
//#pragma multi_compile _GONBEST_SHADOW_ON _GONBEST_SHADOW_OFF
|
|
//#pragma multi_compile _GONBEST_CUSTOM_SHADOW_ON
|
|
#pragma multi_compile _GONBEST_SPEC_ALPHA_ON
|
|
ENDCG
|
|
}
|
|
}
|
|
Fallback "Gonbest/FallBack/FBWithShadow"
|
|
}
|