mirror of
https://github.com/peng-zhihui/ElectronBot.git
synced 2026-10-21 06:35:53 +08:00
268 lines
11 KiB
GLSL
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"
|
|
} |