Files
peng-zhihui 06ec2e469e Released.
2022-03-13 06:31:07 +08:00

268 lines
11 KiB
GLSL

Shader "Ciconia Studio/CS_Glass/Builtin/SimpleGlass"
{
Properties
{
[Space(10)][Header(Main Properties)][Space(15)]_Color("Color", Color) = (0,0,0,0)
_Saturation("Saturation", Float) = 0
_Brightness("Brightness", Range( 1 , 8)) = 1
[Space(15)]_Metallic("Metallic", Range( 0 , 2)) = 0.2
_Glossiness("Smoothness", Range( 0 , 1)) = 0.5
[Space(35)]_BumpMap("Normal Map", 2D) = "bump" {}
_BumpScale("Scale", Float) = 0.3
_Refraction("Refraction", Range( 0 , 2)) = 1.1
[Space(45)][Header(Self Illumination)][Space(15)]_Intensity("Intensity", Range( 1 , 10)) = 1
[Space(45)][Header(Reflection Properties) ][Space(15)]_ColorCubemap("Color ", Color) = (1,1,1,1)
[HDR]_CubeMap("Cube Map", CUBE) = "black" {}
_ReflectionIntensity("Reflection Intensity", Float) = 1
_BlurReflection("Blur", Range( 0 , 8)) = 0
[Space(15)]_ColorFresnel1("Color Fresnel", Color) = (1,1,1,0)
[ToggleOff(_USECUBEMAP_OFF)] _UseCubemap("Use Cubemap", Float) = 1
_FresnelStrength("Fresnel Strength", Range( 0 , 8)) = 0
_PowerFresnel("Power", Float) = 0.5
[Space(45)][Header(Transparency Properties)][Space(15)]_Opacity("Opacity", Range( 0 , 1)) = 1
[Space(10)][Toggle]_FalloffOpacity("Falloff Opacity", Float) = 0
[Toggle]_Invert("Invert", Float) = 0
[Space(10)]_FalloffOpacityIntensity("Falloff Intensity", Range( 0 , 1)) = 1
_PowerFalloffOpacity("Power", Float) = 1
[Space(45)][Header(Fade Properties)][Space(15)]_Fade("Fade", Range( 0 , 1)) = 0
[Space(10)][Toggle]_FalloffFade("Falloff", Float) = 0
[Toggle]_InvertFresnelFade("Invert", Float) = 0
[Space(10)]_GradientFade("Falloff Intensity", Range( 0 , 1)) = 1
_PowerFalloffFade("Power", Float) = 1
[HideInInspector] _texcoord( "", 2D ) = "white" {}
[HideInInspector] __dirty( "", Int ) = 1
}
SubShader
{
Tags{ "RenderType" = "Glass" "Queue" = "Transparent+0" "IgnoreProjector" = "True" "IsEmissive" = "true" }
Cull Back
Blend SrcAlpha OneMinusSrcAlpha
GrabPass{ "_ScreenGrab0" }
CGINCLUDE
#include "UnityStandardUtils.cginc"
#include "UnityShaderVariables.cginc"
#include "UnityPBSLighting.cginc"
#include "Lighting.cginc"
#pragma target 3.0
#pragma shader_feature_local _USECUBEMAP_OFF
#if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED)
#define ASE_DECLARE_SCREENSPACE_TEXTURE(tex) UNITY_DECLARE_SCREENSPACE_TEXTURE(tex);
#else
#define ASE_DECLARE_SCREENSPACE_TEXTURE(tex) UNITY_DECLARE_SCREENSPACE_TEXTURE(tex)
#endif
#ifdef UNITY_PASS_SHADOWCASTER
#undef INTERNAL_DATA
#undef WorldReflectionVector
#undef WorldNormalVector
#define INTERNAL_DATA half3 internalSurfaceTtoW0; half3 internalSurfaceTtoW1; half3 internalSurfaceTtoW2;
#define WorldReflectionVector(data,normal) reflect (data.worldRefl, half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal)))
#define WorldNormalVector(data,normal) half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal))
#endif
struct Input
{
float2 uv_texcoord;
float3 worldPos;
float3 worldNormal;
INTERNAL_DATA
float3 worldRefl;
float4 screenPos;
};
uniform float _BumpScale;
uniform sampler2D _BumpMap;
uniform float4 _BumpMap_ST;
uniform float _Brightness;
uniform float4 _Color;
uniform float _Saturation;
uniform float4 _ColorFresnel1;
uniform float _PowerFresnel;
uniform float _FresnelStrength;
uniform samplerCUBE _CubeMap;
uniform float _BlurReflection;
uniform float _ReflectionIntensity;
uniform float4 _ColorCubemap;
ASE_DECLARE_SCREENSPACE_TEXTURE( _ScreenGrab0 )
uniform float _Refraction;
uniform float _FalloffOpacity;
uniform float _Intensity;
uniform float _Opacity;
uniform float _Invert;
uniform float _FalloffOpacityIntensity;
uniform float _PowerFalloffOpacity;
uniform float _Metallic;
uniform float _Glossiness;
uniform float _FalloffFade;
uniform float _Fade;
uniform float _InvertFresnelFade;
uniform float _GradientFade;
uniform float _PowerFalloffFade;
float4 CalculateContrast( float contrastValue, float4 colorTarget )
{
float t = 0.5 * ( 1.0 - contrastValue );
return mul( float4x4( contrastValue,0,0,t, 0,contrastValue,0,t, 0,0,contrastValue,t, 0,0,0,1 ), colorTarget );
}
inline float4 ASE_ComputeGrabScreenPos( float4 pos )
{
#if UNITY_UV_STARTS_AT_TOP
float scale = -1.0;
#else
float scale = 1.0;
#endif
float4 o = pos;
o.y = pos.w * 0.5f;
o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y;
return o;
}
void surf( Input i , inout SurfaceOutputStandard o )
{
float2 uv0_BumpMap = i.uv_texcoord * _BumpMap_ST.xy + _BumpMap_ST.zw;
float3 tex2DNode2 = UnpackScaleNormal( tex2D( _BumpMap, uv0_BumpMap ), _BumpScale );
float3 Normal101 = tex2DNode2;
o.Normal = Normal101;
float clampResult239 = clamp( _Saturation , -1.0 , 100.0 );
float3 desaturateInitialColor211 = _Color.rgb;
float desaturateDot211 = dot( desaturateInitialColor211, float3( 0.299, 0.587, 0.114 ));
float3 desaturateVar211 = lerp( desaturateInitialColor211, desaturateDot211.xxx, -clampResult239 );
float4 temp_output_303_0 = CalculateContrast(_Brightness,float4( desaturateVar211 , 0.0 ));
float4 AlbedoAmbient117 = temp_output_303_0;
o.Albedo = AlbedoAmbient117.rgb;
float3 ase_worldPos = i.worldPos;
float3 ase_worldViewDir = normalize( UnityWorldSpaceViewDir( ase_worldPos ) );
float3 ase_worldNormal = WorldNormalVector( i, float3( 0, 0, 1 ) );
float fresnelNdotV163 = dot( ase_worldNormal, ase_worldViewDir );
float fresnelNode163 = ( -0.05 + 1.0 * pow( 1.0 - fresnelNdotV163, _PowerFresnel ) );
float4 temp_output_465_0 = ( _ColorFresnel1 * fresnelNode163 * _FresnelStrength );
float3 NormalmapXYZ170 = tex2DNode2;
float4 texCUBENode6 = texCUBElod( _CubeMap, float4( WorldReflectionVector( i , NormalmapXYZ170 ), _BlurReflection) );
#ifdef _USECUBEMAP_OFF
float4 staticSwitch461 = temp_output_465_0;
#else
float4 staticSwitch461 = ( temp_output_465_0 * texCUBENode6 );
#endif
float4 clampResult468 = clamp( staticSwitch461 , float4( 0,0,0,0 ) , float4( 1,1,1,0 ) );
float4 clampResult530 = clamp( ( texCUBENode6 * ( texCUBENode6.a * _ReflectionIntensity ) * _ColorCubemap ) , float4( 0,0,0,0 ) , float4( 1,1,1,0 ) );
float4 Cubmap179 = ( clampResult468 + clampResult530 );
float4 ase_screenPos = float4( i.screenPos.xyz , i.screenPos.w + 0.00000000001 );
float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( ase_screenPos );
float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w;
float3 ase_normWorldNormal = normalize( ase_worldNormal );
float4 screenColor381 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_ScreenGrab0,( (ase_grabScreenPosNorm).xyzw + float4( (( ( Normal101 + mul( float4( ase_normWorldNormal , 0.0 ), UNITY_MATRIX_V ).xyz ) * (-1.0 + (_Refraction - 0.0) * (1.0 - -1.0) / (2.0 - 0.0)) )).xyz , 0.0 ) ).xy);
float4 GrabSreenRefraction385 = screenColor381;
float lerpResult483 = lerp( 0.0 , _Intensity , _Opacity);
float lerpResult68 = lerp( -3.0 , 0.0 , _FalloffOpacityIntensity);
float fresnelNdotV25 = dot( ase_worldNormal, ase_worldViewDir );
float fresnelNode25 = ( lerpResult68 + _PowerFalloffOpacity * pow( 1.0 - fresnelNdotV25, (( 1.0 + -lerpResult483 ) + (1.0 - 0.0) * (lerpResult483 - ( 1.0 + -lerpResult483 )) / (1.0 - 0.0)) ) );
float clampResult45 = clamp( (( _Invert )?( ( 1.0 - fresnelNode25 ) ):( fresnelNode25 )) , 0.0 , 1.0 );
float Opacity87 = (( _FalloffOpacity )?( clampResult45 ):( ( 1.0 - lerpResult483 ) ));
o.Emission = ( Cubmap179 + ( GrabSreenRefraction385 * ( 1.0 - Opacity87 ) ) ).rgb;
float Metallic110 = _Metallic;
o.Metallic = Metallic110;
float Roughness111 = _Glossiness;
o.Smoothness = Roughness111;
float lerpResult513 = lerp( -3.0 , 0.0 , _GradientFade);
float fresnelNdotV515 = dot( ase_worldNormal, ase_worldViewDir );
float fresnelNode515 = ( lerpResult513 + _PowerFalloffFade * pow( 1.0 - fresnelNdotV515, (( 1.0 + -( 1.0 - _Fade ) ) + (1.0 - 0.0) * (( 1.0 - _Fade ) - ( 1.0 + -( 1.0 - _Fade ) )) / (1.0 - 0.0)) ) );
float clampResult518 = clamp( (( _InvertFresnelFade )?( ( 1.0 - fresnelNode515 ) ):( fresnelNode515 )) , 0.0 , 1.0 );
float Fade450 = (( _FalloffFade )?( clampResult518 ):( ( 1.0 - _Fade ) ));
o.Alpha = Fade450;
}
ENDCG
CGPROGRAM
#pragma surface surf Standard keepalpha fullforwardshadows
ENDCG
Pass
{
Name "ShadowCaster"
Tags{ "LightMode" = "ShadowCaster" }
ZWrite On
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#pragma multi_compile_shadowcaster
#pragma multi_compile UNITY_PASS_SHADOWCASTER
#pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2
#include "HLSLSupport.cginc"
#if ( SHADER_API_D3D11 || SHADER_API_GLCORE || SHADER_API_GLES || SHADER_API_GLES3 || SHADER_API_METAL || SHADER_API_VULKAN )
#define CAN_SKIP_VPOS
#endif
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "UnityPBSLighting.cginc"
sampler3D _DitherMaskLOD;
struct v2f
{
V2F_SHADOW_CASTER;
float2 customPack1 : TEXCOORD1;
float4 screenPos : TEXCOORD2;
float4 tSpace0 : TEXCOORD3;
float4 tSpace1 : TEXCOORD4;
float4 tSpace2 : TEXCOORD5;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
v2f vert( appdata_full v )
{
v2f o;
UNITY_SETUP_INSTANCE_ID( v );
UNITY_INITIALIZE_OUTPUT( v2f, o );
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o );
UNITY_TRANSFER_INSTANCE_ID( v, o );
Input customInputData;
float3 worldPos = mul( unity_ObjectToWorld, v.vertex ).xyz;
half3 worldNormal = UnityObjectToWorldNormal( v.normal );
half3 worldTangent = UnityObjectToWorldDir( v.tangent.xyz );
half tangentSign = v.tangent.w * unity_WorldTransformParams.w;
half3 worldBinormal = cross( worldNormal, worldTangent ) * tangentSign;
o.tSpace0 = float4( worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x );
o.tSpace1 = float4( worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y );
o.tSpace2 = float4( worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z );
o.customPack1.xy = customInputData.uv_texcoord;
o.customPack1.xy = v.texcoord;
TRANSFER_SHADOW_CASTER_NORMALOFFSET( o )
o.screenPos = ComputeScreenPos( o.pos );
return o;
}
half4 frag( v2f IN
#if !defined( CAN_SKIP_VPOS )
, UNITY_VPOS_TYPE vpos : VPOS
#endif
) : SV_Target
{
UNITY_SETUP_INSTANCE_ID( IN );
Input surfIN;
UNITY_INITIALIZE_OUTPUT( Input, surfIN );
surfIN.uv_texcoord = IN.customPack1.xy;
float3 worldPos = float3( IN.tSpace0.w, IN.tSpace1.w, IN.tSpace2.w );
half3 worldViewDir = normalize( UnityWorldSpaceViewDir( worldPos ) );
surfIN.worldPos = worldPos;
surfIN.worldNormal = float3( IN.tSpace0.z, IN.tSpace1.z, IN.tSpace2.z );
surfIN.worldRefl = -worldViewDir;
surfIN.internalSurfaceTtoW0 = IN.tSpace0.xyz;
surfIN.internalSurfaceTtoW1 = IN.tSpace1.xyz;
surfIN.internalSurfaceTtoW2 = IN.tSpace2.xyz;
surfIN.screenPos = IN.screenPos;
SurfaceOutputStandard o;
UNITY_INITIALIZE_OUTPUT( SurfaceOutputStandard, o )
surf( surfIN, o );
#if defined( CAN_SKIP_VPOS )
float2 vpos = IN.pos;
#endif
half alphaRef = tex3D( _DitherMaskLOD, float3( vpos.xy * 0.25, o.Alpha * 0.9375 ) ).a;
clip( alphaRef - 0.01 );
SHADOW_CASTER_FRAGMENT( IN )
}
ENDCG
}
}
Fallback "Diffuse"
}