1603 lines
60 KiB
GLSL
1603 lines
60 KiB
GLSL
Shader "Ciconia Studio/CS_Ghost/URP/CS_Advanced Ghost (Always Visible)"
|
|
{
|
|
Properties
|
|
{
|
|
[HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1)
|
|
[HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5
|
|
[Space(15)][Header(Main Properties)][Space(15)]_Color("Color ", Color) = (0,0,0,1)
|
|
_MainTex("Base Color", 2D) = "white" {}
|
|
[Space(15)][Toggle(_ENABLESPECULARLIGHT_ON)] _EnableSpecularLight("Enable Specular Light", Float) = 0
|
|
_Glossiness("Smoothness", Range( 0 , 1)) = 0.75
|
|
[Space(35)]_BumpMap("Normal Map", 2D) = "bump" {}
|
|
_BumpScale("Scale", Range( 0 , 4)) = 0.3
|
|
[Space(15)][Header(Fresnel Properties)][Space(15)]_FresnelColor("Color", Color) = (0.6933962,1,0.9814353,1)
|
|
_SelfIllumination("Self Illumination", Range( 1 , 10)) = 1
|
|
[Space(15)]_FresnelIntensity("Fresnel Intensity", Float) = 4
|
|
_FresnelPower("Fresnel Power", Float) = 4
|
|
_FresnelBias("Bias", Range( 0 , 1)) = 0
|
|
[Toggle]_Invert("Invert", Float) = 0
|
|
[Space(15)][Header(Animation Properties)][Space(15)]_MinValueAmplitude("Min Value", Float) = 1
|
|
_MaxValueAmplitude("Max Value", Float) = 2
|
|
[TextArea(1)]_AmplitudeSpeed("Speed", Float) = 1
|
|
[Space(15)][Header(Details Properties)][Space(15)]_DetailMap("Detail Map", 2D) = "white" {}
|
|
_ContrastDetailMap("Contrast", Float) = 1
|
|
_SpreadDetailMap("Spread", Float) = 0
|
|
[Space(15)]_DetailScale("Intensity", Float) = 1
|
|
[Toggle(_DUPLICATEDETAILS_ON)] _DuplicateDetails("Duplicate Details", Float) = 1
|
|
[Space(15)]_TranslationSpeed("Translation Speed", Float) = 0
|
|
_RotationSpeed("Rotation Speed", Float) = 0
|
|
_RotationAngle("Rotation Angle", Float) = 0
|
|
[Space(15)][KeywordEnum(UVProjection,ScreenProjection)] _UVScreenProjection("UV/Screen Projection", Float) = 0
|
|
_TexturesScale("Textures Scale", Float) = 1
|
|
[Space(15)][KeywordEnum(None,NormalMap,DetailMap,Both)] _MapContribution("Map Contribution", Float) = 0
|
|
_Refraction("Refraction", Range( 0 , 2)) = 1.1
|
|
[Space(15)][Header(Transparency Properties)][Space(15)]_FillColorBackground("Fill Color Background", Color) = (0,0,0,0)
|
|
_DesaturateBackground("Desaturate Background", Range( 0 , 1)) = 0
|
|
[Space(10)]_Opacity("Opacity", Range( 0 , 1)) = 1
|
|
_ShadowOpacity("Shadow Opacity", Range( 0 , 1)) = 0
|
|
|
|
//_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5
|
|
//_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16
|
|
//_TessMin( "Tess Min Distance", Float ) = 10
|
|
//_TessMax( "Tess Max Distance", Float ) = 25
|
|
//_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16
|
|
//_TessMaxDisp( "Tess Max Displacement", Float ) = 25
|
|
}
|
|
|
|
SubShader
|
|
{
|
|
LOD 0
|
|
|
|
|
|
Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Transparent" "Queue"="Transparent" }
|
|
|
|
Cull Back
|
|
HLSLINCLUDE
|
|
#pragma target 3.0
|
|
|
|
float4 FixedTess( float tessValue )
|
|
{
|
|
return tessValue;
|
|
}
|
|
|
|
float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos )
|
|
{
|
|
float3 wpos = mul(o2w,vertex).xyz;
|
|
float dist = distance (wpos, cameraPos);
|
|
float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess;
|
|
return f;
|
|
}
|
|
|
|
float4 CalcTriEdgeTessFactors (float3 triVertexFactors)
|
|
{
|
|
float4 tess;
|
|
tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z);
|
|
tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z);
|
|
tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y);
|
|
tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f;
|
|
return tess;
|
|
}
|
|
|
|
float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams )
|
|
{
|
|
float dist = distance (0.5 * (wpos0+wpos1), cameraPos);
|
|
float len = distance(wpos0, wpos1);
|
|
float f = max(len * scParams.y / (edgeLen * dist), 1.0);
|
|
return f;
|
|
}
|
|
|
|
float DistanceFromPlane (float3 pos, float4 plane)
|
|
{
|
|
float d = dot (float4(pos,1.0f), plane);
|
|
return d;
|
|
}
|
|
|
|
bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] )
|
|
{
|
|
float4 planeTest;
|
|
planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) +
|
|
(( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) +
|
|
(( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f );
|
|
planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) +
|
|
(( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) +
|
|
(( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f );
|
|
planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) +
|
|
(( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) +
|
|
(( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f );
|
|
planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) +
|
|
(( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) +
|
|
(( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f );
|
|
return !all (planeTest);
|
|
}
|
|
|
|
float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos )
|
|
{
|
|
float3 f;
|
|
f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos);
|
|
f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos);
|
|
f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos);
|
|
|
|
return CalcTriEdgeTessFactors (f);
|
|
}
|
|
|
|
float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams )
|
|
{
|
|
float3 pos0 = mul(o2w,v0).xyz;
|
|
float3 pos1 = mul(o2w,v1).xyz;
|
|
float3 pos2 = mul(o2w,v2).xyz;
|
|
float4 tess;
|
|
tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams);
|
|
tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams);
|
|
tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams);
|
|
tess.w = (tess.x + tess.y + tess.z) / 3.0f;
|
|
return tess;
|
|
}
|
|
|
|
float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] )
|
|
{
|
|
float3 pos0 = mul(o2w,v0).xyz;
|
|
float3 pos1 = mul(o2w,v1).xyz;
|
|
float3 pos2 = mul(o2w,v2).xyz;
|
|
float4 tess;
|
|
|
|
if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes))
|
|
{
|
|
tess = 0.0f;
|
|
}
|
|
else
|
|
{
|
|
tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams);
|
|
tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams);
|
|
tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams);
|
|
tess.w = (tess.x + tess.y + tess.z) / 3.0f;
|
|
}
|
|
return tess;
|
|
}
|
|
ENDHLSL
|
|
|
|
|
|
Pass
|
|
{
|
|
Name "Main Pass"
|
|
|
|
|
|
Blend One Zero
|
|
Cull Back
|
|
ZWrite On
|
|
ZTest LEqual
|
|
Offset 0 , 0
|
|
ColorMask RGBA
|
|
|
|
|
|
HLSLPROGRAM
|
|
#pragma multi_compile_instancing
|
|
#define ASE_SRP_VERSION 70301
|
|
#define REQUIRE_OPAQUE_TEXTURE 1
|
|
|
|
#pragma prefer_hlslcc gles
|
|
#pragma exclude_renderers d3d11_9x
|
|
|
|
#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"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
|
|
|
|
#if ASE_SRP_VERSION <= 70108
|
|
#define REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR
|
|
#endif
|
|
|
|
#define ASE_NEEDS_VERT_NORMAL
|
|
#define ASE_NEEDS_FRAG_WORLD_POSITION
|
|
#define ASE_NEEDS_FRAG_SHADOWCOORDS
|
|
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
|
|
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
|
|
#pragma multi_compile _ _SHADOWS_SOFT
|
|
#pragma multi_compile _ DIRLIGHTMAP_COMBINED
|
|
#pragma multi_compile _ LIGHTMAP_ON
|
|
#pragma shader_feature_local _ENABLESPECULARLIGHT_ON
|
|
#pragma shader_feature_local _MAPCONTRIBUTION_NONE _MAPCONTRIBUTION_NORMALMAP _MAPCONTRIBUTION_DETAILMAP _MAPCONTRIBUTION_BOTH
|
|
#pragma shader_feature_local _DUPLICATEDETAILS_ON
|
|
#pragma shader_feature_local _UVSCREENPROJECTION_UVPROJECTION _UVSCREENPROJECTION_SCREENPROJECTION
|
|
#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
|
|
#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
|
|
|
|
|
|
struct VertexInput
|
|
{
|
|
float4 vertex : POSITION;
|
|
float3 ase_normal : NORMAL;
|
|
float4 ase_texcoord : TEXCOORD0;
|
|
float4 ase_tangent : TANGENT;
|
|
float4 texcoord1 : TEXCOORD1;
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct VertexOutput
|
|
{
|
|
float4 clipPos : SV_POSITION;
|
|
#if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
|
|
float3 worldPos : TEXCOORD0;
|
|
#endif
|
|
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
|
|
float4 shadowCoord : TEXCOORD1;
|
|
#endif
|
|
#ifdef ASE_FOG
|
|
float fogFactor : TEXCOORD2;
|
|
#endif
|
|
float4 ase_texcoord3 : TEXCOORD3;
|
|
float4 ase_texcoord4 : TEXCOORD4;
|
|
float4 ase_texcoord5 : TEXCOORD5;
|
|
float4 ase_texcoord6 : TEXCOORD6;
|
|
float4 lightmapUVOrVertexSH : TEXCOORD7;
|
|
float4 ase_texcoord8 : TEXCOORD8;
|
|
float4 ase_texcoord9 : TEXCOORD9;
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _Color;
|
|
float4 _MainTex_ST;
|
|
float4 _BumpMap_ST;
|
|
float4 _DetailMap_ST;
|
|
float4 _FresnelColor;
|
|
float4 _FillColorBackground;
|
|
float _MinValueAmplitude;
|
|
float _MaxValueAmplitude;
|
|
float _DetailScale;
|
|
float _FresnelPower;
|
|
float _FresnelIntensity;
|
|
float _FresnelBias;
|
|
float _Invert;
|
|
float _Opacity;
|
|
float _Refraction;
|
|
float _AmplitudeSpeed;
|
|
float _SpreadDetailMap;
|
|
float _RotationAngle;
|
|
float _RotationSpeed;
|
|
float _TexturesScale;
|
|
float _TranslationSpeed;
|
|
float _ContrastDetailMap;
|
|
float _SelfIllumination;
|
|
float _Glossiness;
|
|
float _BumpScale;
|
|
float _DesaturateBackground;
|
|
float _ShadowOpacity;
|
|
#ifdef TESSELLATION_ON
|
|
float _TessPhongStrength;
|
|
float _TessValue;
|
|
float _TessMin;
|
|
float _TessMax;
|
|
float _TessEdgeLength;
|
|
float _TessMaxDisp;
|
|
#endif
|
|
CBUFFER_END
|
|
sampler2D _MainTex;
|
|
sampler2D _BumpMap;
|
|
sampler2D _DetailMap;
|
|
|
|
|
|
float3 AdditionalLightsLambert( float3 WorldPosition , float3 WorldNormal )
|
|
{
|
|
float3 Color = 0;
|
|
#ifdef _ADDITIONAL_LIGHTS
|
|
int numLights = GetAdditionalLightsCount();
|
|
for(int i = 0; i<numLights;i++)
|
|
{
|
|
Light light = GetAdditionalLight(i, WorldPosition);
|
|
half3 AttLightColor = light.color *(light.distanceAttenuation * light.shadowAttenuation);
|
|
Color +=LightingLambert(AttLightColor, light.direction, WorldNormal);
|
|
|
|
}
|
|
#endif
|
|
return Color;
|
|
}
|
|
|
|
float3 ASEIndirectDiffuse( float2 uvStaticLightmap, float3 normalWS )
|
|
{
|
|
#ifdef LIGHTMAP_ON
|
|
return SampleLightmap( uvStaticLightmap, normalWS );
|
|
#else
|
|
return SampleSH(normalWS);
|
|
#endif
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
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 );
|
|
}
|
|
|
|
VertexOutput VertexFunction( VertexInput v )
|
|
{
|
|
VertexOutput o = (VertexOutput)0;
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|
|
|
float3 ase_worldTangent = TransformObjectToWorldDir(v.ase_tangent.xyz);
|
|
o.ase_texcoord4.xyz = ase_worldTangent;
|
|
float3 ase_worldNormal = TransformObjectToWorldNormal(v.ase_normal);
|
|
o.ase_texcoord5.xyz = ase_worldNormal;
|
|
float ase_vertexTangentSign = v.ase_tangent.w * unity_WorldTransformParams.w;
|
|
float3 ase_worldBitangent = cross( ase_worldNormal, ase_worldTangent ) * ase_vertexTangentSign;
|
|
o.ase_texcoord6.xyz = ase_worldBitangent;
|
|
OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy );
|
|
OUTPUT_SH( ase_worldNormal, o.lightmapUVOrVertexSH.xyz );
|
|
float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz);
|
|
float4 screenPos = ComputeScreenPos(ase_clipPos);
|
|
o.ase_texcoord8 = screenPos;
|
|
|
|
o.ase_texcoord3.xy = v.ase_texcoord.xy;
|
|
o.ase_texcoord9 = v.vertex;
|
|
|
|
//setting value to unused interpolator channels and avoid initialization warnings
|
|
o.ase_texcoord3.zw = 0;
|
|
o.ase_texcoord4.w = 0;
|
|
o.ase_texcoord5.w = 0;
|
|
o.ase_texcoord6.w = 0;
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
float3 defaultVertexValue = v.vertex.xyz;
|
|
#else
|
|
float3 defaultVertexValue = float3(0, 0, 0);
|
|
#endif
|
|
float3 vertexValue = defaultVertexValue;
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
v.vertex.xyz = vertexValue;
|
|
#else
|
|
v.vertex.xyz += vertexValue;
|
|
#endif
|
|
v.ase_normal = v.ase_normal;
|
|
|
|
float3 positionWS = TransformObjectToWorld( v.vertex.xyz );
|
|
float4 positionCS = TransformWorldToHClip( positionWS );
|
|
|
|
#if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
|
|
o.worldPos = positionWS;
|
|
#endif
|
|
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
|
|
VertexPositionInputs vertexInput = (VertexPositionInputs)0;
|
|
vertexInput.positionWS = positionWS;
|
|
vertexInput.positionCS = positionCS;
|
|
o.shadowCoord = GetShadowCoord( vertexInput );
|
|
#endif
|
|
#ifdef ASE_FOG
|
|
o.fogFactor = ComputeFogFactor( positionCS.z );
|
|
#endif
|
|
o.clipPos = positionCS;
|
|
return o;
|
|
}
|
|
|
|
#if defined(TESSELLATION_ON)
|
|
struct VertexControl
|
|
{
|
|
float4 vertex : INTERNALTESSPOS;
|
|
float3 ase_normal : NORMAL;
|
|
float4 ase_texcoord : TEXCOORD0;
|
|
float4 ase_tangent : TANGENT;
|
|
float4 texcoord1 : TEXCOORD1;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct TessellationFactors
|
|
{
|
|
float edge[3] : SV_TessFactor;
|
|
float inside : SV_InsideTessFactor;
|
|
};
|
|
|
|
VertexControl vert ( VertexInput v )
|
|
{
|
|
VertexControl o;
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|
o.vertex = v.vertex;
|
|
o.ase_normal = v.ase_normal;
|
|
o.ase_texcoord = v.ase_texcoord;
|
|
o.ase_tangent = v.ase_tangent;
|
|
o.texcoord1 = v.texcoord1;
|
|
return o;
|
|
}
|
|
|
|
TessellationFactors TessellationFunction (InputPatch<VertexControl,3> v)
|
|
{
|
|
TessellationFactors o;
|
|
float4 tf = 1;
|
|
float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax;
|
|
float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp;
|
|
#if defined(ASE_FIXED_TESSELLATION)
|
|
tf = FixedTess( tessValue );
|
|
#elif defined(ASE_DISTANCE_TESSELLATION)
|
|
tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos );
|
|
#elif defined(ASE_LENGTH_TESSELLATION)
|
|
tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams );
|
|
#elif defined(ASE_LENGTH_CULL_TESSELLATION)
|
|
tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes );
|
|
#endif
|
|
o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w;
|
|
return o;
|
|
}
|
|
|
|
[domain("tri")]
|
|
[partitioning("fractional_odd")]
|
|
[outputtopology("triangle_cw")]
|
|
[patchconstantfunc("TessellationFunction")]
|
|
[outputcontrolpoints(3)]
|
|
VertexControl HullFunction(InputPatch<VertexControl, 3> patch, uint id : SV_OutputControlPointID)
|
|
{
|
|
return patch[id];
|
|
}
|
|
|
|
[domain("tri")]
|
|
VertexOutput DomainFunction(TessellationFactors factors, OutputPatch<VertexControl, 3> patch, float3 bary : SV_DomainLocation)
|
|
{
|
|
VertexInput o = (VertexInput) 0;
|
|
o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z;
|
|
o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z;
|
|
o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z;
|
|
o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z;
|
|
o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z;
|
|
#if defined(ASE_PHONG_TESSELLATION)
|
|
float3 pp[3];
|
|
for (int i = 0; i < 3; ++i)
|
|
pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal));
|
|
float phongStrength = _TessPhongStrength;
|
|
o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz;
|
|
#endif
|
|
UNITY_TRANSFER_INSTANCE_ID(patch[0], o);
|
|
return VertexFunction(o);
|
|
}
|
|
#else
|
|
VertexOutput vert ( VertexInput v )
|
|
{
|
|
return VertexFunction( v );
|
|
}
|
|
#endif
|
|
|
|
half4 frag ( VertexOutput IN ) : SV_Target
|
|
{
|
|
UNITY_SETUP_INSTANCE_ID( IN );
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN );
|
|
|
|
#if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
|
|
float3 WorldPosition = IN.worldPos;
|
|
#endif
|
|
float4 ShadowCoords = float4( 0, 0, 0, 0 );
|
|
|
|
#if defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
|
|
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)
|
|
ShadowCoords = IN.shadowCoord;
|
|
#elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)
|
|
ShadowCoords = TransformWorldToShadowCoord( WorldPosition );
|
|
#endif
|
|
#endif
|
|
float2 uv0_MainTex = IN.ase_texcoord3.xy * _MainTex_ST.xy + _MainTex_ST.zw;
|
|
float2 uv0_BumpMap = float4(IN.ase_texcoord3.xy,0,0).xy * _BumpMap_ST.xy + _BumpMap_ST.zw;
|
|
float3 NormalmapXYZ536 = UnpackNormalScale( tex2D( _BumpMap, uv0_BumpMap ), _BumpScale );
|
|
float3 ase_worldTangent = IN.ase_texcoord4.xyz;
|
|
float3 ase_worldNormal = IN.ase_texcoord5.xyz;
|
|
float3 ase_worldBitangent = IN.ase_texcoord6.xyz;
|
|
float3 tanToWorld0 = float3( ase_worldTangent.x, ase_worldBitangent.x, ase_worldNormal.x );
|
|
float3 tanToWorld1 = float3( ase_worldTangent.y, ase_worldBitangent.y, ase_worldNormal.y );
|
|
float3 tanToWorld2 = float3( ase_worldTangent.z, ase_worldBitangent.z, ase_worldNormal.z );
|
|
float3 tanNormal539 = NormalmapXYZ536;
|
|
float3 worldNormal539 = float3(dot(tanToWorld0,tanNormal539), dot(tanToWorld1,tanNormal539), dot(tanToWorld2,tanNormal539));
|
|
float dotResult540 = dot( worldNormal539 , _MainLightPosition.xyz );
|
|
float ase_lightAtten = 0;
|
|
Light ase_lightAtten_mainLight = GetMainLight( ShadowCoords );
|
|
ase_lightAtten = ase_lightAtten_mainLight.distanceAttenuation * ase_lightAtten_mainLight.shadowAttenuation;
|
|
float3 WorldPosition5_g1 = WorldPosition;
|
|
float3 tanNormal12_g1 = NormalmapXYZ536;
|
|
float3 worldNormal12_g1 = float3(dot(tanToWorld0,tanNormal12_g1), dot(tanToWorld1,tanNormal12_g1), dot(tanToWorld2,tanNormal12_g1));
|
|
float3 WorldNormal5_g1 = worldNormal12_g1;
|
|
float3 localAdditionalLightsLambert5_g1 = AdditionalLightsLambert( WorldPosition5_g1 , WorldNormal5_g1 );
|
|
float3 tanNormal550 = NormalmapXYZ536;
|
|
float3 bakedGI550 = ASEIndirectDiffuse( IN.lightmapUVOrVertexSH.xy, float3(dot(tanToWorld0,tanNormal550), dot(tanToWorld1,tanNormal550), dot(tanToWorld2,tanNormal550)));
|
|
float3 ase_worldViewDir = ( _WorldSpaceCameraPos.xyz - WorldPosition );
|
|
ase_worldViewDir = normalize(ase_worldViewDir);
|
|
float3 tanNormal557 = NormalmapXYZ536;
|
|
half3 reflectVector557 = reflect( -ase_worldViewDir, float3(dot(tanToWorld0,tanNormal557), dot(tanToWorld1,tanNormal557), dot(tanToWorld2,tanNormal557)) );
|
|
float3 indirectSpecular557 = GlossyEnvironmentReflection( reflectVector557, 1.0 - _Glossiness, 1.0 );
|
|
float3 tanNormal548 = NormalmapXYZ536;
|
|
float fresnelNdotV548 = dot( float3(dot(tanToWorld0,tanNormal548), dot(tanToWorld1,tanNormal548), dot(tanToWorld2,tanNormal548)), ase_worldViewDir );
|
|
float fresnelNode548 = ( 0.04 + 1.0 * pow( 1.0 - fresnelNdotV548, 1.11 ) );
|
|
float clampResult552 = clamp( fresnelNode548 , 0.0 , 1.0 );
|
|
#ifdef _ENABLESPECULARLIGHT_ON
|
|
float staticSwitch556 = clampResult552;
|
|
#else
|
|
float staticSwitch556 = 0.0;
|
|
#endif
|
|
float4 lerpResult559 = lerp( ( ( _Color * tex2D( _MainTex, uv0_MainTex ) ) * float4( ( ( ( max( dotResult540 , 0.0 ) * ( ase_lightAtten * _MainLightColor.rgb ) ) + localAdditionalLightsLambert5_g1 ) + bakedGI550 ) , 0.0 ) ) , float4( indirectSpecular557 , 0.0 ) , staticSwitch556);
|
|
float4 CustomLight560 = lerpResult559;
|
|
float4 screenPos = IN.ase_texcoord8;
|
|
float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos );
|
|
float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w;
|
|
float3 normalizedWorldNormal = normalize( ase_worldNormal );
|
|
float3 temp_output_271_0 = mul( float4( normalizedWorldNormal , 0.0 ), UNITY_MATRIX_V ).xyz;
|
|
float3 temp_output_272_0 = ( temp_output_271_0 + NormalmapXYZ536 );
|
|
float TranslationSpeed329 = _TranslationSpeed;
|
|
float2 temp_cast_14 = (TranslationSpeed329).xx;
|
|
float2 uv0_DetailMap = float4(IN.ase_texcoord3.xy,0,0).xy * _DetailMap_ST.xy + _DetailMap_ST.zw;
|
|
float TexturesScale451 = _TexturesScale;
|
|
float4 unityObjectToClipPos420 = TransformWorldToHClip(TransformObjectToWorld(IN.ase_texcoord9.xyz));
|
|
float4 computeScreenPos421 = ComputeScreenPos( unityObjectToClipPos420 );
|
|
float4 unityObjectToClipPos437 = TransformWorldToHClip(TransformObjectToWorld(float3(0,0,0)));
|
|
float4 computeScreenPos438 = ComputeScreenPos( unityObjectToClipPos437 );
|
|
float4 transform428 = mul(GetObjectToWorldMatrix(),float4( WorldPosition , 0.0 ));
|
|
float4 WorldProjection345 = ( ( ( ( computeScreenPos421 / (computeScreenPos421).w ) - ( computeScreenPos438 / (computeScreenPos438).w ) ) * _TexturesScale ) * distance( ( float4( _WorldSpaceCameraPos , 0.0 ) - transform428 ) , float4( 0,0,0,0 ) ) );
|
|
#if defined(_UVSCREENPROJECTION_UVPROJECTION)
|
|
float4 staticSwitch394 = float4( ( uv0_DetailMap * TexturesScale451 ), 0.0 , 0.0 );
|
|
#elif defined(_UVSCREENPROJECTION_SCREENPROJECTION)
|
|
float4 staticSwitch394 = WorldProjection345;
|
|
#else
|
|
float4 staticSwitch394 = float4( ( uv0_DetailMap * TexturesScale451 ), 0.0 , 0.0 );
|
|
#endif
|
|
float RotationSpeed330 = _RotationSpeed;
|
|
float mulTime304 = _TimeParameters.x * RotationSpeed330;
|
|
float RotationAngle331 = _RotationAngle;
|
|
float cos301 = cos( ( mulTime304 + radians( RotationAngle331 ) ) );
|
|
float sin301 = sin( ( mulTime304 + radians( RotationAngle331 ) ) );
|
|
float2 rotator301 = mul( staticSwitch394.xy - float2( 0.5,0.5 ) , float2x2( cos301 , -sin301 , sin301 , cos301 )) + float2( 0.5,0.5 );
|
|
float2 panner282 = ( ( _TimeParameters.x * 0.05 ) * temp_cast_14 + rotator301);
|
|
float4 tex2DNode295 = tex2D( _DetailMap, panner282 );
|
|
float2 temp_cast_20 = (-TranslationSpeed329).xx;
|
|
float mulTime317 = _TimeParameters.x * -RotationSpeed330;
|
|
float cos322 = cos( ( mulTime317 + radians( -RotationAngle331 ) ) );
|
|
float sin322 = sin( ( mulTime317 + radians( -RotationAngle331 ) ) );
|
|
float2 rotator322 = mul( staticSwitch394.xy - float2( 0.5,0.5 ) , float2x2( cos322 , -sin322 , sin322 , cos322 )) + float2( 0.5,0.5 );
|
|
float2 panner325 = ( ( _TimeParameters.x * 0.05 ) * temp_cast_20 + rotator322);
|
|
#ifdef _DUPLICATEDETAILS_ON
|
|
float4 staticSwitch341 = ( CalculateContrast(_ContrastDetailMap,( tex2D( _DetailMap, ( 1.0 - panner325 ) ) + tex2DNode295 )) + _SpreadDetailMap );
|
|
#else
|
|
float4 staticSwitch341 = ( CalculateContrast(( _ContrastDetailMap * 1.25 ),tex2DNode295) + _SpreadDetailMap );
|
|
#endif
|
|
float4 NoiseMapRefraction484 = staticSwitch341;
|
|
float4 temp_output_482_0 = ( float4( temp_output_271_0 , 0.0 ) + NoiseMapRefraction484 );
|
|
#if defined(_MAPCONTRIBUTION_NONE)
|
|
float4 staticSwitch480 = float4( temp_output_271_0 , 0.0 );
|
|
#elif defined(_MAPCONTRIBUTION_NORMALMAP)
|
|
float4 staticSwitch480 = float4( temp_output_272_0 , 0.0 );
|
|
#elif defined(_MAPCONTRIBUTION_DETAILMAP)
|
|
float4 staticSwitch480 = temp_output_482_0;
|
|
#elif defined(_MAPCONTRIBUTION_BOTH)
|
|
float4 staticSwitch480 = ( float4( temp_output_272_0 , 0.0 ) + temp_output_482_0 );
|
|
#else
|
|
float4 staticSwitch480 = float4( temp_output_271_0 , 0.0 );
|
|
#endif
|
|
float4 fetchOpaqueVal15 = float4( SHADERGRAPH_SAMPLE_SCENE_COLOR( ( (ase_grabScreenPosNorm).xyzw + (( staticSwitch480 * (-1.0 + (_Refraction - 0.0) * (1.0 - -1.0) / (2.0 - 0.0)) )).rgba ).xy ), 1.0 );
|
|
float3 desaturateInitialColor278 = fetchOpaqueVal15.rgb;
|
|
float desaturateDot278 = dot( desaturateInitialColor278, float3( 0.299, 0.587, 0.114 ));
|
|
float3 desaturateVar278 = lerp( desaturateInitialColor278, desaturateDot278.xxx, _DesaturateBackground );
|
|
float OpacitySlider208 = ( 1.0 - _Opacity );
|
|
float4 lerpResult258 = lerp( float4( desaturateVar278 , 0.0 ) , _FillColorBackground , OpacitySlider208);
|
|
float4 GrabSreenRefraction16 = lerpResult258;
|
|
float clampResult80 = clamp( _FresnelIntensity , 0.0 , 200.0 );
|
|
float fresnelNdotV72 = dot( ase_worldNormal, ase_worldViewDir );
|
|
float fresnelNode72 = ( _FresnelBias + clampResult80 * pow( 1.0 - fresnelNdotV72, _FresnelPower ) );
|
|
float4 NoiseMap288 = ( staticSwitch341 * _DetailScale );
|
|
float mulTime527 = _TimeParameters.x * _AmplitudeSpeed;
|
|
float lerpResult531 = lerp( _MaxValueAmplitude , _MinValueAmplitude , sin( mulTime527 ));
|
|
float4 clampResult35 = clamp( ( (( _Invert )?( ( 1.0 - fresnelNode72 ) ):( fresnelNode72 )) * NoiseMap288 * lerpResult531 ) , float4( 0,0,0,0 ) , float4( 1,1,1,0 ) );
|
|
float4 FresnelMask197 = clampResult35;
|
|
float4 lerpResult225 = lerp( GrabSreenRefraction16 , _FresnelColor , FresnelMask197);
|
|
float4 Emission263 = ( _SelfIllumination * lerpResult225 );
|
|
float4 temp_output_566_0 = ( CustomLight560 + Emission263 );
|
|
|
|
float Opacity250 = (0.5 + (( 1.0 - _ShadowOpacity ) - 0.0) * (1.0 - 0.5) / (1.0 - 0.0));
|
|
|
|
float3 Color = temp_output_566_0.rgb;
|
|
float Alpha = Opacity250;
|
|
float AlphaClipThreshold = 0.5;
|
|
|
|
#ifdef _ALPHATEST_ON
|
|
clip( Alpha - AlphaClipThreshold );
|
|
#endif
|
|
|
|
#ifdef LOD_FADE_CROSSFADE
|
|
LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x );
|
|
#endif
|
|
|
|
#ifdef ASE_FOG
|
|
Color = MixFog( Color, IN.fogFactor );
|
|
#endif
|
|
|
|
return half4( Color, Alpha );
|
|
}
|
|
|
|
ENDHLSL
|
|
}
|
|
|
|
|
|
Pass
|
|
{
|
|
|
|
Name "Forward"
|
|
Tags { "LightMode"="UniversalForward" }
|
|
|
|
Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha
|
|
ZWrite On
|
|
ZTest Always
|
|
Offset 0 , 0
|
|
ColorMask RGBA
|
|
|
|
|
|
HLSLPROGRAM
|
|
#pragma multi_compile_instancing
|
|
#define ASE_SRP_VERSION 70301
|
|
#define REQUIRE_OPAQUE_TEXTURE 1
|
|
|
|
#pragma prefer_hlslcc gles
|
|
#pragma exclude_renderers d3d11_9x
|
|
|
|
#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"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
|
|
|
|
#if ASE_SRP_VERSION <= 70108
|
|
#define REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR
|
|
#endif
|
|
|
|
#define ASE_NEEDS_VERT_NORMAL
|
|
#define ASE_NEEDS_FRAG_WORLD_POSITION
|
|
#define ASE_NEEDS_FRAG_SHADOWCOORDS
|
|
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
|
|
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
|
|
#pragma multi_compile _ _SHADOWS_SOFT
|
|
#pragma multi_compile _ DIRLIGHTMAP_COMBINED
|
|
#pragma multi_compile _ LIGHTMAP_ON
|
|
#pragma shader_feature_local _ENABLESPECULARLIGHT_ON
|
|
#pragma shader_feature_local _MAPCONTRIBUTION_NONE _MAPCONTRIBUTION_NORMALMAP _MAPCONTRIBUTION_DETAILMAP _MAPCONTRIBUTION_BOTH
|
|
#pragma shader_feature_local _DUPLICATEDETAILS_ON
|
|
#pragma shader_feature_local _UVSCREENPROJECTION_UVPROJECTION _UVSCREENPROJECTION_SCREENPROJECTION
|
|
#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
|
|
#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
|
|
|
|
|
|
struct VertexInput
|
|
{
|
|
float4 vertex : POSITION;
|
|
float3 ase_normal : NORMAL;
|
|
float4 ase_texcoord : TEXCOORD0;
|
|
float4 ase_tangent : TANGENT;
|
|
float4 texcoord1 : TEXCOORD1;
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct VertexOutput
|
|
{
|
|
float4 clipPos : SV_POSITION;
|
|
#if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
|
|
float3 worldPos : TEXCOORD0;
|
|
#endif
|
|
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
|
|
float4 shadowCoord : TEXCOORD1;
|
|
#endif
|
|
#ifdef ASE_FOG
|
|
float fogFactor : TEXCOORD2;
|
|
#endif
|
|
float4 ase_texcoord3 : TEXCOORD3;
|
|
float4 ase_texcoord4 : TEXCOORD4;
|
|
float4 ase_texcoord5 : TEXCOORD5;
|
|
float4 ase_texcoord6 : TEXCOORD6;
|
|
float4 lightmapUVOrVertexSH : TEXCOORD7;
|
|
float4 ase_texcoord8 : TEXCOORD8;
|
|
float4 ase_texcoord9 : TEXCOORD9;
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _Color;
|
|
float4 _MainTex_ST;
|
|
float4 _BumpMap_ST;
|
|
float4 _DetailMap_ST;
|
|
float4 _FresnelColor;
|
|
float4 _FillColorBackground;
|
|
float _MinValueAmplitude;
|
|
float _MaxValueAmplitude;
|
|
float _DetailScale;
|
|
float _FresnelPower;
|
|
float _FresnelIntensity;
|
|
float _FresnelBias;
|
|
float _Invert;
|
|
float _Opacity;
|
|
float _Refraction;
|
|
float _AmplitudeSpeed;
|
|
float _SpreadDetailMap;
|
|
float _RotationAngle;
|
|
float _RotationSpeed;
|
|
float _TexturesScale;
|
|
float _TranslationSpeed;
|
|
float _ContrastDetailMap;
|
|
float _SelfIllumination;
|
|
float _Glossiness;
|
|
float _BumpScale;
|
|
float _DesaturateBackground;
|
|
float _ShadowOpacity;
|
|
#ifdef TESSELLATION_ON
|
|
float _TessPhongStrength;
|
|
float _TessValue;
|
|
float _TessMin;
|
|
float _TessMax;
|
|
float _TessEdgeLength;
|
|
float _TessMaxDisp;
|
|
#endif
|
|
CBUFFER_END
|
|
sampler2D _MainTex;
|
|
sampler2D _BumpMap;
|
|
sampler2D _DetailMap;
|
|
|
|
|
|
float3 AdditionalLightsLambert( float3 WorldPosition , float3 WorldNormal )
|
|
{
|
|
float3 Color = 0;
|
|
#ifdef _ADDITIONAL_LIGHTS
|
|
int numLights = GetAdditionalLightsCount();
|
|
for(int i = 0; i<numLights;i++)
|
|
{
|
|
Light light = GetAdditionalLight(i, WorldPosition);
|
|
half3 AttLightColor = light.color *(light.distanceAttenuation * light.shadowAttenuation);
|
|
Color +=LightingLambert(AttLightColor, light.direction, WorldNormal);
|
|
|
|
}
|
|
#endif
|
|
return Color;
|
|
}
|
|
|
|
float3 ASEIndirectDiffuse( float2 uvStaticLightmap, float3 normalWS )
|
|
{
|
|
#ifdef LIGHTMAP_ON
|
|
return SampleLightmap( uvStaticLightmap, normalWS );
|
|
#else
|
|
return SampleSH(normalWS);
|
|
#endif
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
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 );
|
|
}
|
|
|
|
VertexOutput VertexFunction ( VertexInput v )
|
|
{
|
|
VertexOutput o = (VertexOutput)0;
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|
|
|
float3 ase_worldTangent = TransformObjectToWorldDir(v.ase_tangent.xyz);
|
|
o.ase_texcoord4.xyz = ase_worldTangent;
|
|
float3 ase_worldNormal = TransformObjectToWorldNormal(v.ase_normal);
|
|
o.ase_texcoord5.xyz = ase_worldNormal;
|
|
float ase_vertexTangentSign = v.ase_tangent.w * unity_WorldTransformParams.w;
|
|
float3 ase_worldBitangent = cross( ase_worldNormal, ase_worldTangent ) * ase_vertexTangentSign;
|
|
o.ase_texcoord6.xyz = ase_worldBitangent;
|
|
OUTPUT_LIGHTMAP_UV( v.texcoord1, unity_LightmapST, o.lightmapUVOrVertexSH.xy );
|
|
OUTPUT_SH( ase_worldNormal, o.lightmapUVOrVertexSH.xyz );
|
|
float4 ase_clipPos = TransformObjectToHClip((v.vertex).xyz);
|
|
float4 screenPos = ComputeScreenPos(ase_clipPos);
|
|
o.ase_texcoord8 = screenPos;
|
|
|
|
o.ase_texcoord3.xy = v.ase_texcoord.xy;
|
|
o.ase_texcoord9 = v.vertex;
|
|
|
|
//setting value to unused interpolator channels and avoid initialization warnings
|
|
o.ase_texcoord3.zw = 0;
|
|
o.ase_texcoord4.w = 0;
|
|
o.ase_texcoord5.w = 0;
|
|
o.ase_texcoord6.w = 0;
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
float3 defaultVertexValue = v.vertex.xyz;
|
|
#else
|
|
float3 defaultVertexValue = float3(0, 0, 0);
|
|
#endif
|
|
float3 vertexValue = defaultVertexValue;
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
v.vertex.xyz = vertexValue;
|
|
#else
|
|
v.vertex.xyz += vertexValue;
|
|
#endif
|
|
v.ase_normal = v.ase_normal;
|
|
|
|
float3 positionWS = TransformObjectToWorld( v.vertex.xyz );
|
|
float4 positionCS = TransformWorldToHClip( positionWS );
|
|
|
|
#if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
|
|
o.worldPos = positionWS;
|
|
#endif
|
|
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
|
|
VertexPositionInputs vertexInput = (VertexPositionInputs)0;
|
|
vertexInput.positionWS = positionWS;
|
|
vertexInput.positionCS = positionCS;
|
|
o.shadowCoord = GetShadowCoord( vertexInput );
|
|
#endif
|
|
#ifdef ASE_FOG
|
|
o.fogFactor = ComputeFogFactor( positionCS.z );
|
|
#endif
|
|
o.clipPos = positionCS;
|
|
return o;
|
|
}
|
|
|
|
#if defined(TESSELLATION_ON)
|
|
struct VertexControl
|
|
{
|
|
float4 vertex : INTERNALTESSPOS;
|
|
float3 ase_normal : NORMAL;
|
|
float4 ase_texcoord : TEXCOORD0;
|
|
float4 ase_tangent : TANGENT;
|
|
float4 texcoord1 : TEXCOORD1;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct TessellationFactors
|
|
{
|
|
float edge[3] : SV_TessFactor;
|
|
float inside : SV_InsideTessFactor;
|
|
};
|
|
|
|
VertexControl vert ( VertexInput v )
|
|
{
|
|
VertexControl o;
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|
o.vertex = v.vertex;
|
|
o.ase_normal = v.ase_normal;
|
|
o.ase_texcoord = v.ase_texcoord;
|
|
o.ase_tangent = v.ase_tangent;
|
|
o.texcoord1 = v.texcoord1;
|
|
return o;
|
|
}
|
|
|
|
TessellationFactors TessellationFunction (InputPatch<VertexControl,3> v)
|
|
{
|
|
TessellationFactors o;
|
|
float4 tf = 1;
|
|
float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax;
|
|
float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp;
|
|
#if defined(ASE_FIXED_TESSELLATION)
|
|
tf = FixedTess( tessValue );
|
|
#elif defined(ASE_DISTANCE_TESSELLATION)
|
|
tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos );
|
|
#elif defined(ASE_LENGTH_TESSELLATION)
|
|
tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams );
|
|
#elif defined(ASE_LENGTH_CULL_TESSELLATION)
|
|
tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes );
|
|
#endif
|
|
o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w;
|
|
return o;
|
|
}
|
|
|
|
[domain("tri")]
|
|
[partitioning("fractional_odd")]
|
|
[outputtopology("triangle_cw")]
|
|
[patchconstantfunc("TessellationFunction")]
|
|
[outputcontrolpoints(3)]
|
|
VertexControl HullFunction(InputPatch<VertexControl, 3> patch, uint id : SV_OutputControlPointID)
|
|
{
|
|
return patch[id];
|
|
}
|
|
|
|
[domain("tri")]
|
|
VertexOutput DomainFunction(TessellationFactors factors, OutputPatch<VertexControl, 3> patch, float3 bary : SV_DomainLocation)
|
|
{
|
|
VertexInput o = (VertexInput) 0;
|
|
o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z;
|
|
o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z;
|
|
o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z;
|
|
o.ase_tangent = patch[0].ase_tangent * bary.x + patch[1].ase_tangent * bary.y + patch[2].ase_tangent * bary.z;
|
|
o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z;
|
|
#if defined(ASE_PHONG_TESSELLATION)
|
|
float3 pp[3];
|
|
for (int i = 0; i < 3; ++i)
|
|
pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal));
|
|
float phongStrength = _TessPhongStrength;
|
|
o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz;
|
|
#endif
|
|
UNITY_TRANSFER_INSTANCE_ID(patch[0], o);
|
|
return VertexFunction(o);
|
|
}
|
|
#else
|
|
VertexOutput vert ( VertexInput v )
|
|
{
|
|
return VertexFunction( v );
|
|
}
|
|
#endif
|
|
|
|
half4 frag ( VertexOutput IN ) : SV_Target
|
|
{
|
|
UNITY_SETUP_INSTANCE_ID( IN );
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN );
|
|
|
|
#if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
|
|
float3 WorldPosition = IN.worldPos;
|
|
#endif
|
|
float4 ShadowCoords = float4( 0, 0, 0, 0 );
|
|
|
|
#if defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
|
|
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)
|
|
ShadowCoords = IN.shadowCoord;
|
|
#elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)
|
|
ShadowCoords = TransformWorldToShadowCoord( WorldPosition );
|
|
#endif
|
|
#endif
|
|
float2 uv0_MainTex = IN.ase_texcoord3.xy * _MainTex_ST.xy + _MainTex_ST.zw;
|
|
float2 uv0_BumpMap = float4(IN.ase_texcoord3.xy,0,0).xy * _BumpMap_ST.xy + _BumpMap_ST.zw;
|
|
float3 NormalmapXYZ536 = UnpackNormalScale( tex2D( _BumpMap, uv0_BumpMap ), _BumpScale );
|
|
float3 ase_worldTangent = IN.ase_texcoord4.xyz;
|
|
float3 ase_worldNormal = IN.ase_texcoord5.xyz;
|
|
float3 ase_worldBitangent = IN.ase_texcoord6.xyz;
|
|
float3 tanToWorld0 = float3( ase_worldTangent.x, ase_worldBitangent.x, ase_worldNormal.x );
|
|
float3 tanToWorld1 = float3( ase_worldTangent.y, ase_worldBitangent.y, ase_worldNormal.y );
|
|
float3 tanToWorld2 = float3( ase_worldTangent.z, ase_worldBitangent.z, ase_worldNormal.z );
|
|
float3 tanNormal539 = NormalmapXYZ536;
|
|
float3 worldNormal539 = float3(dot(tanToWorld0,tanNormal539), dot(tanToWorld1,tanNormal539), dot(tanToWorld2,tanNormal539));
|
|
float dotResult540 = dot( worldNormal539 , _MainLightPosition.xyz );
|
|
float ase_lightAtten = 0;
|
|
Light ase_lightAtten_mainLight = GetMainLight( ShadowCoords );
|
|
ase_lightAtten = ase_lightAtten_mainLight.distanceAttenuation * ase_lightAtten_mainLight.shadowAttenuation;
|
|
float3 WorldPosition5_g1 = WorldPosition;
|
|
float3 tanNormal12_g1 = NormalmapXYZ536;
|
|
float3 worldNormal12_g1 = float3(dot(tanToWorld0,tanNormal12_g1), dot(tanToWorld1,tanNormal12_g1), dot(tanToWorld2,tanNormal12_g1));
|
|
float3 WorldNormal5_g1 = worldNormal12_g1;
|
|
float3 localAdditionalLightsLambert5_g1 = AdditionalLightsLambert( WorldPosition5_g1 , WorldNormal5_g1 );
|
|
float3 tanNormal550 = NormalmapXYZ536;
|
|
float3 bakedGI550 = ASEIndirectDiffuse( IN.lightmapUVOrVertexSH.xy, float3(dot(tanToWorld0,tanNormal550), dot(tanToWorld1,tanNormal550), dot(tanToWorld2,tanNormal550)));
|
|
float3 ase_worldViewDir = ( _WorldSpaceCameraPos.xyz - WorldPosition );
|
|
ase_worldViewDir = normalize(ase_worldViewDir);
|
|
float3 tanNormal557 = NormalmapXYZ536;
|
|
half3 reflectVector557 = reflect( -ase_worldViewDir, float3(dot(tanToWorld0,tanNormal557), dot(tanToWorld1,tanNormal557), dot(tanToWorld2,tanNormal557)) );
|
|
float3 indirectSpecular557 = GlossyEnvironmentReflection( reflectVector557, 1.0 - _Glossiness, 1.0 );
|
|
float3 tanNormal548 = NormalmapXYZ536;
|
|
float fresnelNdotV548 = dot( float3(dot(tanToWorld0,tanNormal548), dot(tanToWorld1,tanNormal548), dot(tanToWorld2,tanNormal548)), ase_worldViewDir );
|
|
float fresnelNode548 = ( 0.04 + 1.0 * pow( 1.0 - fresnelNdotV548, 1.11 ) );
|
|
float clampResult552 = clamp( fresnelNode548 , 0.0 , 1.0 );
|
|
#ifdef _ENABLESPECULARLIGHT_ON
|
|
float staticSwitch556 = clampResult552;
|
|
#else
|
|
float staticSwitch556 = 0.0;
|
|
#endif
|
|
float4 lerpResult559 = lerp( ( ( _Color * tex2D( _MainTex, uv0_MainTex ) ) * float4( ( ( ( max( dotResult540 , 0.0 ) * ( ase_lightAtten * _MainLightColor.rgb ) ) + localAdditionalLightsLambert5_g1 ) + bakedGI550 ) , 0.0 ) ) , float4( indirectSpecular557 , 0.0 ) , staticSwitch556);
|
|
float4 CustomLight560 = lerpResult559;
|
|
float4 screenPos = IN.ase_texcoord8;
|
|
float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos );
|
|
float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w;
|
|
float3 normalizedWorldNormal = normalize( ase_worldNormal );
|
|
float3 temp_output_271_0 = mul( float4( normalizedWorldNormal , 0.0 ), UNITY_MATRIX_V ).xyz;
|
|
float3 temp_output_272_0 = ( temp_output_271_0 + NormalmapXYZ536 );
|
|
float TranslationSpeed329 = _TranslationSpeed;
|
|
float2 temp_cast_14 = (TranslationSpeed329).xx;
|
|
float2 uv0_DetailMap = float4(IN.ase_texcoord3.xy,0,0).xy * _DetailMap_ST.xy + _DetailMap_ST.zw;
|
|
float TexturesScale451 = _TexturesScale;
|
|
float4 unityObjectToClipPos420 = TransformWorldToHClip(TransformObjectToWorld(IN.ase_texcoord9.xyz));
|
|
float4 computeScreenPos421 = ComputeScreenPos( unityObjectToClipPos420 );
|
|
float4 unityObjectToClipPos437 = TransformWorldToHClip(TransformObjectToWorld(float3(0,0,0)));
|
|
float4 computeScreenPos438 = ComputeScreenPos( unityObjectToClipPos437 );
|
|
float4 transform428 = mul(GetObjectToWorldMatrix(),float4( WorldPosition , 0.0 ));
|
|
float4 WorldProjection345 = ( ( ( ( computeScreenPos421 / (computeScreenPos421).w ) - ( computeScreenPos438 / (computeScreenPos438).w ) ) * _TexturesScale ) * distance( ( float4( _WorldSpaceCameraPos , 0.0 ) - transform428 ) , float4( 0,0,0,0 ) ) );
|
|
#if defined(_UVSCREENPROJECTION_UVPROJECTION)
|
|
float4 staticSwitch394 = float4( ( uv0_DetailMap * TexturesScale451 ), 0.0 , 0.0 );
|
|
#elif defined(_UVSCREENPROJECTION_SCREENPROJECTION)
|
|
float4 staticSwitch394 = WorldProjection345;
|
|
#else
|
|
float4 staticSwitch394 = float4( ( uv0_DetailMap * TexturesScale451 ), 0.0 , 0.0 );
|
|
#endif
|
|
float RotationSpeed330 = _RotationSpeed;
|
|
float mulTime304 = _TimeParameters.x * RotationSpeed330;
|
|
float RotationAngle331 = _RotationAngle;
|
|
float cos301 = cos( ( mulTime304 + radians( RotationAngle331 ) ) );
|
|
float sin301 = sin( ( mulTime304 + radians( RotationAngle331 ) ) );
|
|
float2 rotator301 = mul( staticSwitch394.xy - float2( 0.5,0.5 ) , float2x2( cos301 , -sin301 , sin301 , cos301 )) + float2( 0.5,0.5 );
|
|
float2 panner282 = ( ( _TimeParameters.x * 0.05 ) * temp_cast_14 + rotator301);
|
|
float4 tex2DNode295 = tex2D( _DetailMap, panner282 );
|
|
float2 temp_cast_20 = (-TranslationSpeed329).xx;
|
|
float mulTime317 = _TimeParameters.x * -RotationSpeed330;
|
|
float cos322 = cos( ( mulTime317 + radians( -RotationAngle331 ) ) );
|
|
float sin322 = sin( ( mulTime317 + radians( -RotationAngle331 ) ) );
|
|
float2 rotator322 = mul( staticSwitch394.xy - float2( 0.5,0.5 ) , float2x2( cos322 , -sin322 , sin322 , cos322 )) + float2( 0.5,0.5 );
|
|
float2 panner325 = ( ( _TimeParameters.x * 0.05 ) * temp_cast_20 + rotator322);
|
|
#ifdef _DUPLICATEDETAILS_ON
|
|
float4 staticSwitch341 = ( CalculateContrast(_ContrastDetailMap,( tex2D( _DetailMap, ( 1.0 - panner325 ) ) + tex2DNode295 )) + _SpreadDetailMap );
|
|
#else
|
|
float4 staticSwitch341 = ( CalculateContrast(( _ContrastDetailMap * 1.25 ),tex2DNode295) + _SpreadDetailMap );
|
|
#endif
|
|
float4 NoiseMapRefraction484 = staticSwitch341;
|
|
float4 temp_output_482_0 = ( float4( temp_output_271_0 , 0.0 ) + NoiseMapRefraction484 );
|
|
#if defined(_MAPCONTRIBUTION_NONE)
|
|
float4 staticSwitch480 = float4( temp_output_271_0 , 0.0 );
|
|
#elif defined(_MAPCONTRIBUTION_NORMALMAP)
|
|
float4 staticSwitch480 = float4( temp_output_272_0 , 0.0 );
|
|
#elif defined(_MAPCONTRIBUTION_DETAILMAP)
|
|
float4 staticSwitch480 = temp_output_482_0;
|
|
#elif defined(_MAPCONTRIBUTION_BOTH)
|
|
float4 staticSwitch480 = ( float4( temp_output_272_0 , 0.0 ) + temp_output_482_0 );
|
|
#else
|
|
float4 staticSwitch480 = float4( temp_output_271_0 , 0.0 );
|
|
#endif
|
|
float4 fetchOpaqueVal15 = float4( SHADERGRAPH_SAMPLE_SCENE_COLOR( ( (ase_grabScreenPosNorm).xyzw + (( staticSwitch480 * (-1.0 + (_Refraction - 0.0) * (1.0 - -1.0) / (2.0 - 0.0)) )).rgba ).xy ), 1.0 );
|
|
float3 desaturateInitialColor278 = fetchOpaqueVal15.rgb;
|
|
float desaturateDot278 = dot( desaturateInitialColor278, float3( 0.299, 0.587, 0.114 ));
|
|
float3 desaturateVar278 = lerp( desaturateInitialColor278, desaturateDot278.xxx, _DesaturateBackground );
|
|
float OpacitySlider208 = ( 1.0 - _Opacity );
|
|
float4 lerpResult258 = lerp( float4( desaturateVar278 , 0.0 ) , _FillColorBackground , OpacitySlider208);
|
|
float4 GrabSreenRefraction16 = lerpResult258;
|
|
float clampResult80 = clamp( _FresnelIntensity , 0.0 , 200.0 );
|
|
float fresnelNdotV72 = dot( ase_worldNormal, ase_worldViewDir );
|
|
float fresnelNode72 = ( _FresnelBias + clampResult80 * pow( 1.0 - fresnelNdotV72, _FresnelPower ) );
|
|
float4 NoiseMap288 = ( staticSwitch341 * _DetailScale );
|
|
float mulTime527 = _TimeParameters.x * _AmplitudeSpeed;
|
|
float lerpResult531 = lerp( _MaxValueAmplitude , _MinValueAmplitude , sin( mulTime527 ));
|
|
float4 clampResult35 = clamp( ( (( _Invert )?( ( 1.0 - fresnelNode72 ) ):( fresnelNode72 )) * NoiseMap288 * lerpResult531 ) , float4( 0,0,0,0 ) , float4( 1,1,1,0 ) );
|
|
float4 FresnelMask197 = clampResult35;
|
|
float4 lerpResult225 = lerp( GrabSreenRefraction16 , _FresnelColor , FresnelMask197);
|
|
float4 Emission263 = ( _SelfIllumination * lerpResult225 );
|
|
float4 temp_output_566_0 = ( CustomLight560 + Emission263 );
|
|
|
|
float Opacity250 = (0.5 + (( 1.0 - _ShadowOpacity ) - 0.0) * (1.0 - 0.5) / (1.0 - 0.0));
|
|
|
|
float3 BakedAlbedo = 0;
|
|
float3 BakedEmission = 0;
|
|
float3 Color = temp_output_566_0.rgb;
|
|
float Alpha = Opacity250;
|
|
float AlphaClipThreshold = 0.5;
|
|
|
|
#ifdef _ALPHATEST_ON
|
|
clip( Alpha - AlphaClipThreshold );
|
|
#endif
|
|
|
|
#ifdef LOD_FADE_CROSSFADE
|
|
LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x );
|
|
#endif
|
|
|
|
#ifdef ASE_FOG
|
|
Color = MixFog( Color, IN.fogFactor );
|
|
#endif
|
|
|
|
return half4( Color, Alpha );
|
|
}
|
|
|
|
ENDHLSL
|
|
}
|
|
|
|
|
|
Pass
|
|
{
|
|
|
|
Name "ShadowCaster"
|
|
Tags { "LightMode"="ShadowCaster" }
|
|
|
|
ZWrite On
|
|
ZTest LEqual
|
|
|
|
HLSLPROGRAM
|
|
#pragma multi_compile_instancing
|
|
#define ASE_SRP_VERSION 70301
|
|
|
|
#pragma prefer_hlslcc gles
|
|
#pragma exclude_renderers d3d11_9x
|
|
|
|
#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"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
|
|
#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
|
|
#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
|
|
|
|
|
|
struct VertexInput
|
|
{
|
|
float4 vertex : POSITION;
|
|
float3 ase_normal : NORMAL;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct VertexOutput
|
|
{
|
|
float4 clipPos : SV_POSITION;
|
|
#if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
|
|
float3 worldPos : TEXCOORD0;
|
|
#endif
|
|
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
|
|
float4 shadowCoord : TEXCOORD1;
|
|
#endif
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _Color;
|
|
float4 _MainTex_ST;
|
|
float4 _BumpMap_ST;
|
|
float4 _DetailMap_ST;
|
|
float4 _FresnelColor;
|
|
float4 _FillColorBackground;
|
|
float _MinValueAmplitude;
|
|
float _MaxValueAmplitude;
|
|
float _DetailScale;
|
|
float _FresnelPower;
|
|
float _FresnelIntensity;
|
|
float _FresnelBias;
|
|
float _Invert;
|
|
float _Opacity;
|
|
float _Refraction;
|
|
float _AmplitudeSpeed;
|
|
float _SpreadDetailMap;
|
|
float _RotationAngle;
|
|
float _RotationSpeed;
|
|
float _TexturesScale;
|
|
float _TranslationSpeed;
|
|
float _ContrastDetailMap;
|
|
float _SelfIllumination;
|
|
float _Glossiness;
|
|
float _BumpScale;
|
|
float _DesaturateBackground;
|
|
float _ShadowOpacity;
|
|
#ifdef TESSELLATION_ON
|
|
float _TessPhongStrength;
|
|
float _TessValue;
|
|
float _TessMin;
|
|
float _TessMax;
|
|
float _TessEdgeLength;
|
|
float _TessMaxDisp;
|
|
#endif
|
|
CBUFFER_END
|
|
|
|
|
|
|
|
float3 _LightDirection;
|
|
|
|
VertexOutput VertexFunction( VertexInput v )
|
|
{
|
|
VertexOutput o;
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o );
|
|
|
|
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
float3 defaultVertexValue = v.vertex.xyz;
|
|
#else
|
|
float3 defaultVertexValue = float3(0, 0, 0);
|
|
#endif
|
|
float3 vertexValue = defaultVertexValue;
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
v.vertex.xyz = vertexValue;
|
|
#else
|
|
v.vertex.xyz += vertexValue;
|
|
#endif
|
|
|
|
v.ase_normal = v.ase_normal;
|
|
|
|
float3 positionWS = TransformObjectToWorld( v.vertex.xyz );
|
|
|
|
#if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
|
|
o.worldPos = positionWS;
|
|
#endif
|
|
|
|
float3 normalWS = TransformObjectToWorldDir( v.ase_normal );
|
|
|
|
float4 clipPos = TransformWorldToHClip( ApplyShadowBias( positionWS, normalWS, _LightDirection ) );
|
|
|
|
#if UNITY_REVERSED_Z
|
|
clipPos.z = min(clipPos.z, clipPos.w * UNITY_NEAR_CLIP_VALUE);
|
|
#else
|
|
clipPos.z = max(clipPos.z, clipPos.w * UNITY_NEAR_CLIP_VALUE);
|
|
#endif
|
|
|
|
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
|
|
VertexPositionInputs vertexInput = (VertexPositionInputs)0;
|
|
vertexInput.positionWS = positionWS;
|
|
vertexInput.positionCS = clipPos;
|
|
o.shadowCoord = GetShadowCoord( vertexInput );
|
|
#endif
|
|
o.clipPos = clipPos;
|
|
|
|
return o;
|
|
}
|
|
|
|
#if defined(TESSELLATION_ON)
|
|
struct VertexControl
|
|
{
|
|
float4 vertex : INTERNALTESSPOS;
|
|
float3 ase_normal : NORMAL;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct TessellationFactors
|
|
{
|
|
float edge[3] : SV_TessFactor;
|
|
float inside : SV_InsideTessFactor;
|
|
};
|
|
|
|
VertexControl vert ( VertexInput v )
|
|
{
|
|
VertexControl o;
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|
o.vertex = v.vertex;
|
|
o.ase_normal = v.ase_normal;
|
|
|
|
return o;
|
|
}
|
|
|
|
TessellationFactors TessellationFunction (InputPatch<VertexControl,3> v)
|
|
{
|
|
TessellationFactors o;
|
|
float4 tf = 1;
|
|
float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax;
|
|
float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp;
|
|
#if defined(ASE_FIXED_TESSELLATION)
|
|
tf = FixedTess( tessValue );
|
|
#elif defined(ASE_DISTANCE_TESSELLATION)
|
|
tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos );
|
|
#elif defined(ASE_LENGTH_TESSELLATION)
|
|
tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams );
|
|
#elif defined(ASE_LENGTH_CULL_TESSELLATION)
|
|
tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes );
|
|
#endif
|
|
o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w;
|
|
return o;
|
|
}
|
|
|
|
[domain("tri")]
|
|
[partitioning("fractional_odd")]
|
|
[outputtopology("triangle_cw")]
|
|
[patchconstantfunc("TessellationFunction")]
|
|
[outputcontrolpoints(3)]
|
|
VertexControl HullFunction(InputPatch<VertexControl, 3> patch, uint id : SV_OutputControlPointID)
|
|
{
|
|
return patch[id];
|
|
}
|
|
|
|
[domain("tri")]
|
|
VertexOutput DomainFunction(TessellationFactors factors, OutputPatch<VertexControl, 3> patch, float3 bary : SV_DomainLocation)
|
|
{
|
|
VertexInput o = (VertexInput) 0;
|
|
o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z;
|
|
o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z;
|
|
|
|
#if defined(ASE_PHONG_TESSELLATION)
|
|
float3 pp[3];
|
|
for (int i = 0; i < 3; ++i)
|
|
pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal));
|
|
float phongStrength = _TessPhongStrength;
|
|
o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz;
|
|
#endif
|
|
UNITY_TRANSFER_INSTANCE_ID(patch[0], o);
|
|
return VertexFunction(o);
|
|
}
|
|
#else
|
|
VertexOutput vert ( VertexInput v )
|
|
{
|
|
return VertexFunction( v );
|
|
}
|
|
#endif
|
|
|
|
half4 frag(VertexOutput IN ) : SV_TARGET
|
|
{
|
|
UNITY_SETUP_INSTANCE_ID( IN );
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN );
|
|
|
|
#if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
|
|
float3 WorldPosition = IN.worldPos;
|
|
#endif
|
|
float4 ShadowCoords = float4( 0, 0, 0, 0 );
|
|
|
|
#if defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
|
|
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)
|
|
ShadowCoords = IN.shadowCoord;
|
|
#elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)
|
|
ShadowCoords = TransformWorldToShadowCoord( WorldPosition );
|
|
#endif
|
|
#endif
|
|
|
|
float Opacity250 = (0.5 + (( 1.0 - _ShadowOpacity ) - 0.0) * (1.0 - 0.5) / (1.0 - 0.0));
|
|
|
|
float Alpha = Opacity250;
|
|
float AlphaClipThreshold = 0.5;
|
|
|
|
#ifdef _ALPHATEST_ON
|
|
clip(Alpha - AlphaClipThreshold);
|
|
#endif
|
|
|
|
#ifdef LOD_FADE_CROSSFADE
|
|
LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x );
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
ENDHLSL
|
|
}
|
|
|
|
|
|
Pass
|
|
{
|
|
|
|
Name "DepthOnly"
|
|
Tags { "LightMode"="DepthOnly" }
|
|
|
|
ZWrite On
|
|
ColorMask 0
|
|
|
|
HLSLPROGRAM
|
|
#pragma multi_compile_instancing
|
|
#define ASE_SRP_VERSION 70301
|
|
|
|
#pragma prefer_hlslcc gles
|
|
#pragma exclude_renderers d3d11_9x
|
|
|
|
#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"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
|
|
#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
|
|
#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
|
|
|
|
|
|
struct VertexInput
|
|
{
|
|
float4 vertex : POSITION;
|
|
float3 ase_normal : NORMAL;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct VertexOutput
|
|
{
|
|
float4 clipPos : SV_POSITION;
|
|
#if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
|
|
float3 worldPos : TEXCOORD0;
|
|
#endif
|
|
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
|
|
float4 shadowCoord : TEXCOORD1;
|
|
#endif
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _Color;
|
|
float4 _MainTex_ST;
|
|
float4 _BumpMap_ST;
|
|
float4 _DetailMap_ST;
|
|
float4 _FresnelColor;
|
|
float4 _FillColorBackground;
|
|
float _MinValueAmplitude;
|
|
float _MaxValueAmplitude;
|
|
float _DetailScale;
|
|
float _FresnelPower;
|
|
float _FresnelIntensity;
|
|
float _FresnelBias;
|
|
float _Invert;
|
|
float _Opacity;
|
|
float _Refraction;
|
|
float _AmplitudeSpeed;
|
|
float _SpreadDetailMap;
|
|
float _RotationAngle;
|
|
float _RotationSpeed;
|
|
float _TexturesScale;
|
|
float _TranslationSpeed;
|
|
float _ContrastDetailMap;
|
|
float _SelfIllumination;
|
|
float _Glossiness;
|
|
float _BumpScale;
|
|
float _DesaturateBackground;
|
|
float _ShadowOpacity;
|
|
#ifdef TESSELLATION_ON
|
|
float _TessPhongStrength;
|
|
float _TessValue;
|
|
float _TessMin;
|
|
float _TessMax;
|
|
float _TessEdgeLength;
|
|
float _TessMaxDisp;
|
|
#endif
|
|
CBUFFER_END
|
|
|
|
|
|
|
|
VertexOutput VertexFunction( VertexInput v )
|
|
{
|
|
VertexOutput o = (VertexOutput)0;
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|
|
|
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
float3 defaultVertexValue = v.vertex.xyz;
|
|
#else
|
|
float3 defaultVertexValue = float3(0, 0, 0);
|
|
#endif
|
|
float3 vertexValue = defaultVertexValue;
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
v.vertex.xyz = vertexValue;
|
|
#else
|
|
v.vertex.xyz += vertexValue;
|
|
#endif
|
|
|
|
v.ase_normal = v.ase_normal;
|
|
|
|
float3 positionWS = TransformObjectToWorld( v.vertex.xyz );
|
|
|
|
#if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
|
|
o.worldPos = positionWS;
|
|
#endif
|
|
|
|
o.clipPos = TransformWorldToHClip( positionWS );
|
|
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
|
|
VertexPositionInputs vertexInput = (VertexPositionInputs)0;
|
|
vertexInput.positionWS = positionWS;
|
|
vertexInput.positionCS = clipPos;
|
|
o.shadowCoord = GetShadowCoord( vertexInput );
|
|
#endif
|
|
return o;
|
|
}
|
|
|
|
#if defined(TESSELLATION_ON)
|
|
struct VertexControl
|
|
{
|
|
float4 vertex : INTERNALTESSPOS;
|
|
float3 ase_normal : NORMAL;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct TessellationFactors
|
|
{
|
|
float edge[3] : SV_TessFactor;
|
|
float inside : SV_InsideTessFactor;
|
|
};
|
|
|
|
VertexControl vert ( VertexInput v )
|
|
{
|
|
VertexControl o;
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|
o.vertex = v.vertex;
|
|
o.ase_normal = v.ase_normal;
|
|
|
|
return o;
|
|
}
|
|
|
|
TessellationFactors TessellationFunction (InputPatch<VertexControl,3> v)
|
|
{
|
|
TessellationFactors o;
|
|
float4 tf = 1;
|
|
float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax;
|
|
float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp;
|
|
#if defined(ASE_FIXED_TESSELLATION)
|
|
tf = FixedTess( tessValue );
|
|
#elif defined(ASE_DISTANCE_TESSELLATION)
|
|
tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos );
|
|
#elif defined(ASE_LENGTH_TESSELLATION)
|
|
tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams );
|
|
#elif defined(ASE_LENGTH_CULL_TESSELLATION)
|
|
tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes );
|
|
#endif
|
|
o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w;
|
|
return o;
|
|
}
|
|
|
|
[domain("tri")]
|
|
[partitioning("fractional_odd")]
|
|
[outputtopology("triangle_cw")]
|
|
[patchconstantfunc("TessellationFunction")]
|
|
[outputcontrolpoints(3)]
|
|
VertexControl HullFunction(InputPatch<VertexControl, 3> patch, uint id : SV_OutputControlPointID)
|
|
{
|
|
return patch[id];
|
|
}
|
|
|
|
[domain("tri")]
|
|
VertexOutput DomainFunction(TessellationFactors factors, OutputPatch<VertexControl, 3> patch, float3 bary : SV_DomainLocation)
|
|
{
|
|
VertexInput o = (VertexInput) 0;
|
|
o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z;
|
|
o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z;
|
|
|
|
#if defined(ASE_PHONG_TESSELLATION)
|
|
float3 pp[3];
|
|
for (int i = 0; i < 3; ++i)
|
|
pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal));
|
|
float phongStrength = _TessPhongStrength;
|
|
o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz;
|
|
#endif
|
|
UNITY_TRANSFER_INSTANCE_ID(patch[0], o);
|
|
return VertexFunction(o);
|
|
}
|
|
#else
|
|
VertexOutput vert ( VertexInput v )
|
|
{
|
|
return VertexFunction( v );
|
|
}
|
|
#endif
|
|
|
|
half4 frag(VertexOutput IN ) : SV_TARGET
|
|
{
|
|
UNITY_SETUP_INSTANCE_ID(IN);
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN );
|
|
|
|
#if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
|
|
float3 WorldPosition = IN.worldPos;
|
|
#endif
|
|
float4 ShadowCoords = float4( 0, 0, 0, 0 );
|
|
|
|
#if defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
|
|
#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)
|
|
ShadowCoords = IN.shadowCoord;
|
|
#elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)
|
|
ShadowCoords = TransformWorldToShadowCoord( WorldPosition );
|
|
#endif
|
|
#endif
|
|
|
|
float Opacity250 = (0.5 + (( 1.0 - _ShadowOpacity ) - 0.0) * (1.0 - 0.5) / (1.0 - 0.0));
|
|
|
|
float Alpha = Opacity250;
|
|
float AlphaClipThreshold = 0.5;
|
|
|
|
#ifdef _ALPHATEST_ON
|
|
clip(Alpha - AlphaClipThreshold);
|
|
#endif
|
|
|
|
#ifdef LOD_FADE_CROSSFADE
|
|
LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x );
|
|
#endif
|
|
return 0;
|
|
}
|
|
ENDHLSL
|
|
}
|
|
|
|
|
|
}
|
|
CustomEditor "UnityEditor.ShaderGraph.PBRMasterGUI"
|
|
Fallback "Hidden/InternalErrorShader"
|
|
|
|
} |