1564 lines
68 KiB
GLSL
1564 lines
68 KiB
GLSL
// Made with Amplify Shader Editor
|
|
// Available at the Unity Asset Store - http://u3d.as/y3X
|
|
Shader "ASESampleShaders/Decals Muddy Ground/GroundDecals"
|
|
{
|
|
Properties
|
|
{
|
|
[HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5
|
|
[HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1)
|
|
[ASEBegin]_dirt_decal_BaseColor("dirt_decal_BaseColor", 2D) = "white" {}
|
|
_dirt_decal_mask("dirt_decal_mask", 2D) = "white" {}
|
|
_Dirt_Decal_Normal("Dirt_Decal_Normal", 2D) = "bump" {}
|
|
_SmoothnessMultiplier("Smoothness Multiplier", Range( 0 , 1)) = 0
|
|
_NormalIntensity("Normal Intensity", Float) = 0
|
|
_DecalQuantity("Decal Quantity", Float) = 0
|
|
[ASEEnd]_DecalType("Decal Type", Float) = 0
|
|
|
|
[HideInInspector]_DrawOrder("Draw Order", Int) = 0
|
|
[HideInInspector][Enum(Depth Bias, 0, View Bias, 1)]_DecalMeshBiasType("Float", Float) = 0
|
|
[HideInInspector]_DecalMeshDepthBias("DecalMesh DepthBias", Float) = 0
|
|
[HideInInspector]_DecalMeshViewBias("DecalMesh ViewBias", Float) = 0
|
|
[HideInInspector]_DecalStencilWriteMask("Float", Int) = 0
|
|
[HideInInspector]_DecalStencilRef("Float", Int) = 0
|
|
[HideInInspector][ToggleUI]_AffectAlbedo("Boolean", Float) = 1
|
|
[HideInInspector][ToggleUI]_AffectNormal("Boolean", Float) = 1
|
|
[HideInInspector][ToggleUI]_AffectAO("Boolean", Float) = 1
|
|
[HideInInspector][ToggleUI]_AffectMetal("Boolean", Float) = 1
|
|
[HideInInspector][ToggleUI]_AffectSmoothness("Boolean", Float) = 1
|
|
[HideInInspector][ToggleUI]_AffectEmission("Boolean", Float) = 1
|
|
[HideInInspector]_DecalColorMask0("Float", Int) = 0
|
|
[HideInInspector]_DecalColorMask1("Float", Int) = 0
|
|
[HideInInspector]_DecalColorMask2("Float", Int) = 0
|
|
[HideInInspector]_DecalColorMask3("Float", Int) = 0
|
|
[HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {}
|
|
[HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {}
|
|
[HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {}
|
|
}
|
|
SubShader
|
|
{
|
|
LOD 0
|
|
|
|
|
|
Tags { "RenderPipeline"="HDRenderPipeline" "RenderType"="Opaque" "Queue"="Geometry" }
|
|
|
|
HLSLINCLUDE
|
|
#pragma target 4.5
|
|
#pragma only_renderers d3d11 metal vulkan xboxone xboxseries playstation switch
|
|
|
|
struct SurfaceDescription
|
|
{
|
|
float3 BaseColor;
|
|
float Alpha;
|
|
float3 NormalTS;
|
|
float NormalAlpha;
|
|
float Metallic;
|
|
float Occlusion;
|
|
float Smoothness;
|
|
float MAOSAlpha;
|
|
float3 Emission;
|
|
};
|
|
ENDHLSL
|
|
|
|
|
|
Pass
|
|
{
|
|
|
|
Name "DBufferProjector"
|
|
Tags { "LightMode"="DBufferProjector" }
|
|
|
|
Cull Front
|
|
Blend 0 SrcAlpha OneMinusSrcAlpha, Zero OneMinusSrcAlpha Blend 1 SrcAlpha OneMinusSrcAlpha, Zero OneMinusSrcAlpha Blend 2 SrcAlpha OneMinusSrcAlpha, Zero OneMinusSrcAlpha Blend 3 Zero OneMinusSrcColor
|
|
ZTest Greater
|
|
ZWrite Off
|
|
ColorMask [_DecalColorMask0] ColorMask [_DecalColorMask1] 1 ColorMask [_DecalColorMask2] 2 ColorMask [_DecalColorMask3] 3
|
|
Stencil
|
|
{
|
|
Ref [_DecalStencilRef]
|
|
WriteMask [_DecalStencilWriteMask]
|
|
Comp Always
|
|
Pass Replace
|
|
Fail Keep
|
|
ZFail Keep
|
|
}
|
|
|
|
|
|
HLSLPROGRAM
|
|
|
|
#pragma shader_feature _ _MATERIAL_AFFECTS_ALBEDO
|
|
#pragma shader_feature _ _MATERIAL_AFFECTS_NORMAL
|
|
#pragma shader_feature _ _MATERIAL_AFFECTS_MASKMAP
|
|
#define _MATERIAL_AFFECTS_EMISSION
|
|
#pragma multi_compile _ LOD_FADE_CROSSFADE
|
|
#define ASE_SRP_VERSION 100600
|
|
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment Frag
|
|
|
|
#pragma multi_compile_instancing
|
|
|
|
#pragma multi_compile DECALS_3RT DECALS_4RT
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl"
|
|
|
|
#define SHADERPASS SHADERPASS_DBUFFER_PROJECTOR
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/Decal.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl"
|
|
|
|
#define ASE_NEEDS_FRAG_TEXTURE_COORDINATES0
|
|
|
|
|
|
struct AttributesMesh
|
|
{
|
|
float3 positionOS : POSITION;
|
|
float3 normalOS : NORMAL;
|
|
float4 tangentOS : TANGENT;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct PackedVaryingsToPS
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
#if defined(ASE_NEEDS_FRAG_RELATIVE_WORLD_POS)
|
|
float3 positionRWS : TEXCOORD0;
|
|
#endif
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float _DecalQuantity;
|
|
float _DecalType;
|
|
float _NormalIntensity;
|
|
float _SmoothnessMultiplier;
|
|
float _DrawOrder;
|
|
float _DecalMeshBiasType;
|
|
float _DecalMeshDepthBias;
|
|
float _DecalMeshViewBias;
|
|
float _DecalStencilWriteMask;
|
|
float _DecalStencilRef;
|
|
#ifdef _MATERIAL_AFFECTS_ALBEDO
|
|
float _AffectAlbedo;
|
|
#endif
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
float _AffectNormal;
|
|
#endif
|
|
#ifdef _MATERIAL_AFFECTS_MASKMAP
|
|
float _AffectAO;
|
|
float _AffectMetal;
|
|
float _AffectSmoothness;
|
|
#endif
|
|
#ifdef _MATERIAL_AFFECTS_EMISSION
|
|
float _AffectEmission;
|
|
#endif
|
|
float _DecalColorMask0;
|
|
float _DecalColorMask1;
|
|
float _DecalColorMask2;
|
|
float _DecalColorMask3;
|
|
CBUFFER_END
|
|
|
|
sampler2D _dirt_decal_BaseColor;
|
|
sampler2D _Dirt_Decal_Normal;
|
|
sampler2D _dirt_decal_mask;
|
|
|
|
|
|
|
|
void GetSurfaceData(SurfaceDescription surfaceDescription, FragInputs fragInputs, float3 V, PositionInputs posInput, float angleFadeFactor, out DecalSurfaceData surfaceData)
|
|
{
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR)
|
|
float4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
float fadeFactor = clamp(normalToWorld[0][3], 0.0f, 1.0f) * angleFadeFactor;
|
|
float2 scale = float2(normalToWorld[3][0], normalToWorld[3][1]);
|
|
float2 offset = float2(normalToWorld[3][2], normalToWorld[3][3]);
|
|
fragInputs.texCoord0.xy = fragInputs.texCoord0.xy * scale + offset;
|
|
fragInputs.texCoord1.xy = fragInputs.texCoord1.xy * scale + offset;
|
|
fragInputs.texCoord2.xy = fragInputs.texCoord2.xy * scale + offset;
|
|
fragInputs.texCoord3.xy = fragInputs.texCoord3.xy * scale + offset;
|
|
fragInputs.positionRWS = posInput.positionWS;
|
|
fragInputs.tangentToWorld[2].xyz = TransformObjectToWorldDir(float3(0, 1, 0));
|
|
fragInputs.tangentToWorld[1].xyz = TransformObjectToWorldDir(float3(0, 0, 1));
|
|
#else
|
|
#ifdef LOD_FADE_CROSSFADE
|
|
LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);
|
|
#endif
|
|
|
|
float fadeFactor = 1.0;
|
|
#endif
|
|
|
|
ZERO_INITIALIZE(DecalSurfaceData, surfaceData);
|
|
|
|
#ifdef _MATERIAL_AFFECTS_EMISSION
|
|
#endif
|
|
|
|
#ifdef _MATERIAL_AFFECTS_ALBEDO
|
|
surfaceData.baseColor.xyz = surfaceDescription.BaseColor;
|
|
surfaceData.baseColor.w = surfaceDescription.Alpha * fadeFactor;
|
|
#endif
|
|
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR)
|
|
surfaceData.normalWS.xyz = mul((float3x3)normalToWorld, surfaceDescription.NormalTS);
|
|
#elif (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_FORWARD_PREVIEW)
|
|
surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(surfaceDescription.NormalTS, fragInputs.tangentToWorld));
|
|
#endif
|
|
|
|
surfaceData.normalWS.w = surfaceDescription.NormalAlpha * fadeFactor;
|
|
#else
|
|
#if (SHADERPASS == SHADERPASS_FORWARD_PREVIEW)
|
|
surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(float3(0.0, 0.0, 0.1), fragInputs.tangentToWorld));
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef _MATERIAL_AFFECTS_MASKMAP
|
|
surfaceData.mask.z = surfaceDescription.Smoothness;
|
|
surfaceData.mask.w = surfaceDescription.MAOSAlpha * fadeFactor;
|
|
|
|
#ifdef DECALS_4RT
|
|
surfaceData.mask.x = surfaceDescription.Metallic;
|
|
surfaceData.mask.y = surfaceDescription.Occlusion;
|
|
surfaceData.MAOSBlend.x = surfaceDescription.MAOSAlpha * fadeFactor;
|
|
surfaceData.MAOSBlend.y = surfaceDescription.MAOSAlpha * fadeFactor;
|
|
#endif
|
|
|
|
#endif
|
|
}
|
|
|
|
PackedVaryingsToPS Vert(AttributesMesh inputMesh )
|
|
{
|
|
PackedVaryingsToPS output;
|
|
|
|
UNITY_SETUP_INSTANCE_ID(inputMesh);
|
|
UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( output );
|
|
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
float3 defaultVertexValue = inputMesh.positionOS.xyz;
|
|
#else
|
|
float3 defaultVertexValue = float3( 0, 0, 0 );
|
|
#endif
|
|
float3 vertexValue = defaultVertexValue;
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
inputMesh.positionOS.xyz = vertexValue;
|
|
#else
|
|
inputMesh.positionOS.xyz += vertexValue;
|
|
#endif
|
|
|
|
inputMesh.normalOS = inputMesh.normalOS;
|
|
inputMesh.tangentOS = inputMesh.tangentOS;
|
|
|
|
float3 positionRWS = TransformObjectToWorld(inputMesh.positionOS);
|
|
float3 normalWS = TransformObjectToWorldNormal(inputMesh.normalOS);
|
|
float4 tangentWS = float4(TransformObjectToWorldDir(inputMesh.tangentOS.xyz), inputMesh.tangentOS.w);
|
|
|
|
output.positionCS = TransformWorldToHClip(positionRWS);
|
|
#if defined(ASE_NEEDS_FRAG_RELATIVE_WORLD_POS)
|
|
output.positionRWS = positionRWS;
|
|
#endif
|
|
|
|
return output;
|
|
}
|
|
|
|
void Frag( PackedVaryingsToPS packedInput,
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
OUTPUT_DBUFFER(outDBuffer)
|
|
#else
|
|
out float4 outEmissive : SV_Target0
|
|
#endif
|
|
|
|
)
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);
|
|
UNITY_SETUP_INSTANCE_ID(packedInput);
|
|
|
|
FragInputs input;
|
|
ZERO_INITIALIZE(FragInputs, input);
|
|
input.tangentToWorld = k_identity3x3;
|
|
#if defined(ASE_NEEDS_FRAG_RELATIVE_WORLD_POS)
|
|
float3 positionRWS = packedInput.positionRWS;
|
|
input.positionRWS = positionRWS;
|
|
#endif
|
|
|
|
input.positionSS = packedInput.positionCS;
|
|
|
|
DecalSurfaceData surfaceData;
|
|
float clipValue = 1.0;
|
|
float angleFadeFactor = 1.0;
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR)
|
|
|
|
float depth = LoadCameraDepth(input.positionSS.xy);
|
|
PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, depth, UNITY_MATRIX_I_VP, UNITY_MATRIX_V);
|
|
|
|
DecalPrepassData material;
|
|
ZERO_INITIALIZE(DecalPrepassData, material);
|
|
if (_EnableDecalLayers)
|
|
{
|
|
uint decalLayerMask = uint(UNITY_ACCESS_INSTANCED_PROP(Decal, _DecalLayerMaskFromDecal).x);
|
|
|
|
DecodeFromDecalPrepass(posInput.positionSS, material);
|
|
|
|
if ((decalLayerMask & material.decalLayerMask) == 0)
|
|
clipValue -= 2.0;
|
|
}
|
|
|
|
|
|
float3 positionDS = TransformWorldToObject(posInput.positionWS);
|
|
positionDS = positionDS * float3(1.0, -1.0, 1.0) + float3(0.5, 0.5, 0.5);
|
|
if (!(all(positionDS.xyz > 0.0f) && all(1.0f - positionDS.xyz > 0.0f)))
|
|
{
|
|
clipValue -= 2.0;
|
|
}
|
|
|
|
#ifndef SHADER_API_METAL
|
|
clip(clipValue);
|
|
#else
|
|
if (clipValue > 0.0)
|
|
{
|
|
#endif
|
|
input.texCoord0.xy = positionDS.xz;
|
|
input.texCoord1.xy = positionDS.xz;
|
|
input.texCoord2.xy = positionDS.xz;
|
|
input.texCoord3.xy = positionDS.xz;
|
|
|
|
float3 V = GetWorldSpaceNormalizeViewDir(posInput.positionWS);
|
|
if (_EnableDecalLayers)
|
|
{
|
|
float4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
float2 angleFade = float2(normalToWorld[1][3], normalToWorld[2][3]);
|
|
|
|
if (angleFade.x > 0.0f)
|
|
{
|
|
float dotAngle = 1.0 - dot(material.geomNormalWS, normalToWorld[2].xyz);
|
|
angleFadeFactor = 1.0 - saturate(dotAngle * angleFade.x + angleFade.y);
|
|
}
|
|
}
|
|
|
|
#else
|
|
PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz, uint2(0, 0));
|
|
#if defined(ASE_NEEDS_FRAG_RELATIVE_WORLD_POS)
|
|
float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);
|
|
#else
|
|
float3 V = float3(1.0, 1.0, 1.0);
|
|
#endif
|
|
#endif
|
|
|
|
float4 texCoord0 = input.texCoord0;
|
|
float4 texCoord1 = input.texCoord1;
|
|
float4 texCoord2 = input.texCoord2;
|
|
float4 texCoord3 = input.texCoord3;
|
|
SurfaceDescription surfaceDescription = (SurfaceDescription)0;
|
|
float2 texCoord25 = texCoord0.xy * float2( 1,1 ) + float2( 0,0 );
|
|
// *** BEGIN Flipbook UV Animation vars ***
|
|
// Total tiles of Flipbook Texture
|
|
float fbtotaltiles27 = _DecalQuantity * _DecalQuantity;
|
|
// Offsets for cols and rows of Flipbook Texture
|
|
float fbcolsoffset27 = 1.0f / _DecalQuantity;
|
|
float fbrowsoffset27 = 1.0f / _DecalQuantity;
|
|
// Speed of animation
|
|
float fbspeed27 = _Time[ 1 ] * 0.0;
|
|
// UV Tiling (col and row offset)
|
|
float2 fbtiling27 = float2(fbcolsoffset27, fbrowsoffset27);
|
|
// UV Offset - calculate current tile linear index, and convert it to (X * coloffset, Y * rowoffset)
|
|
// Calculate current tile linear index
|
|
float fbcurrenttileindex27 = round( fmod( fbspeed27 + _DecalType, fbtotaltiles27) );
|
|
fbcurrenttileindex27 += ( fbcurrenttileindex27 < 0) ? fbtotaltiles27 : 0;
|
|
// Obtain Offset X coordinate from current tile linear index
|
|
float fblinearindextox27 = round ( fmod ( fbcurrenttileindex27, _DecalQuantity ) );
|
|
// Multiply Offset X by coloffset
|
|
float fboffsetx27 = fblinearindextox27 * fbcolsoffset27;
|
|
// Obtain Offset Y coordinate from current tile linear index
|
|
float fblinearindextoy27 = round( fmod( ( fbcurrenttileindex27 - fblinearindextox27 ) / _DecalQuantity, _DecalQuantity ) );
|
|
// Reverse Y to get tiles from Top to Bottom
|
|
fblinearindextoy27 = (int)(_DecalQuantity-1) - fblinearindextoy27;
|
|
// Multiply Offset Y by rowoffset
|
|
float fboffsety27 = fblinearindextoy27 * fbrowsoffset27;
|
|
// UV Offset
|
|
float2 fboffset27 = float2(fboffsetx27, fboffsety27);
|
|
// Flipbook UV
|
|
half2 fbuv27 = texCoord25 * fbtiling27 + fboffset27;
|
|
// *** END Flipbook UV Animation vars ***
|
|
float4 tex2DNode17 = tex2D( _dirt_decal_BaseColor, fbuv27 );
|
|
|
|
float3 unpack19 = UnpackNormalScale( tex2D( _Dirt_Decal_Normal, fbuv27 ), _NormalIntensity );
|
|
unpack19.z = lerp( 1, unpack19.z, saturate(_NormalIntensity) );
|
|
|
|
float4 tex2DNode18 = tex2D( _dirt_decal_mask, fbuv27 );
|
|
|
|
surfaceDescription.BaseColor = tex2DNode17.rgb;
|
|
surfaceDescription.Alpha = tex2DNode17.a;
|
|
surfaceDescription.NormalTS = unpack19;
|
|
surfaceDescription.NormalAlpha = tex2DNode17.a;
|
|
surfaceDescription.Metallic = tex2DNode18.r;
|
|
surfaceDescription.Occlusion = tex2DNode18.g;
|
|
surfaceDescription.Smoothness = ( tex2DNode18.a * _SmoothnessMultiplier );
|
|
surfaceDescription.MAOSAlpha = tex2DNode17.a;
|
|
surfaceDescription.Emission = float3( 0, 0, 0 );
|
|
|
|
GetSurfaceData(surfaceDescription, input, V, posInput, angleFadeFactor, surfaceData);
|
|
|
|
#if ((SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR)) && defined(SHADER_API_METAL)
|
|
} // if (clipValue > 0.0)
|
|
|
|
clip(clipValue);
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
ENCODE_INTO_DBUFFER(surfaceData, outDBuffer);
|
|
#else
|
|
// Emissive need to be pre-exposed
|
|
outEmissive.rgb = surfaceData.emissive * GetCurrentExposureMultiplier();
|
|
outEmissive.a = 1.0;
|
|
#endif
|
|
}
|
|
|
|
ENDHLSL
|
|
}
|
|
|
|
|
|
Pass
|
|
{
|
|
|
|
Name "DecalProjectorForwardEmissive"
|
|
Tags { "LightMode"="DecalProjectorForwardEmissive" }
|
|
|
|
Cull Front
|
|
Blend 0 SrcAlpha One
|
|
ZTest Greater
|
|
ZWrite Off
|
|
|
|
HLSLPROGRAM
|
|
|
|
|
|
#pragma shader_feature _ _MATERIAL_AFFECTS_ALBEDO
|
|
#pragma shader_feature _ _MATERIAL_AFFECTS_NORMAL
|
|
#pragma shader_feature _ _MATERIAL_AFFECTS_MASKMAP
|
|
#define _MATERIAL_AFFECTS_EMISSION
|
|
#pragma multi_compile _ LOD_FADE_CROSSFADE
|
|
#define ASE_SRP_VERSION 100600
|
|
|
|
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment Frag
|
|
|
|
#pragma multi_compile_instancing
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl"
|
|
|
|
#define SHADERPASS SHADERPASS_FORWARD_EMISSIVE_PROJECTOR
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/Decal.hlsl"
|
|
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl"
|
|
|
|
#define ASE_NEEDS_FRAG_TEXTURE_COORDINATES0
|
|
|
|
|
|
struct AttributesMesh
|
|
{
|
|
float3 positionOS : POSITION;
|
|
float3 normalOS : NORMAL;
|
|
float4 tangentOS : TANGENT;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct PackedVaryingsToPS
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
#if defined(ASE_NEEDS_FRAG_RELATIVE_WORLD_POS)
|
|
float3 positionRWS : TEXCOORD0;
|
|
#endif
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float _DecalQuantity;
|
|
float _DecalType;
|
|
float _NormalIntensity;
|
|
float _SmoothnessMultiplier;
|
|
float _DrawOrder;
|
|
float _DecalMeshBiasType;
|
|
float _DecalMeshDepthBias;
|
|
float _DecalMeshViewBias;
|
|
float _DecalStencilWriteMask;
|
|
float _DecalStencilRef;
|
|
#ifdef _MATERIAL_AFFECTS_ALBEDO
|
|
float _AffectAlbedo;
|
|
#endif
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
float _AffectNormal;
|
|
#endif
|
|
#ifdef _MATERIAL_AFFECTS_MASKMAP
|
|
float _AffectAO;
|
|
float _AffectMetal;
|
|
float _AffectSmoothness;
|
|
#endif
|
|
#ifdef _MATERIAL_AFFECTS_EMISSION
|
|
float _AffectEmission;
|
|
#endif
|
|
float _DecalColorMask0;
|
|
float _DecalColorMask1;
|
|
float _DecalColorMask2;
|
|
float _DecalColorMask3;
|
|
CBUFFER_END
|
|
|
|
sampler2D _dirt_decal_BaseColor;
|
|
sampler2D _Dirt_Decal_Normal;
|
|
sampler2D _dirt_decal_mask;
|
|
|
|
|
|
|
|
void GetSurfaceData(SurfaceDescription surfaceDescription, FragInputs fragInputs, float3 V, PositionInputs posInput, float angleFadeFactor, out DecalSurfaceData surfaceData)
|
|
{
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR)
|
|
float4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
float fadeFactor = clamp(normalToWorld[0][3], 0.0f, 1.0f) * angleFadeFactor;
|
|
float2 scale = float2(normalToWorld[3][0], normalToWorld[3][1]);
|
|
float2 offset = float2(normalToWorld[3][2], normalToWorld[3][3]);
|
|
fragInputs.texCoord0.xy = fragInputs.texCoord0.xy * scale + offset;
|
|
fragInputs.texCoord1.xy = fragInputs.texCoord1.xy * scale + offset;
|
|
fragInputs.texCoord2.xy = fragInputs.texCoord2.xy * scale + offset;
|
|
fragInputs.texCoord3.xy = fragInputs.texCoord3.xy * scale + offset;
|
|
fragInputs.positionRWS = posInput.positionWS;
|
|
fragInputs.tangentToWorld[2].xyz = TransformObjectToWorldDir(float3(0, 1, 0));
|
|
fragInputs.tangentToWorld[1].xyz = TransformObjectToWorldDir(float3(0, 0, 1));
|
|
#else
|
|
#ifdef LOD_FADE_CROSSFADE
|
|
LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);
|
|
#endif
|
|
|
|
float fadeFactor = 1.0;
|
|
#endif
|
|
|
|
ZERO_INITIALIZE(DecalSurfaceData, surfaceData);
|
|
|
|
#ifdef _MATERIAL_AFFECTS_EMISSION
|
|
surfaceData.emissive.rgb = surfaceDescription.Emission.rgb * fadeFactor;
|
|
#endif
|
|
|
|
#ifdef _MATERIAL_AFFECTS_ALBEDO
|
|
#endif
|
|
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR)
|
|
#elif (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_FORWARD_PREVIEW)
|
|
#endif
|
|
|
|
#else
|
|
#if (SHADERPASS == SHADERPASS_FORWARD_PREVIEW)
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef _MATERIAL_AFFECTS_MASKMAP
|
|
|
|
#ifdef DECALS_4RT
|
|
#endif
|
|
|
|
#endif
|
|
}
|
|
|
|
PackedVaryingsToPS Vert(AttributesMesh inputMesh )
|
|
{
|
|
PackedVaryingsToPS output;
|
|
|
|
UNITY_SETUP_INSTANCE_ID(inputMesh);
|
|
UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( output );
|
|
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
float3 defaultVertexValue = inputMesh.positionOS.xyz;
|
|
#else
|
|
float3 defaultVertexValue = float3( 0, 0, 0 );
|
|
#endif
|
|
float3 vertexValue = defaultVertexValue;
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
inputMesh.positionOS.xyz = vertexValue;
|
|
#else
|
|
inputMesh.positionOS.xyz += vertexValue;
|
|
#endif
|
|
|
|
inputMesh.normalOS = inputMesh.normalOS;
|
|
inputMesh.tangentOS = inputMesh.tangentOS;
|
|
|
|
float3 positionRWS = TransformObjectToWorld(inputMesh.positionOS);
|
|
float3 normalWS = TransformObjectToWorldNormal(inputMesh.normalOS);
|
|
float4 tangentWS = float4(TransformObjectToWorldDir(inputMesh.tangentOS.xyz), inputMesh.tangentOS.w);
|
|
|
|
output.positionCS = TransformWorldToHClip(positionRWS);
|
|
#if defined(ASE_NEEDS_FRAG_RELATIVE_WORLD_POS)
|
|
output.positionRWS = positionRWS;
|
|
#endif
|
|
|
|
return output;
|
|
}
|
|
|
|
void Frag( PackedVaryingsToPS packedInput,
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
OUTPUT_DBUFFER(outDBuffer)
|
|
#else
|
|
out float4 outEmissive : SV_Target0
|
|
#endif
|
|
|
|
)
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);
|
|
UNITY_SETUP_INSTANCE_ID(packedInput);
|
|
|
|
FragInputs input;
|
|
ZERO_INITIALIZE(FragInputs, input);
|
|
input.tangentToWorld = k_identity3x3;
|
|
#if defined(ASE_NEEDS_FRAG_RELATIVE_WORLD_POS)
|
|
float3 positionRWS = packedInput.positionRWS;
|
|
input.positionRWS = positionRWS;
|
|
#endif
|
|
|
|
input.positionSS = packedInput.positionCS;
|
|
|
|
DecalSurfaceData surfaceData;
|
|
float clipValue = 1.0;
|
|
float angleFadeFactor = 1.0;
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR)
|
|
|
|
float depth = LoadCameraDepth(input.positionSS.xy);
|
|
PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, depth, UNITY_MATRIX_I_VP, UNITY_MATRIX_V);
|
|
|
|
DecalPrepassData material;
|
|
ZERO_INITIALIZE(DecalPrepassData, material);
|
|
if (_EnableDecalLayers)
|
|
{
|
|
uint decalLayerMask = uint(UNITY_ACCESS_INSTANCED_PROP(Decal, _DecalLayerMaskFromDecal).x);
|
|
|
|
DecodeFromDecalPrepass(posInput.positionSS, material);
|
|
|
|
if ((decalLayerMask & material.decalLayerMask) == 0)
|
|
clipValue -= 2.0;
|
|
}
|
|
|
|
|
|
float3 positionDS = TransformWorldToObject(posInput.positionWS);
|
|
positionDS = positionDS * float3(1.0, -1.0, 1.0) + float3(0.5, 0.5, 0.5);
|
|
if (!(all(positionDS.xyz > 0.0f) && all(1.0f - positionDS.xyz > 0.0f)))
|
|
{
|
|
clipValue -= 2.0;
|
|
}
|
|
|
|
#ifndef SHADER_API_METAL
|
|
clip(clipValue);
|
|
#else
|
|
if (clipValue > 0.0)
|
|
{
|
|
#endif
|
|
input.texCoord0.xy = positionDS.xz;
|
|
input.texCoord1.xy = positionDS.xz;
|
|
input.texCoord2.xy = positionDS.xz;
|
|
input.texCoord3.xy = positionDS.xz;
|
|
|
|
float3 V = GetWorldSpaceNormalizeViewDir(posInput.positionWS);
|
|
if (_EnableDecalLayers)
|
|
{
|
|
float4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
float2 angleFade = float2(normalToWorld[1][3], normalToWorld[2][3]);
|
|
|
|
if (angleFade.x > 0.0f)
|
|
{
|
|
float dotAngle = 1.0 - dot(material.geomNormalWS, normalToWorld[2].xyz);
|
|
angleFadeFactor = 1.0 - saturate(dotAngle * angleFade.x + angleFade.y);
|
|
}
|
|
}
|
|
|
|
#else
|
|
PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz, uint2(0, 0));
|
|
#if defined(ASE_NEEDS_FRAG_RELATIVE_WORLD_POS)
|
|
float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);
|
|
#else
|
|
float3 V = float3(1.0, 1.0, 1.0);
|
|
#endif
|
|
#endif
|
|
|
|
float4 texCoord0 = input.texCoord0;
|
|
float4 texCoord1 = input.texCoord1;
|
|
float4 texCoord2 = input.texCoord2;
|
|
float4 texCoord3 = input.texCoord3;
|
|
SurfaceDescription surfaceDescription = (SurfaceDescription)0;
|
|
float2 texCoord25 = texCoord0.xy * float2( 1,1 ) + float2( 0,0 );
|
|
// *** BEGIN Flipbook UV Animation vars ***
|
|
// Total tiles of Flipbook Texture
|
|
float fbtotaltiles27 = _DecalQuantity * _DecalQuantity;
|
|
// Offsets for cols and rows of Flipbook Texture
|
|
float fbcolsoffset27 = 1.0f / _DecalQuantity;
|
|
float fbrowsoffset27 = 1.0f / _DecalQuantity;
|
|
// Speed of animation
|
|
float fbspeed27 = _Time[ 1 ] * 0.0;
|
|
// UV Tiling (col and row offset)
|
|
float2 fbtiling27 = float2(fbcolsoffset27, fbrowsoffset27);
|
|
// UV Offset - calculate current tile linear index, and convert it to (X * coloffset, Y * rowoffset)
|
|
// Calculate current tile linear index
|
|
float fbcurrenttileindex27 = round( fmod( fbspeed27 + _DecalType, fbtotaltiles27) );
|
|
fbcurrenttileindex27 += ( fbcurrenttileindex27 < 0) ? fbtotaltiles27 : 0;
|
|
// Obtain Offset X coordinate from current tile linear index
|
|
float fblinearindextox27 = round ( fmod ( fbcurrenttileindex27, _DecalQuantity ) );
|
|
// Multiply Offset X by coloffset
|
|
float fboffsetx27 = fblinearindextox27 * fbcolsoffset27;
|
|
// Obtain Offset Y coordinate from current tile linear index
|
|
float fblinearindextoy27 = round( fmod( ( fbcurrenttileindex27 - fblinearindextox27 ) / _DecalQuantity, _DecalQuantity ) );
|
|
// Reverse Y to get tiles from Top to Bottom
|
|
fblinearindextoy27 = (int)(_DecalQuantity-1) - fblinearindextoy27;
|
|
// Multiply Offset Y by rowoffset
|
|
float fboffsety27 = fblinearindextoy27 * fbrowsoffset27;
|
|
// UV Offset
|
|
float2 fboffset27 = float2(fboffsetx27, fboffsety27);
|
|
// Flipbook UV
|
|
half2 fbuv27 = texCoord25 * fbtiling27 + fboffset27;
|
|
// *** END Flipbook UV Animation vars ***
|
|
float4 tex2DNode17 = tex2D( _dirt_decal_BaseColor, fbuv27 );
|
|
|
|
float3 unpack19 = UnpackNormalScale( tex2D( _Dirt_Decal_Normal, fbuv27 ), _NormalIntensity );
|
|
unpack19.z = lerp( 1, unpack19.z, saturate(_NormalIntensity) );
|
|
|
|
float4 tex2DNode18 = tex2D( _dirt_decal_mask, fbuv27 );
|
|
|
|
surfaceDescription.BaseColor = tex2DNode17.rgb;
|
|
surfaceDescription.Alpha = tex2DNode17.a;
|
|
surfaceDescription.NormalTS = unpack19;
|
|
surfaceDescription.NormalAlpha = tex2DNode17.a;
|
|
surfaceDescription.Metallic = tex2DNode18.r;
|
|
surfaceDescription.Occlusion = tex2DNode18.g;
|
|
surfaceDescription.Smoothness = ( tex2DNode18.a * _SmoothnessMultiplier );
|
|
surfaceDescription.MAOSAlpha = tex2DNode17.a;
|
|
surfaceDescription.Emission = float3( 0, 0, 0 );
|
|
|
|
GetSurfaceData(surfaceDescription, input, V, posInput, angleFadeFactor, surfaceData);
|
|
|
|
#if ((SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR)) && defined(SHADER_API_METAL)
|
|
}
|
|
|
|
clip(clipValue);
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
ENCODE_INTO_DBUFFER(surfaceData, outDBuffer);
|
|
#else
|
|
// Emissive need to be pre-exposed
|
|
outEmissive.rgb = surfaceData.emissive * GetCurrentExposureMultiplier();
|
|
outEmissive.a = 1.0;
|
|
#endif
|
|
}
|
|
|
|
ENDHLSL
|
|
}
|
|
|
|
|
|
Pass
|
|
{
|
|
|
|
Name "DBufferMesh"
|
|
Tags { "LightMode"="DBufferMesh" }
|
|
|
|
Blend 0 SrcAlpha OneMinusSrcAlpha, Zero OneMinusSrcAlpha Blend 1 SrcAlpha OneMinusSrcAlpha, Zero OneMinusSrcAlpha Blend 2 SrcAlpha OneMinusSrcAlpha, Zero OneMinusSrcAlpha Blend 3 Zero OneMinusSrcColor
|
|
ZTest LEqual
|
|
ZWrite Off
|
|
ColorMask [_DecalColorMask0] ColorMask [_DecalColorMask1] 1 ColorMask [_DecalColorMask2] 2 ColorMask [_DecalColorMask3] 3
|
|
|
|
Stencil
|
|
{
|
|
Ref [_DecalStencilRef]
|
|
WriteMask [_DecalStencilWriteMask]
|
|
Comp Always
|
|
Pass Replace
|
|
Fail Keep
|
|
ZFail Keep
|
|
}
|
|
|
|
|
|
HLSLPROGRAM
|
|
|
|
#pragma shader_feature _ _MATERIAL_AFFECTS_ALBEDO
|
|
#pragma shader_feature _ _MATERIAL_AFFECTS_NORMAL
|
|
#pragma shader_feature _ _MATERIAL_AFFECTS_MASKMAP
|
|
#define _MATERIAL_AFFECTS_EMISSION
|
|
#pragma multi_compile _ LOD_FADE_CROSSFADE
|
|
#define ASE_SRP_VERSION 100600
|
|
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment Frag
|
|
#pragma multi_compile_instancing
|
|
|
|
#pragma multi_compile DECALS_3RT DECALS_4RT
|
|
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl"
|
|
|
|
|
|
#define SHADERPASS SHADERPASS_DBUFFER_MESH
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/Decal.hlsl"
|
|
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl"
|
|
|
|
#if ASE_SRP_VERSION >= 100301
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/DecalMeshBiasTypeEnum.cs.hlsl"
|
|
#endif
|
|
#define ASE_NEEDS_FRAG_TEXTURE_COORDINATES0
|
|
|
|
|
|
struct AttributesMesh
|
|
{
|
|
float3 positionOS : POSITION;
|
|
float3 normalOS : NORMAL;
|
|
float4 tangentOS : TANGENT;
|
|
float4 uv0 : TEXCOORD0;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct PackedVaryingsToPS
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
float3 interp0 : TEXCOORD0;
|
|
float3 interp1 : TEXCOORD1;
|
|
float4 interp2 : TEXCOORD2;
|
|
float4 interp3 : TEXCOORD3;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float _DecalQuantity;
|
|
float _DecalType;
|
|
float _NormalIntensity;
|
|
float _SmoothnessMultiplier;
|
|
float _DrawOrder;
|
|
float _DecalMeshBiasType;
|
|
float _DecalMeshDepthBias;
|
|
float _DecalMeshViewBias;
|
|
float _DecalStencilWriteMask;
|
|
float _DecalStencilRef;
|
|
#ifdef _MATERIAL_AFFECTS_ALBEDO
|
|
float _AffectAlbedo;
|
|
#endif
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
float _AffectNormal;
|
|
#endif
|
|
#ifdef _MATERIAL_AFFECTS_MASKMAP
|
|
float _AffectAO;
|
|
float _AffectMetal;
|
|
float _AffectSmoothness;
|
|
#endif
|
|
#ifdef _MATERIAL_AFFECTS_EMISSION
|
|
float _AffectEmission;
|
|
#endif
|
|
float _DecalColorMask0;
|
|
float _DecalColorMask1;
|
|
float _DecalColorMask2;
|
|
float _DecalColorMask3;
|
|
CBUFFER_END
|
|
|
|
sampler2D _dirt_decal_BaseColor;
|
|
sampler2D _Dirt_Decal_Normal;
|
|
sampler2D _dirt_decal_mask;
|
|
|
|
|
|
|
|
void GetSurfaceData(SurfaceDescription surfaceDescription, FragInputs fragInputs, float3 V, PositionInputs posInput, float angleFadeFactor, out DecalSurfaceData surfaceData)
|
|
{
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR)
|
|
float4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
float fadeFactor = clamp(normalToWorld[0][3], 0.0f, 1.0f) * angleFadeFactor;
|
|
float2 scale = float2(normalToWorld[3][0], normalToWorld[3][1]);
|
|
float2 offset = float2(normalToWorld[3][2], normalToWorld[3][3]);
|
|
fragInputs.texCoord0.xy = fragInputs.texCoord0.xy * scale + offset;
|
|
fragInputs.texCoord1.xy = fragInputs.texCoord1.xy * scale + offset;
|
|
fragInputs.texCoord2.xy = fragInputs.texCoord2.xy * scale + offset;
|
|
fragInputs.texCoord3.xy = fragInputs.texCoord3.xy * scale + offset;
|
|
fragInputs.positionRWS = posInput.positionWS;
|
|
fragInputs.tangentToWorld[2].xyz = TransformObjectToWorldDir(float3(0, 1, 0));
|
|
fragInputs.tangentToWorld[1].xyz = TransformObjectToWorldDir(float3(0, 0, 1));
|
|
#else
|
|
#ifdef LOD_FADE_CROSSFADE
|
|
LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);
|
|
#endif
|
|
|
|
float fadeFactor = 1.0;
|
|
#endif
|
|
|
|
ZERO_INITIALIZE(DecalSurfaceData, surfaceData);
|
|
|
|
#ifdef _MATERIAL_AFFECTS_EMISSION
|
|
#endif
|
|
|
|
#ifdef _MATERIAL_AFFECTS_ALBEDO
|
|
surfaceData.baseColor.xyz = surfaceDescription.BaseColor;
|
|
surfaceData.baseColor.w = surfaceDescription.Alpha * fadeFactor;
|
|
#endif
|
|
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR)
|
|
surfaceData.normalWS.xyz = mul((float3x3)normalToWorld, surfaceDescription.NormalTS);
|
|
#elif (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_FORWARD_PREVIEW)
|
|
surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(surfaceDescription.NormalTS, fragInputs.tangentToWorld));
|
|
#endif
|
|
|
|
surfaceData.normalWS.w = surfaceDescription.NormalAlpha * fadeFactor;
|
|
#else
|
|
#if (SHADERPASS == SHADERPASS_FORWARD_PREVIEW)
|
|
surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(float3(0.0, 0.0, 0.1), fragInputs.tangentToWorld));
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef _MATERIAL_AFFECTS_MASKMAP
|
|
surfaceData.mask.z = surfaceDescription.Smoothness;
|
|
surfaceData.mask.w = surfaceDescription.MAOSAlpha * fadeFactor;
|
|
|
|
#ifdef DECALS_4RT
|
|
surfaceData.mask.x = surfaceDescription.Metallic;
|
|
surfaceData.mask.y = surfaceDescription.Occlusion;
|
|
surfaceData.MAOSBlend.x = surfaceDescription.MAOSAlpha * fadeFactor;
|
|
surfaceData.MAOSBlend.y = surfaceDescription.MAOSAlpha * fadeFactor;
|
|
#endif
|
|
|
|
#endif
|
|
}
|
|
|
|
PackedVaryingsToPS Vert(AttributesMesh inputMesh )
|
|
{
|
|
PackedVaryingsToPS output;
|
|
|
|
UNITY_SETUP_INSTANCE_ID(inputMesh);
|
|
UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
|
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
float3 defaultVertexValue = inputMesh.positionOS.xyz;
|
|
#else
|
|
float3 defaultVertexValue = float3( 0, 0, 0 );
|
|
#endif
|
|
float3 vertexValue = defaultVertexValue;
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
inputMesh.positionOS.xyz = vertexValue;
|
|
#else
|
|
inputMesh.positionOS.xyz += vertexValue;
|
|
#endif
|
|
|
|
inputMesh.normalOS = inputMesh.normalOS;
|
|
inputMesh.tangentOS = inputMesh.tangentOS;
|
|
|
|
float3 worldSpaceBias = 0.0f;
|
|
#if ASE_SRP_VERSION >= 100301
|
|
if (_DecalMeshBiasType == DECALMESHDEPTHBIASTYPE_VIEW_BIAS)
|
|
{
|
|
float3 positionRWS = TransformObjectToWorld(inputMesh.positionOS);
|
|
float3 V = GetWorldSpaceNormalizeViewDir(positionRWS);
|
|
worldSpaceBias = V * (_DecalMeshViewBias);
|
|
}
|
|
#endif
|
|
float3 positionRWS = TransformObjectToWorld(inputMesh.positionOS) + worldSpaceBias;
|
|
float3 normalWS = TransformObjectToWorldNormal(inputMesh.normalOS);
|
|
float4 tangentWS = float4(TransformObjectToWorldDir(inputMesh.tangentOS.xyz), inputMesh.tangentOS.w);
|
|
|
|
output.interp0.xyz = positionRWS;
|
|
output.positionCS = TransformWorldToHClip(positionRWS);
|
|
output.interp1.xyz = normalWS;
|
|
output.interp2.xyzw = tangentWS;
|
|
output.interp3.xyzw = inputMesh.uv0;
|
|
|
|
#if ASE_SRP_VERSION >= 100301
|
|
if (_DecalMeshBiasType == DECALMESHDEPTHBIASTYPE_DEPTH_BIAS)
|
|
{
|
|
#if UNITY_REVERSED_Z
|
|
output.positionCS.z -= _DecalMeshDepthBias;
|
|
#else
|
|
output.positionCS.z += _DecalMeshDepthBias;
|
|
#endif
|
|
}
|
|
#else
|
|
#if UNITY_REVERSED_Z
|
|
output.positionCS.z -= _DecalMeshDepthBias;
|
|
#else
|
|
output.positionCS.z += _DecalMeshDepthBias;
|
|
#endif
|
|
#endif
|
|
|
|
return output;
|
|
}
|
|
|
|
void Frag( PackedVaryingsToPS packedInput,
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
OUTPUT_DBUFFER(outDBuffer)
|
|
#else
|
|
out float4 outEmissive : SV_Target0
|
|
#endif
|
|
|
|
)
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);
|
|
UNITY_SETUP_INSTANCE_ID(packedInput);
|
|
|
|
FragInputs input;
|
|
ZERO_INITIALIZE(FragInputs, input);
|
|
|
|
input.tangentToWorld = k_identity3x3;
|
|
input.positionSS = packedInput.positionCS;
|
|
|
|
input.positionRWS = packedInput.interp0.xyz;
|
|
float3 positionRWS = input.positionRWS;
|
|
|
|
input.tangentToWorld = BuildTangentToWorld(packedInput.interp2.xyzw, packedInput.interp1.xyz);
|
|
input.texCoord0 = packedInput.interp3.xyzw;
|
|
|
|
DecalSurfaceData surfaceData;
|
|
float clipValue = 1.0;
|
|
float angleFadeFactor = 1.0;
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR)
|
|
|
|
float depth = LoadCameraDepth(input.positionSS.xy);
|
|
PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, depth, UNITY_MATRIX_I_VP, UNITY_MATRIX_V);
|
|
|
|
DecalPrepassData material;
|
|
ZERO_INITIALIZE(DecalPrepassData, material);
|
|
if (_EnableDecalLayers)
|
|
{
|
|
uint decalLayerMask = uint(UNITY_ACCESS_INSTANCED_PROP(Decal, _DecalLayerMaskFromDecal).x);
|
|
|
|
DecodeFromDecalPrepass(posInput.positionSS, material);
|
|
|
|
if ((decalLayerMask & material.decalLayerMask) == 0)
|
|
clipValue -= 2.0;
|
|
}
|
|
|
|
float3 positionDS = TransformWorldToObject(posInput.positionWS);
|
|
positionDS = positionDS * float3(1.0, -1.0, 1.0) + float3(0.5, 0.5, 0.5);
|
|
if (!(all(positionDS.xyz > 0.0f) && all(1.0f - positionDS.xyz > 0.0f)))
|
|
{
|
|
clipValue -= 2.0;
|
|
}
|
|
|
|
#ifndef SHADER_API_METAL
|
|
clip(clipValue);
|
|
#else
|
|
if (clipValue > 0.0)
|
|
{
|
|
#endif
|
|
input.texCoord0.xy = positionDS.xz;
|
|
input.texCoord1.xy = positionDS.xz;
|
|
input.texCoord2.xy = positionDS.xz;
|
|
input.texCoord3.xy = positionDS.xz;
|
|
|
|
float3 V = GetWorldSpaceNormalizeViewDir(posInput.positionWS);
|
|
|
|
if (_EnableDecalLayers)
|
|
{
|
|
float4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
float2 angleFade = float2(normalToWorld[1][3], normalToWorld[2][3]);
|
|
|
|
if (angleFade.x > 0.0f)
|
|
{
|
|
float dotAngle = 1.0 - dot(material.geomNormalWS, normalToWorld[2].xyz);
|
|
angleFadeFactor = 1.0 - saturate(dotAngle * angleFade.x + angleFade.y);
|
|
}
|
|
}
|
|
|
|
#else
|
|
PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz, uint2(0, 0));
|
|
float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);
|
|
#endif
|
|
|
|
float4 texCoord0 = input.texCoord0;
|
|
float4 texCoord1 = input.texCoord1;
|
|
float4 texCoord2 = input.texCoord2;
|
|
float4 texCoord3 = input.texCoord3;
|
|
|
|
SurfaceDescription surfaceDescription = (SurfaceDescription)0;
|
|
float2 texCoord25 = texCoord0.xy * float2( 1,1 ) + float2( 0,0 );
|
|
// *** BEGIN Flipbook UV Animation vars ***
|
|
// Total tiles of Flipbook Texture
|
|
float fbtotaltiles27 = _DecalQuantity * _DecalQuantity;
|
|
// Offsets for cols and rows of Flipbook Texture
|
|
float fbcolsoffset27 = 1.0f / _DecalQuantity;
|
|
float fbrowsoffset27 = 1.0f / _DecalQuantity;
|
|
// Speed of animation
|
|
float fbspeed27 = _Time[ 1 ] * 0.0;
|
|
// UV Tiling (col and row offset)
|
|
float2 fbtiling27 = float2(fbcolsoffset27, fbrowsoffset27);
|
|
// UV Offset - calculate current tile linear index, and convert it to (X * coloffset, Y * rowoffset)
|
|
// Calculate current tile linear index
|
|
float fbcurrenttileindex27 = round( fmod( fbspeed27 + _DecalType, fbtotaltiles27) );
|
|
fbcurrenttileindex27 += ( fbcurrenttileindex27 < 0) ? fbtotaltiles27 : 0;
|
|
// Obtain Offset X coordinate from current tile linear index
|
|
float fblinearindextox27 = round ( fmod ( fbcurrenttileindex27, _DecalQuantity ) );
|
|
// Multiply Offset X by coloffset
|
|
float fboffsetx27 = fblinearindextox27 * fbcolsoffset27;
|
|
// Obtain Offset Y coordinate from current tile linear index
|
|
float fblinearindextoy27 = round( fmod( ( fbcurrenttileindex27 - fblinearindextox27 ) / _DecalQuantity, _DecalQuantity ) );
|
|
// Reverse Y to get tiles from Top to Bottom
|
|
fblinearindextoy27 = (int)(_DecalQuantity-1) - fblinearindextoy27;
|
|
// Multiply Offset Y by rowoffset
|
|
float fboffsety27 = fblinearindextoy27 * fbrowsoffset27;
|
|
// UV Offset
|
|
float2 fboffset27 = float2(fboffsetx27, fboffsety27);
|
|
// Flipbook UV
|
|
half2 fbuv27 = texCoord25 * fbtiling27 + fboffset27;
|
|
// *** END Flipbook UV Animation vars ***
|
|
float4 tex2DNode17 = tex2D( _dirt_decal_BaseColor, fbuv27 );
|
|
|
|
float3 unpack19 = UnpackNormalScale( tex2D( _Dirt_Decal_Normal, fbuv27 ), _NormalIntensity );
|
|
unpack19.z = lerp( 1, unpack19.z, saturate(_NormalIntensity) );
|
|
|
|
float4 tex2DNode18 = tex2D( _dirt_decal_mask, fbuv27 );
|
|
|
|
surfaceDescription.BaseColor = tex2DNode17.rgb;
|
|
surfaceDescription.Alpha = tex2DNode17.a;
|
|
surfaceDescription.NormalTS = unpack19;
|
|
surfaceDescription.NormalAlpha = tex2DNode17.a;
|
|
surfaceDescription.Metallic = tex2DNode18.r;
|
|
surfaceDescription.Occlusion = tex2DNode18.g;
|
|
surfaceDescription.Smoothness = ( tex2DNode18.a * _SmoothnessMultiplier );
|
|
surfaceDescription.MAOSAlpha = tex2DNode17.a;
|
|
surfaceDescription.Emission = float3( 0, 0, 0 );
|
|
|
|
GetSurfaceData(surfaceDescription, input, V, posInput, angleFadeFactor, surfaceData);
|
|
|
|
#if ((SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR)) && defined(SHADER_API_METAL)
|
|
}
|
|
|
|
clip(clipValue);
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
ENCODE_INTO_DBUFFER(surfaceData, outDBuffer);
|
|
#else
|
|
outEmissive.rgb = surfaceData.emissive * GetCurrentExposureMultiplier();
|
|
outEmissive.a = 1.0;
|
|
#endif
|
|
}
|
|
ENDHLSL
|
|
}
|
|
|
|
|
|
Pass
|
|
{
|
|
|
|
Name "DecalMeshForwardEmissive"
|
|
Tags { "LightMode"="DecalMeshForwardEmissive" }
|
|
|
|
// Render State
|
|
Blend 0 SrcAlpha One
|
|
ZTest LEqual
|
|
ZWrite Off
|
|
|
|
HLSLPROGRAM
|
|
|
|
#pragma shader_feature _ _MATERIAL_AFFECTS_ALBEDO
|
|
#pragma shader_feature _ _MATERIAL_AFFECTS_NORMAL
|
|
#pragma shader_feature _ _MATERIAL_AFFECTS_MASKMAP
|
|
#define _MATERIAL_AFFECTS_EMISSION
|
|
#pragma multi_compile _ LOD_FADE_CROSSFADE
|
|
#define ASE_SRP_VERSION 100600
|
|
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment Frag
|
|
#pragma multi_compile_instancing
|
|
|
|
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl"
|
|
|
|
|
|
#define SHADERPASS SHADERPASS_FORWARD_EMISSIVE_MESH
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/Decal.hlsl"
|
|
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalPrepassBuffer.hlsl"
|
|
|
|
#define ASE_NEEDS_FRAG_TEXTURE_COORDINATES0
|
|
|
|
|
|
struct AttributesMesh
|
|
{
|
|
float3 positionOS : POSITION;
|
|
float3 normalOS : NORMAL;
|
|
float4 tangentOS : TANGENT;
|
|
float4 uv0 : TEXCOORD0;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct PackedVaryingsToPS
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
float3 interp0 : TEXCOORD0;
|
|
float3 interp1 : TEXCOORD1;
|
|
float4 interp2 : TEXCOORD2;
|
|
float4 interp3 : TEXCOORD3;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float _DecalQuantity;
|
|
float _DecalType;
|
|
float _NormalIntensity;
|
|
float _SmoothnessMultiplier;
|
|
float _DrawOrder;
|
|
float _DecalMeshBiasType;
|
|
float _DecalMeshDepthBias;
|
|
float _DecalMeshViewBias;
|
|
float _DecalStencilWriteMask;
|
|
float _DecalStencilRef;
|
|
#ifdef _MATERIAL_AFFECTS_ALBEDO
|
|
float _AffectAlbedo;
|
|
#endif
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
float _AffectNormal;
|
|
#endif
|
|
#ifdef _MATERIAL_AFFECTS_MASKMAP
|
|
float _AffectAO;
|
|
float _AffectMetal;
|
|
float _AffectSmoothness;
|
|
#endif
|
|
#ifdef _MATERIAL_AFFECTS_EMISSION
|
|
float _AffectEmission;
|
|
#endif
|
|
float _DecalColorMask0;
|
|
float _DecalColorMask1;
|
|
float _DecalColorMask2;
|
|
float _DecalColorMask3;
|
|
CBUFFER_END
|
|
|
|
sampler2D _dirt_decal_BaseColor;
|
|
sampler2D _Dirt_Decal_Normal;
|
|
sampler2D _dirt_decal_mask;
|
|
|
|
|
|
|
|
void GetSurfaceData(SurfaceDescription surfaceDescription, FragInputs fragInputs, float3 V, PositionInputs posInput, float angleFadeFactor, out DecalSurfaceData surfaceData)
|
|
{
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR)
|
|
float4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
float fadeFactor = clamp(normalToWorld[0][3], 0.0f, 1.0f) * angleFadeFactor;
|
|
float2 scale = float2(normalToWorld[3][0], normalToWorld[3][1]);
|
|
float2 offset = float2(normalToWorld[3][2], normalToWorld[3][3]);
|
|
fragInputs.texCoord0.xy = fragInputs.texCoord0.xy * scale + offset;
|
|
fragInputs.texCoord1.xy = fragInputs.texCoord1.xy * scale + offset;
|
|
fragInputs.texCoord2.xy = fragInputs.texCoord2.xy * scale + offset;
|
|
fragInputs.texCoord3.xy = fragInputs.texCoord3.xy * scale + offset;
|
|
fragInputs.positionRWS = posInput.positionWS;
|
|
fragInputs.tangentToWorld[2].xyz = TransformObjectToWorldDir(float3(0, 1, 0));
|
|
fragInputs.tangentToWorld[1].xyz = TransformObjectToWorldDir(float3(0, 0, 1));
|
|
#else
|
|
#ifdef LOD_FADE_CROSSFADE
|
|
LODDitheringTransition(ComputeFadeMaskSeed(V, posInput.positionSS), unity_LODFade.x);
|
|
#endif
|
|
|
|
float fadeFactor = 1.0;
|
|
#endif
|
|
|
|
ZERO_INITIALIZE(DecalSurfaceData, surfaceData);
|
|
|
|
#ifdef _MATERIAL_AFFECTS_EMISSION
|
|
surfaceData.emissive.rgb = surfaceDescription.Emission.rgb * fadeFactor;
|
|
#endif
|
|
|
|
#ifdef _MATERIAL_AFFECTS_ALBEDO
|
|
surfaceData.baseColor.xyz = surfaceDescription.BaseColor;
|
|
surfaceData.baseColor.w = surfaceDescription.Alpha * fadeFactor;
|
|
#endif
|
|
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR)
|
|
surfaceData.normalWS.xyz = mul((float3x3)normalToWorld, surfaceDescription.NormalTS);
|
|
#elif (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_FORWARD_PREVIEW)
|
|
surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(surfaceDescription.NormalTS, fragInputs.tangentToWorld));
|
|
#endif
|
|
|
|
surfaceData.normalWS.w = surfaceDescription.NormalAlpha * fadeFactor;
|
|
#else
|
|
#if (SHADERPASS == SHADERPASS_FORWARD_PREVIEW)
|
|
surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(float3(0.0, 0.0, 0.1), fragInputs.tangentToWorld));
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef _MATERIAL_AFFECTS_MASKMAP
|
|
surfaceData.mask.z = surfaceDescription.Smoothness;
|
|
surfaceData.mask.w = surfaceDescription.MAOSAlpha * fadeFactor;
|
|
|
|
#ifdef DECALS_4RT
|
|
surfaceData.mask.x = surfaceDescription.Metallic;
|
|
surfaceData.mask.y = surfaceDescription.Occlusion;
|
|
surfaceData.MAOSBlend.x = surfaceDescription.MAOSAlpha * fadeFactor;
|
|
surfaceData.MAOSBlend.y = surfaceDescription.MAOSAlpha * fadeFactor;
|
|
#endif
|
|
|
|
#endif
|
|
}
|
|
|
|
PackedVaryingsToPS Vert(AttributesMesh inputMesh )
|
|
{
|
|
PackedVaryingsToPS output;
|
|
|
|
UNITY_SETUP_INSTANCE_ID(inputMesh);
|
|
UNITY_TRANSFER_INSTANCE_ID(inputMesh, output);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
|
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
float3 defaultVertexValue = inputMesh.positionOS.xyz;
|
|
#else
|
|
float3 defaultVertexValue = float3( 0, 0, 0 );
|
|
#endif
|
|
float3 vertexValue = defaultVertexValue;
|
|
#ifdef ASE_ABSOLUTE_VERTEX_POS
|
|
inputMesh.positionOS.xyz = vertexValue;
|
|
#else
|
|
inputMesh.positionOS.xyz += vertexValue;
|
|
#endif
|
|
|
|
inputMesh.normalOS = inputMesh.normalOS;
|
|
inputMesh.tangentOS = inputMesh.tangentOS;
|
|
|
|
float3 positionRWS = TransformObjectToWorld(inputMesh.positionOS);
|
|
float3 normalWS = TransformObjectToWorldNormal(inputMesh.normalOS);
|
|
float4 tangentWS = float4(TransformObjectToWorldDir(inputMesh.tangentOS.xyz), inputMesh.tangentOS.w);
|
|
|
|
output.interp0.xyz = positionRWS;
|
|
output.positionCS = TransformWorldToHClip(positionRWS);
|
|
output.interp1.xyz = normalWS;
|
|
output.interp2.xyzw = tangentWS;
|
|
output.interp3.xyzw = inputMesh.uv0;
|
|
|
|
return output;
|
|
}
|
|
|
|
void Frag( PackedVaryingsToPS packedInput,
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
OUTPUT_DBUFFER(outDBuffer)
|
|
#else
|
|
out float4 outEmissive : SV_Target0
|
|
#endif
|
|
|
|
)
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);
|
|
UNITY_SETUP_INSTANCE_ID(packedInput);
|
|
|
|
FragInputs input;
|
|
ZERO_INITIALIZE(FragInputs, input);
|
|
|
|
input.tangentToWorld = k_identity3x3;
|
|
input.positionSS = packedInput.positionCS;
|
|
|
|
input.positionRWS = packedInput.interp0.xyz;
|
|
float3 positionRWS = input.positionRWS;
|
|
|
|
input.tangentToWorld = BuildTangentToWorld(packedInput.interp2.xyzw, packedInput.interp1.xyz);
|
|
input.texCoord0 = packedInput.interp3.xyzw;
|
|
|
|
DecalSurfaceData surfaceData;
|
|
float clipValue = 1.0;
|
|
float angleFadeFactor = 1.0;
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR)
|
|
|
|
float depth = LoadCameraDepth(input.positionSS.xy);
|
|
PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, depth, UNITY_MATRIX_I_VP, UNITY_MATRIX_V);
|
|
|
|
DecalPrepassData material;
|
|
ZERO_INITIALIZE(DecalPrepassData, material);
|
|
if (_EnableDecalLayers)
|
|
{
|
|
uint decalLayerMask = uint(UNITY_ACCESS_INSTANCED_PROP(Decal, _DecalLayerMaskFromDecal).x);
|
|
|
|
DecodeFromDecalPrepass(posInput.positionSS, material);
|
|
|
|
if ((decalLayerMask & material.decalLayerMask) == 0)
|
|
clipValue -= 2.0;
|
|
}
|
|
|
|
float3 positionDS = TransformWorldToObject(posInput.positionWS);
|
|
positionDS = positionDS * float3(1.0, -1.0, 1.0) + float3(0.5, 0.5, 0.5);
|
|
if (!(all(positionDS.xyz > 0.0f) && all(1.0f - positionDS.xyz > 0.0f)))
|
|
{
|
|
clipValue -= 2.0;
|
|
}
|
|
|
|
#ifndef SHADER_API_METAL
|
|
clip(clipValue);
|
|
#else
|
|
if (clipValue > 0.0)
|
|
{
|
|
#endif
|
|
input.texCoord0.xy = positionDS.xz;
|
|
input.texCoord1.xy = positionDS.xz;
|
|
input.texCoord2.xy = positionDS.xz;
|
|
input.texCoord3.xy = positionDS.xz;
|
|
|
|
float3 V = GetWorldSpaceNormalizeViewDir(posInput.positionWS);
|
|
|
|
if (_EnableDecalLayers)
|
|
{
|
|
float4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
float2 angleFade = float2(normalToWorld[1][3], normalToWorld[2][3]);
|
|
|
|
if (angleFade.x > 0.0f)
|
|
{
|
|
float dotAngle = 1.0 - dot(material.geomNormalWS, normalToWorld[2].xyz);
|
|
angleFadeFactor = 1.0 - saturate(dotAngle * angleFade.x + angleFade.y);
|
|
}
|
|
}
|
|
|
|
#else
|
|
PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz, uint2(0, 0));
|
|
float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);
|
|
#endif
|
|
|
|
float4 texCoord0 = input.texCoord0;
|
|
float4 texCoord1 = input.texCoord1;
|
|
float4 texCoord2 = input.texCoord2;
|
|
float4 texCoord3 = input.texCoord3;
|
|
|
|
SurfaceDescription surfaceDescription = (SurfaceDescription)0;
|
|
float2 texCoord25 = texCoord0.xy * float2( 1,1 ) + float2( 0,0 );
|
|
// *** BEGIN Flipbook UV Animation vars ***
|
|
// Total tiles of Flipbook Texture
|
|
float fbtotaltiles27 = _DecalQuantity * _DecalQuantity;
|
|
// Offsets for cols and rows of Flipbook Texture
|
|
float fbcolsoffset27 = 1.0f / _DecalQuantity;
|
|
float fbrowsoffset27 = 1.0f / _DecalQuantity;
|
|
// Speed of animation
|
|
float fbspeed27 = _Time[ 1 ] * 0.0;
|
|
// UV Tiling (col and row offset)
|
|
float2 fbtiling27 = float2(fbcolsoffset27, fbrowsoffset27);
|
|
// UV Offset - calculate current tile linear index, and convert it to (X * coloffset, Y * rowoffset)
|
|
// Calculate current tile linear index
|
|
float fbcurrenttileindex27 = round( fmod( fbspeed27 + _DecalType, fbtotaltiles27) );
|
|
fbcurrenttileindex27 += ( fbcurrenttileindex27 < 0) ? fbtotaltiles27 : 0;
|
|
// Obtain Offset X coordinate from current tile linear index
|
|
float fblinearindextox27 = round ( fmod ( fbcurrenttileindex27, _DecalQuantity ) );
|
|
// Multiply Offset X by coloffset
|
|
float fboffsetx27 = fblinearindextox27 * fbcolsoffset27;
|
|
// Obtain Offset Y coordinate from current tile linear index
|
|
float fblinearindextoy27 = round( fmod( ( fbcurrenttileindex27 - fblinearindextox27 ) / _DecalQuantity, _DecalQuantity ) );
|
|
// Reverse Y to get tiles from Top to Bottom
|
|
fblinearindextoy27 = (int)(_DecalQuantity-1) - fblinearindextoy27;
|
|
// Multiply Offset Y by rowoffset
|
|
float fboffsety27 = fblinearindextoy27 * fbrowsoffset27;
|
|
// UV Offset
|
|
float2 fboffset27 = float2(fboffsetx27, fboffsety27);
|
|
// Flipbook UV
|
|
half2 fbuv27 = texCoord25 * fbtiling27 + fboffset27;
|
|
// *** END Flipbook UV Animation vars ***
|
|
float4 tex2DNode17 = tex2D( _dirt_decal_BaseColor, fbuv27 );
|
|
|
|
float3 unpack19 = UnpackNormalScale( tex2D( _Dirt_Decal_Normal, fbuv27 ), _NormalIntensity );
|
|
unpack19.z = lerp( 1, unpack19.z, saturate(_NormalIntensity) );
|
|
|
|
float4 tex2DNode18 = tex2D( _dirt_decal_mask, fbuv27 );
|
|
|
|
surfaceDescription.BaseColor = tex2DNode17.rgb;
|
|
surfaceDescription.Alpha = tex2DNode17.a;
|
|
surfaceDescription.NormalTS = unpack19;
|
|
surfaceDescription.NormalAlpha = tex2DNode17.a;
|
|
surfaceDescription.Metallic = tex2DNode18.r;
|
|
surfaceDescription.Occlusion = tex2DNode18.g;
|
|
surfaceDescription.Smoothness = ( tex2DNode18.a * _SmoothnessMultiplier );
|
|
surfaceDescription.MAOSAlpha = tex2DNode17.a;
|
|
surfaceDescription.Emission = float3( 0, 0, 0 );
|
|
|
|
GetSurfaceData(surfaceDescription, input, V, posInput, angleFadeFactor, surfaceData);
|
|
|
|
#if ((SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR)) && defined(SHADER_API_METAL)
|
|
}
|
|
|
|
clip(clipValue);
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
ENCODE_INTO_DBUFFER(surfaceData, outDBuffer);
|
|
#else
|
|
outEmissive.rgb = surfaceData.emissive * GetCurrentExposureMultiplier();
|
|
outEmissive.a = 1.0;
|
|
#endif
|
|
}
|
|
ENDHLSL
|
|
}
|
|
|
|
}
|
|
CustomEditor "Rendering.HighDefinition.DecalGUI"
|
|
FallBack "Hidden/Shader Graph/FallbackError"
|
|
|
|
|
|
}
|
|
/*ASEBEGIN
|
|
Version=18916
|
|
402;73;932;745;1156.947;602.8143;1.59791;True;False
|
|
Node;AmplifyShaderEditor.CommentaryNode;30;-1837.536,-303.4446;Inherit;False;673;397;Decal flipbook, put all your decals in a single atlas to simplify their use.;4;25;29;28;27;;1,1,1,1;0;0
|
|
Node;AmplifyShaderEditor.RangedFloatNode;29;-1698.536,-22.44458;Inherit;False;Property;_DecalType;Decal Type;6;0;Create;True;0;0;0;False;0;False;0;4;0;0;0;1;FLOAT;0
|
|
Node;AmplifyShaderEditor.TextureCoordinatesNode;25;-1787.536,-253.4446;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
|
|
Node;AmplifyShaderEditor.RangedFloatNode;28;-1749.536,-124.4446;Inherit;False;Property;_DecalQuantity;Decal Quantity;5;0;Create;True;0;0;0;False;0;False;0;2;0;0;0;1;FLOAT;0
|
|
Node;AmplifyShaderEditor.TFHCFlipBookUVAnimation;27;-1417.536,-217.4446;Inherit;False;0;0;6;0;FLOAT2;0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;3;FLOAT2;0;FLOAT;1;FLOAT;2
|
|
Node;AmplifyShaderEditor.RangedFloatNode;24;-930.5359,-122.4446;Inherit;False;Property;_NormalIntensity;Normal Intensity;4;0;Create;True;0;0;0;False;0;False;0;1;0;0;0;1;FLOAT;0
|
|
Node;AmplifyShaderEditor.SamplerNode;18;-719.5359,6.555405;Inherit;True;Property;_dirt_decal_mask;dirt_decal_mask;1;0;Create;True;0;0;0;False;0;False;-1;None;5eb344b0d2df6894484b5d44dbd0fc33;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
|
|
Node;AmplifyShaderEditor.RangedFloatNode;20;-730.5641,306.9949;Inherit;False;Property;_SmoothnessMultiplier;Smoothness Multiplier;3;0;Create;True;0;0;0;False;0;False;0;0.541;0;1;0;1;FLOAT;0
|
|
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;21;-276.7078,174.2343;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
|
|
Node;AmplifyShaderEditor.SamplerNode;17;-717.5359,-407.4446;Inherit;True;Property;_dirt_decal_BaseColor;dirt_decal_BaseColor;0;0;Create;True;0;0;0;False;0;False;-1;39445ba53e51aa64db46d5293b29da39;39445ba53e51aa64db46d5293b29da39;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
|
|
Node;AmplifyShaderEditor.SamplerNode;19;-705.5359,-210.4446;Inherit;True;Property;_Dirt_Decal_Normal;Dirt_Decal_Normal;2;0;Create;True;0;0;0;False;0;False;-1;bca2297e6d257934b865d220d15e2689;bca2297e6d257934b865d220d15e2689;True;0;True;bump;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
|
|
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;32;-13,-105;Float;False;True;-1;2;Rendering.HighDefinition.DecalGUI;0;10;ASESampleShaders/Decals Muddy Ground/GroundDecals;d345501910c196f4a81c9eff8a0a5ad7;True;DBufferProjector;0;0;DBufferProjector;12;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;3;RenderPipeline=HDRenderPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;5;True;7;d3d11;metal;vulkan;xboxone;xboxseries;playstation;switch;0;False;True;2;5;False;-1;10;False;-1;1;0;False;-1;10;False;-1;False;False;True;2;5;False;-1;10;False;-1;1;0;False;-1;10;False;-1;False;False;True;2;5;False;-1;10;False;-1;1;0;False;-1;10;False;-1;False;False;True;1;0;False;-1;6;False;-1;0;1;False;-1;0;False;-1;False;False;False;True;1;False;-1;False;False;False;True;True;True;True;True;0;True;-15;False;True;True;True;True;True;0;True;-16;False;True;True;True;True;True;0;True;-17;False;True;True;0;True;-7;255;False;-1;255;True;-6;7;False;-1;3;False;-1;1;False;-1;1;False;-1;7;False;-1;3;False;-1;1;False;-1;1;False;-1;False;True;2;False;-1;True;2;False;-1;False;True;1;LightMode=DBufferProjector;False;False;0;;0;0;Standard;8;Affect BaseColor;1;Affect Normal;1;Affect Metal;1;Affect AO;1;Affect Smoothness;1;Affect Emission;1;Support LOD CrossFade;1;Vertex Position,InvertActionOnDeselection;1;0;4;True;True;True;True;False;;False;0
|
|
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;33;-13,-105;Float;False;False;-1;2;Rendering.HighDefinition.DecalGUI;0;1;New Amplify Shader;d345501910c196f4a81c9eff8a0a5ad7;True;DecalProjectorForwardEmissive;0;1;DecalProjectorForwardEmissive;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;3;RenderPipeline=HDRenderPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;5;True;7;d3d11;metal;vulkan;xboxone;xboxseries;playstation;switch;0;False;True;8;5;False;-1;1;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;-1;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;True;2;False;-1;False;True;1;LightMode=DecalProjectorForwardEmissive;False;False;0;;0;0;Standard;0;False;0
|
|
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;34;-13,-105;Float;False;False;-1;2;Rendering.HighDefinition.DecalGUI;0;1;New Amplify Shader;d345501910c196f4a81c9eff8a0a5ad7;True;DBufferMesh;0;2;DBufferMesh;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;3;RenderPipeline=HDRenderPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;5;True;7;d3d11;metal;vulkan;xboxone;xboxseries;playstation;switch;0;False;True;2;5;False;-1;10;False;-1;1;0;False;-1;10;False;-1;False;False;True;2;5;False;-1;10;False;-1;1;0;False;-1;10;False;-1;False;False;True;2;5;False;-1;10;False;-1;1;0;False;-1;10;False;-1;False;False;True;1;0;False;-1;6;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;True;True;True;True;True;0;True;-15;False;True;True;True;True;True;0;True;-16;False;True;True;True;True;True;0;True;-17;False;True;True;0;True;-7;255;False;-1;255;True;-6;7;False;-1;3;False;-1;1;False;-1;1;False;-1;7;False;-1;3;False;-1;1;False;-1;1;False;-1;False;True;2;False;-1;True;3;False;-1;False;True;1;LightMode=DBufferMesh;False;False;0;;0;0;Standard;0;False;0
|
|
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;35;-13,-105;Float;False;False;-1;2;Rendering.HighDefinition.DecalGUI;0;1;New Amplify Shader;d345501910c196f4a81c9eff8a0a5ad7;True;DecalMeshForwardEmissive;0;3;DecalMeshForwardEmissive;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;3;RenderPipeline=HDRenderPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;5;True;7;d3d11;metal;vulkan;xboxone;xboxseries;playstation;switch;0;False;True;8;5;False;-1;1;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;False;-1;True;3;False;-1;False;True;1;LightMode=DecalMeshForwardEmissive;False;False;0;;0;0;Standard;0;False;0
|
|
WireConnection;27;0;25;0
|
|
WireConnection;27;1;28;0
|
|
WireConnection;27;2;28;0
|
|
WireConnection;27;4;29;0
|
|
WireConnection;18;1;27;0
|
|
WireConnection;21;0;18;4
|
|
WireConnection;21;1;20;0
|
|
WireConnection;17;1;27;0
|
|
WireConnection;19;1;27;0
|
|
WireConnection;19;5;24;0
|
|
WireConnection;32;0;17;0
|
|
WireConnection;32;1;17;4
|
|
WireConnection;32;2;19;0
|
|
WireConnection;32;3;17;4
|
|
WireConnection;32;4;18;1
|
|
WireConnection;32;5;18;2
|
|
WireConnection;32;6;21;0
|
|
WireConnection;32;7;17;4
|
|
ASEEND*/
|
|
//CHKSM=342A718BAC4CECC90EB230087109C2B6B58721FB |