- Etc/Prop 폴더 내용을 기존 Prop/Glb 폴더로 통합 - 모든 Prop을 개별 한글 폴더로 정리: - Acoustic Guitar → 어쿠스틱 기타 - Cake → 케이크 - Candle Light Mesh → 촛불 - Drum_Stick → 드럼스틱 - GuitarE → 일렉기타 - Hand Mic → 핸드마이크 - Heart Balloons Prop → 하트풍선 - Heart Cheering Rod → 하트 응원봉 - LongChair → 긴의자 - Megaphone → 확성기 - Mic → 마이크 - RingCon → 링콘 - Stand MicroPhone → 스탠드마이크 - [Office]Chair/Desk → 사무용의자/사무용책상 - [Prop]Desk → 책상 - 외 다수 - GLB/FBX 파일명도 폴더명과 동일하게 한글로 변경 - 사용하지 않는 External/Skybox, #Prefab, #Roadmap 폴더 정리 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
3256 lines
139 KiB
GLSL
3256 lines
139 KiB
GLSL
// Made with Amplify Shader Editor v1.9.9.4
|
|
// Available at the Unity Asset Store - http://u3d.as/y3X
|
|
Shader "Util function/Fake Shadow"
|
|
{
|
|
Properties
|
|
{
|
|
[HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5
|
|
[HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1)
|
|
_ShadowColor( "Shadow Color", Color ) = ( 1, 1, 1, 1 )
|
|
_MainTex( "MainTex", 2D ) = "white" {}
|
|
_BlurRadius( "Blur Radius", Range( 0, 10 ) ) = 0
|
|
|
|
|
|
[HideInInspector] _DrawOrder("Draw Order", Range(-50, 50)) = 0
|
|
[HideInInspector][Enum(Depth Bias, 0, View Bias, 1)] _DecalMeshBiasType("DecalMesh BiasType", Float) = 0
|
|
|
|
[HideInInspector] _DecalMeshDepthBias("DecalMesh DepthBias", Float) = 0
|
|
[HideInInspector] _DecalMeshViewBias("DecalMesh ViewBias", Float) = 0
|
|
|
|
[HideInInspector][NoScaleOffset] unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {}
|
|
[HideInInspector][NoScaleOffset] unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {}
|
|
[HideInInspector][NoScaleOffset] unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {}
|
|
|
|
//[HideInInspector] _DecalAngleFadeSupported("Decal Angle Fade Supported", Float) = 1
|
|
}
|
|
|
|
SubShader
|
|
{
|
|
LOD 0
|
|
|
|
|
|
|
|
Tags { "RenderPipeline"="UniversalPipeline" "PreviewType"="Plane" "DisableBatching"="LODFading" "ShaderGraphShader"="true" "ShaderGraphTargetId"="UniversalDecalSubTarget" }
|
|
|
|
HLSLINCLUDE
|
|
#pragma target 3.5
|
|
#pragma prefer_hlslcc gles
|
|
// ensure rendering platforms toggle list is visible
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Filtering.hlsl"
|
|
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
|
|
ZTest Greater
|
|
ZWrite Off
|
|
ColorMask RGBA
|
|
ColorMask 0 1
|
|
ColorMask RGBA 2
|
|
|
|
HLSLPROGRAM
|
|
|
|
#define _MATERIAL_AFFECTS_ALBEDO 1
|
|
#define _MATERIAL_AFFECTS_NORMAL_BLEND 1
|
|
#define ASE_VERSION 19904
|
|
#define ASE_SRP_VERSION 170200
|
|
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment Frag
|
|
|
|
#pragma exclude_renderers glcore gles gles3
|
|
#pragma multi_compile_instancing
|
|
#pragma editor_sync_compilation
|
|
|
|
#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3
|
|
#pragma multi_compile _ _DECAL_LAYERS
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
|
|
#define HAVE_MESH_MODIFICATION
|
|
#define SHADERPASS SHADERPASS_DBUFFER_PROJECTOR
|
|
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Fog.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#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/Input.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DebugMipmapStreamingMacros.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ProbeVolumeVariants.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DecalInput.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderVariablesDecal.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl"
|
|
|
|
#if defined(LOD_FADE_CROSSFADE)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/LODCrossFade.hlsl"
|
|
#endif
|
|
|
|
#if _RENDER_PASS_ENABLED
|
|
#define GBUFFER3 0
|
|
#define GBUFFER4 1
|
|
FRAMEBUFFER_INPUT_X_HALF(GBUFFER3);
|
|
FRAMEBUFFER_INPUT_X_UINT(GBUFFER4);
|
|
#endif
|
|
|
|
#define ASE_NEEDS_FRAG_TEXTURE_COORDINATES0
|
|
|
|
|
|
struct SurfaceDescription
|
|
{
|
|
float3 BaseColor;
|
|
float Alpha;
|
|
float3 NormalTS;
|
|
float NormalAlpha;
|
|
float Metallic;
|
|
float Occlusion;
|
|
float Smoothness;
|
|
float MAOSAlpha;
|
|
};
|
|
|
|
struct Attributes
|
|
{
|
|
float3 positionOS : POSITION;
|
|
float3 normalOS : NORMAL;
|
|
float4 tangentOS : TANGENT;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct PackedVaryings
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _ShadowColor;
|
|
float _BlurRadius;
|
|
float _DrawOrder;
|
|
float _DecalMeshBiasType;
|
|
float _DecalMeshDepthBias;
|
|
float _DecalMeshViewBias;
|
|
#if defined(DECAL_ANGLE_FADE)
|
|
float _DecalAngleFadeSupported;
|
|
#endif
|
|
UNITY_TEXTURE_STREAMING_DEBUG_VARS;
|
|
CBUFFER_END
|
|
|
|
#ifdef SCENEPICKINGPASS
|
|
float4 _SelectionID;
|
|
#endif
|
|
|
|
#ifdef SCENESELECTIONPASS
|
|
int _ObjectId;
|
|
int _PassValue;
|
|
#endif
|
|
|
|
sampler2D _MainTex;
|
|
|
|
|
|
float GaussianBlur23( sampler2D tex, float2 uv, float2 texelSize, float blurRadius )
|
|
{
|
|
float kernel[12] = {0.02, 0.05, 0.08, 0.12, 0.15, 0.18, 0.18, 0.15, 0.12, 0.08, 0.05, 0.02};
|
|
float kernelSum = 0.0;
|
|
float blurResult = 0.0;
|
|
for (int x = -6; x <= 6; x++) {
|
|
for (int y = -6; y <= 6; y++) {
|
|
float2 sampleUV = uv + texelSize * float2(x, y) * blurRadius;
|
|
float weight = kernel[abs(x)] * kernel[abs(y)];
|
|
|
|
// 텍스처 샘플링
|
|
float4 texColor = tex2D(tex, sampleUV);
|
|
|
|
// RGB → 그레이스케일 (luminance 방식)
|
|
float grayscale = dot(texColor.rgb, float3(0.299, 0.587, 0.114));
|
|
|
|
// 그레이스케일 * 1000000 → 클램프(0,1)
|
|
float boostedGray = saturate(grayscale * 1000000.0);
|
|
|
|
// 알파와 더하기 → 클램프(0,1)
|
|
float combined = saturate(boostedGray + texColor.a);
|
|
|
|
// 가중치 적용
|
|
blurResult += combined * weight;
|
|
kernelSum += weight;
|
|
}
|
|
}
|
|
return blurResult / kernelSum;
|
|
}
|
|
|
|
|
|
void GetSurfaceData(SurfaceDescription surfaceDescription, float angleFadeFactor, out DecalSurfaceData surfaceData)
|
|
{
|
|
half4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
half 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]);
|
|
|
|
ZERO_INITIALIZE(DecalSurfaceData, surfaceData);
|
|
surfaceData.occlusion = half(1.0);
|
|
surfaceData.smoothness = half(0);
|
|
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
surfaceData.normalWS.w = half(1.0);
|
|
#else
|
|
surfaceData.normalWS.w = half(0.0);
|
|
#endif
|
|
|
|
surfaceData.baseColor.xyz = half3(surfaceDescription.BaseColor);
|
|
surfaceData.baseColor.w = half(surfaceDescription.Alpha * fadeFactor);
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR)
|
|
#if defined(_MATERIAL_AFFECTS_NORMAL)
|
|
surfaceData.normalWS.xyz = normalize(mul((half3x3)normalToWorld, surfaceDescription.NormalTS.xyz));
|
|
#else
|
|
surfaceData.normalWS.xyz = normalize(normalToWorld[2].xyz);
|
|
#endif
|
|
#elif (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#if defined(_MATERIAL_AFFECTS_NORMAL)
|
|
float sgn = input.tangentWS.w;
|
|
float3 bitangent = sgn * cross(input.normalWS.xyz, input.tangentWS.xyz);
|
|
half3x3 tangentToWorld = half3x3(input.tangentWS.xyz, bitangent.xyz, input.normalWS.xyz);
|
|
surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(surfaceDescription.NormalTS, tangentToWorld));
|
|
#else
|
|
surfaceData.normalWS.xyz = normalize(half3(input.normalWS));
|
|
#endif
|
|
#endif
|
|
|
|
surfaceData.normalWS.w = surfaceDescription.NormalAlpha * fadeFactor;
|
|
|
|
#if defined( _MATERIAL_AFFECTS_MAOS )
|
|
surfaceData.metallic = half(surfaceDescription.Metallic);
|
|
surfaceData.occlusion = half(surfaceDescription.Occlusion);
|
|
surfaceData.smoothness = half(surfaceDescription.Smoothness);
|
|
surfaceData.MAOSAlpha = half(surfaceDescription.MAOSAlpha * fadeFactor);
|
|
#endif
|
|
}
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR)
|
|
#define DECAL_PROJECTOR
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_MESH
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
#define DECAL_DBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH)
|
|
#define DECAL_SCREEN_SPACE
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_GBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH)
|
|
#define DECAL_FORWARD_EMISSIVE
|
|
#endif
|
|
|
|
#if ((!defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_ALBEDO)) || (defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_NORMAL_BLEND))) && (defined(DECAL_SCREEN_SPACE) || defined(DECAL_GBUFFER))
|
|
#define DECAL_RECONSTRUCT_NORMAL
|
|
#elif defined(DECAL_ANGLE_FADE)
|
|
#define DECAL_LOAD_NORMAL
|
|
#endif
|
|
|
|
#ifdef _DECAL_LAYERS
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareRenderingLayerTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_LOAD_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_PROJECTOR) || defined(DECAL_RECONSTRUCT_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_MESH
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/DecalMeshBiasTypeEnum.cs.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_RECONSTRUCT_NORMAL
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/NormalReconstruction.hlsl"
|
|
#endif
|
|
|
|
PackedVaryings Vert(Attributes inputMesh )
|
|
{
|
|
PackedVaryings packedOutput;
|
|
ZERO_INITIALIZE(PackedVaryings, packedOutput);
|
|
|
|
UNITY_SETUP_INSTANCE_ID(inputMesh);
|
|
UNITY_TRANSFER_INSTANCE_ID(inputMesh, packedOutput);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(packedOutput);
|
|
|
|
inputMesh.tangentOS = float4( 1, 0, 0, -1 );
|
|
inputMesh.normalOS = float3( 0, 1, 0 );
|
|
|
|
|
|
|
|
VertexPositionInputs vertexInput = GetVertexPositionInputs(inputMesh.positionOS.xyz);
|
|
|
|
float3 positionWS = TransformObjectToWorld(inputMesh.positionOS);
|
|
packedOutput.positionCS = TransformWorldToHClip(positionWS);
|
|
|
|
return packedOutput;
|
|
}
|
|
|
|
void Frag(PackedVaryings packedInput,
|
|
OUTPUT_DBUFFER(outDBuffer)
|
|
|
|
)
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);
|
|
UNITY_SETUP_INSTANCE_ID(packedInput);
|
|
|
|
half angleFadeFactor = 1.0;
|
|
|
|
#ifdef _DECAL_LAYERS
|
|
#ifdef _RENDER_PASS_ENABLED
|
|
uint surfaceRenderingLayer = DecodeMeshRenderingLayer(LOAD_FRAMEBUFFER_INPUT(GBUFFER4, packedInput.positionCS.xy).r);
|
|
#else
|
|
uint surfaceRenderingLayer = LoadSceneRenderingLayer(packedInput.positionCS.xy);
|
|
#endif
|
|
uint projectorRenderingLayer = uint(UNITY_ACCESS_INSTANCED_PROP(Decal, _DecalLayerMaskFromDecal));
|
|
clip((surfaceRenderingLayer & projectorRenderingLayer) - 0.1);
|
|
#endif
|
|
|
|
#if defined(DECAL_PROJECTOR)
|
|
#if UNITY_REVERSED_Z
|
|
#if _RENDER_PASS_ENABLED
|
|
float depth = LOAD_FRAMEBUFFER_X_INPUT(GBUFFER3, packedInput.positionCS.xy).x;
|
|
#else
|
|
float depth = LoadSceneDepth(packedInput.positionCS.xy);
|
|
#endif
|
|
#else
|
|
#if _RENDER_PASS_ENABLED
|
|
float depth = lerp(UNITY_NEAR_CLIP_VALUE, 1, LOAD_FRAMEBUFFER_X_INPUT(GBUFFER3, packedInput.positionCS.xy));
|
|
#else
|
|
float depth = lerp(UNITY_NEAR_CLIP_VALUE, 1, LoadSceneDepth(packedInput.positionCS.xy));
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(DECAL_RECONSTRUCT_NORMAL)
|
|
#if defined(_DECAL_NORMAL_BLEND_HIGH)
|
|
half3 normalWS = half3(ReconstructNormalTap9(packedInput.positionCS.xy));
|
|
#elif defined(_DECAL_NORMAL_BLEND_MEDIUM)
|
|
half3 normalWS = half3(ReconstructNormalTap5(packedInput.positionCS.xy));
|
|
#else
|
|
half3 normalWS = half3(ReconstructNormalDerivative(packedInput.positionCS.xy));
|
|
#endif
|
|
#elif defined(DECAL_LOAD_NORMAL)
|
|
half3 normalWS = half3(LoadSceneNormals(packedInput.positionCS.xy));
|
|
#endif
|
|
|
|
float2 positionSS = FoveatedRemapNonUniformToLinearCS(packedInput.positionCS.xy) * _ScreenSize.zw;
|
|
|
|
float4 positionCS = ComputeClipSpacePosition( positionSS, depth );
|
|
float4 hpositionVS = mul( UNITY_MATRIX_I_P, positionCS );
|
|
|
|
float4 ScreenPosNorm = float4( positionSS, positionCS.zw );
|
|
float4 ClipPos = positionCS * packedInput.positionCS.w;
|
|
float4 ScreenPos = ComputeScreenPos( ClipPos );
|
|
float3 PositionRWS = mul( ( float3x3 )UNITY_MATRIX_I_V, hpositionVS.xyz / hpositionVS.w );
|
|
float3 PositionWS = PositionRWS + _WorldSpaceCameraPos;
|
|
float3 PositionOS = TransformWorldToObject( PositionWS );
|
|
float3 PositionVS = TransformWorldToView( PositionWS );
|
|
|
|
float3 positionDS = TransformWorldToObject(PositionWS);
|
|
positionDS = positionDS * float3(1.0, -1.0, 1.0);
|
|
|
|
float clipValue = 0.5 - Max3(abs(positionDS).x, abs(positionDS).y, abs(positionDS).z);
|
|
clip(clipValue);
|
|
|
|
float2 texCoord = positionDS.xz + float2(0.5, 0.5);
|
|
|
|
float4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
float2 scale = float2(normalToWorld[3][0], normalToWorld[3][1]);
|
|
float2 offset = float2(normalToWorld[3][2], normalToWorld[3][3]);
|
|
texCoord.xy = texCoord.xy * scale + offset;
|
|
|
|
float2 texCoord0 = texCoord;
|
|
float2 texCoord1 = texCoord;
|
|
float2 texCoord2 = texCoord;
|
|
float2 texCoord3 = texCoord;
|
|
|
|
float3 worldTangent = TransformObjectToWorldDir(float3(1, 0, 0));
|
|
float3 worldNormal = TransformObjectToWorldDir(float3(0, 1, 0));
|
|
float3 worldBitangent = TransformObjectToWorldDir(float3(0, 0, 1));
|
|
|
|
#ifdef DECAL_ANGLE_FADE
|
|
half2 angleFade = half2(normalToWorld[1][3], normalToWorld[2][3]);
|
|
|
|
if (angleFade.y < 0.0f)
|
|
{
|
|
half3 decalNormal = half3(normalToWorld[0].z, normalToWorld[1].z, normalToWorld[2].z);
|
|
half dotAngle = dot(normalWS, decalNormal);
|
|
angleFadeFactor = saturate(angleFade.x + angleFade.y * (dotAngle * (dotAngle - 2.0)));
|
|
}
|
|
#endif
|
|
|
|
half3 viewDirectionWS = half3(1.0, 1.0, 1.0);
|
|
DecalSurfaceData surfaceData;
|
|
|
|
SurfaceDescription surfaceDescription = (SurfaceDescription)0;
|
|
|
|
sampler2D tex23 = _MainTex;
|
|
float2 texCoord28 = texCoord0 * float2( 1,1 ) + float2( 0,0 );
|
|
float2 uv23 = texCoord28;
|
|
float2 texelSize23 = float2( 0.0002441406,0.0002441406 );
|
|
float blurRadius23 = _BlurRadius;
|
|
float localGaussianBlur23 = GaussianBlur23( tex23 , uv23 , texelSize23 , blurRadius23 );
|
|
float4 temp_output_20_0 = ( localGaussianBlur23 * _ShadowColor );
|
|
|
|
|
|
surfaceDescription.BaseColor = temp_output_20_0.rgb;
|
|
surfaceDescription.Alpha = temp_output_20_0.a;
|
|
surfaceDescription.NormalTS = float3(0.0f, 0.0f, 1.0f);
|
|
surfaceDescription.NormalAlpha = 1;
|
|
|
|
#if defined( _MATERIAL_AFFECTS_MAOS )
|
|
surfaceDescription.Metallic = 0;
|
|
surfaceDescription.Occlusion = 1;
|
|
surfaceDescription.Smoothness = 0.5;
|
|
surfaceDescription.MAOSAlpha = 1;
|
|
#endif
|
|
|
|
GetSurfaceData(surfaceDescription, angleFadeFactor, surfaceData);
|
|
ENCODE_INTO_DBUFFER(surfaceData, outDBuffer);
|
|
|
|
}
|
|
ENDHLSL
|
|
}
|
|
|
|
|
|
Pass
|
|
{
|
|
|
|
Name "DecalScreenSpaceProjector"
|
|
Tags { "LightMode"="DecalScreenSpaceProjector" }
|
|
|
|
Cull Front
|
|
Blend SrcAlpha OneMinusSrcAlpha
|
|
ZTest Greater
|
|
ZWrite Off
|
|
|
|
HLSLPROGRAM
|
|
|
|
#define _MATERIAL_AFFECTS_ALBEDO 1
|
|
#define _MATERIAL_AFFECTS_NORMAL_BLEND 1
|
|
#define ASE_VERSION 19904
|
|
#define ASE_SRP_VERSION 170200
|
|
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment Frag
|
|
#pragma multi_compile_instancing
|
|
#pragma editor_sync_compilation
|
|
|
|
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN
|
|
#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
|
|
#pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS
|
|
#pragma multi_compile_fragment _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH
|
|
#pragma multi_compile _ _CLUSTER_LIGHT_LOOP
|
|
#pragma multi_compile_fragment _ _LIGHT_COOKIES
|
|
#pragma multi_compile_fragment _ DEBUG_DISPLAY
|
|
#pragma multi_compile _DECAL_NORMAL_BLEND_LOW _DECAL_NORMAL_BLEND_MEDIUM _DECAL_NORMAL_BLEND_HIGH
|
|
#pragma multi_compile _ _DECAL_LAYERS
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
|
|
#define ATTRIBUTES_NEED_NORMAL
|
|
#define ATTRIBUTES_NEED_TEXCOORD0
|
|
#define VARYINGS_NEED_NORMAL_WS
|
|
#define VARYINGS_NEED_TEXCOORD0
|
|
#define VARYINGS_NEED_VIEWDIRECTION_WS
|
|
#define VARYINGS_NEED_FOG_AND_VERTEX_LIGHT
|
|
#define VARYINGS_NEED_SH
|
|
#define VARYINGS_NEED_STATIC_LIGHTMAP_UV
|
|
#define VARYINGS_NEED_DYNAMIC_LIGHTMAP_UV
|
|
|
|
#define HAVE_MESH_MODIFICATION
|
|
|
|
#define SHADERPASS SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR
|
|
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Fog.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#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/Input.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DebugMipmapStreamingMacros.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ProbeVolumeVariants.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DecalInput.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderVariablesDecal.hlsl"
|
|
|
|
#if defined(LOD_FADE_CROSSFADE)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/LODCrossFade.hlsl"
|
|
#endif
|
|
|
|
#if _RENDER_PASS_ENABLED
|
|
#define GBUFFER3 0
|
|
#define GBUFFER4 1
|
|
FRAMEBUFFER_INPUT_X_HALF(GBUFFER3);
|
|
FRAMEBUFFER_INPUT_X_UINT(GBUFFER4);
|
|
#endif
|
|
|
|
#define ASE_NEEDS_FRAG_TEXTURE_COORDINATES0
|
|
|
|
|
|
struct SurfaceDescription
|
|
{
|
|
float3 BaseColor;
|
|
float Alpha;
|
|
float3 NormalTS;
|
|
float NormalAlpha;
|
|
float Metallic;
|
|
float Occlusion;
|
|
float Smoothness;
|
|
float MAOSAlpha;
|
|
float3 Emission;
|
|
};
|
|
|
|
struct Attributes
|
|
{
|
|
float3 positionOS : POSITION;
|
|
float3 normalOS : NORMAL;
|
|
float4 tangentOS : TANGENT;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct PackedVaryings
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
float3 normalWS : TEXCOORD0;
|
|
float3 viewDirectionWS : TEXCOORD1;
|
|
float4 lightmapUVs : TEXCOORD2; // @diogo: packs both static (xy) and dynamic (zw)
|
|
float3 sh : TEXCOORD3;
|
|
float4 fogFactorAndVertexLight : TEXCOORD4;
|
|
#ifdef USE_APV_PROBE_OCCLUSION
|
|
float4 probeOcclusion : TEXCOORD5;
|
|
#endif
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _ShadowColor;
|
|
float _BlurRadius;
|
|
float _DrawOrder;
|
|
float _DecalMeshBiasType;
|
|
float _DecalMeshDepthBias;
|
|
float _DecalMeshViewBias;
|
|
#if defined(DECAL_ANGLE_FADE)
|
|
float _DecalAngleFadeSupported;
|
|
#endif
|
|
UNITY_TEXTURE_STREAMING_DEBUG_VARS;
|
|
CBUFFER_END
|
|
|
|
#ifdef SCENEPICKINGPASS
|
|
float4 _SelectionID;
|
|
#endif
|
|
|
|
#ifdef SCENESELECTIONPASS
|
|
int _ObjectId;
|
|
int _PassValue;
|
|
#endif
|
|
|
|
sampler2D _MainTex;
|
|
|
|
|
|
float GaussianBlur23( sampler2D tex, float2 uv, float2 texelSize, float blurRadius )
|
|
{
|
|
float kernel[12] = {0.02, 0.05, 0.08, 0.12, 0.15, 0.18, 0.18, 0.15, 0.12, 0.08, 0.05, 0.02};
|
|
float kernelSum = 0.0;
|
|
float blurResult = 0.0;
|
|
for (int x = -6; x <= 6; x++) {
|
|
for (int y = -6; y <= 6; y++) {
|
|
float2 sampleUV = uv + texelSize * float2(x, y) * blurRadius;
|
|
float weight = kernel[abs(x)] * kernel[abs(y)];
|
|
|
|
// 텍스처 샘플링
|
|
float4 texColor = tex2D(tex, sampleUV);
|
|
|
|
// RGB → 그레이스케일 (luminance 방식)
|
|
float grayscale = dot(texColor.rgb, float3(0.299, 0.587, 0.114));
|
|
|
|
// 그레이스케일 * 1000000 → 클램프(0,1)
|
|
float boostedGray = saturate(grayscale * 1000000.0);
|
|
|
|
// 알파와 더하기 → 클램프(0,1)
|
|
float combined = saturate(boostedGray + texColor.a);
|
|
|
|
// 가중치 적용
|
|
blurResult += combined * weight;
|
|
kernelSum += weight;
|
|
}
|
|
}
|
|
return blurResult / kernelSum;
|
|
}
|
|
|
|
|
|
void GetSurfaceData(SurfaceDescription surfaceDescription, float angleFadeFactor, out DecalSurfaceData surfaceData)
|
|
{
|
|
half4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
half 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]);
|
|
|
|
ZERO_INITIALIZE(DecalSurfaceData, surfaceData);
|
|
surfaceData.occlusion = half(1.0);
|
|
surfaceData.smoothness = half(0);
|
|
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
surfaceData.normalWS.w = half(1.0);
|
|
#else
|
|
surfaceData.normalWS.w = half(0.0);
|
|
#endif
|
|
|
|
#if defined( _MATERIAL_AFFECTS_EMISSION )
|
|
surfaceData.emissive.rgb = half3(surfaceDescription.Emission.rgb * fadeFactor);
|
|
#endif
|
|
|
|
surfaceData.baseColor.xyz = half3(surfaceDescription.BaseColor);
|
|
surfaceData.baseColor.w = half(surfaceDescription.Alpha * fadeFactor);
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR)
|
|
#if defined(_MATERIAL_AFFECTS_NORMAL)
|
|
surfaceData.normalWS.xyz = normalize(mul((half3x3)normalToWorld, surfaceDescription.NormalTS.xyz));
|
|
#else
|
|
surfaceData.normalWS.xyz = normalize(normalToWorld[2].xyz);
|
|
#endif
|
|
#elif (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#if defined(_MATERIAL_AFFECTS_NORMAL)
|
|
float sgn = input.tangentWS.w;
|
|
float3 bitangent = sgn * cross(input.normalWS.xyz, input.tangentWS.xyz);
|
|
half3x3 tangentToWorld = half3x3(input.tangentWS.xyz, bitangent.xyz, input.normalWS.xyz);
|
|
surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(surfaceDescription.NormalTS, tangentToWorld));
|
|
#else
|
|
surfaceData.normalWS.xyz = normalize(half3(input.normalWS));
|
|
#endif
|
|
#endif
|
|
|
|
surfaceData.normalWS.w = surfaceDescription.NormalAlpha * fadeFactor;
|
|
|
|
#if defined( _MATERIAL_AFFECTS_MAOS )
|
|
surfaceData.metallic = half(surfaceDescription.Metallic);
|
|
surfaceData.occlusion = half(surfaceDescription.Occlusion);
|
|
surfaceData.smoothness = half(surfaceDescription.Smoothness);
|
|
surfaceData.MAOSAlpha = half(surfaceDescription.MAOSAlpha * fadeFactor);
|
|
#endif
|
|
}
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR)
|
|
#define DECAL_PROJECTOR
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_MESH
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
#define DECAL_DBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH)
|
|
#define DECAL_SCREEN_SPACE
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_GBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH)
|
|
#define DECAL_FORWARD_EMISSIVE
|
|
#endif
|
|
|
|
#if ((!defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_ALBEDO)) || (defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_NORMAL_BLEND))) && (defined(DECAL_SCREEN_SPACE) || defined(DECAL_GBUFFER))
|
|
#define DECAL_RECONSTRUCT_NORMAL
|
|
#elif defined(DECAL_ANGLE_FADE)
|
|
#define DECAL_LOAD_NORMAL
|
|
#endif
|
|
|
|
#ifdef _DECAL_LAYERS
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareRenderingLayerTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_LOAD_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_PROJECTOR) || defined(DECAL_RECONSTRUCT_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_MESH
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/DecalMeshBiasTypeEnum.cs.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_RECONSTRUCT_NORMAL
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/NormalReconstruction.hlsl"
|
|
#endif
|
|
|
|
void InitializeInputData(PackedVaryings input, float3 positionWS, half3 normalWS, half3 viewDirectionWS, out InputData inputData)
|
|
{
|
|
inputData = (InputData)0;
|
|
|
|
inputData.positionWS = positionWS;
|
|
inputData.normalWS = normalWS;
|
|
inputData.viewDirectionWS = viewDirectionWS;
|
|
inputData.shadowCoord = float4(0, 0, 0, 0);
|
|
|
|
#ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT
|
|
inputData.fogCoord = InitializeInputDataFog(float4(positionWS, 1.0), input.fogFactorAndVertexLight.x);
|
|
inputData.vertexLighting = input.fogFactorAndVertexLight.yzw;
|
|
#endif
|
|
|
|
#if defined(VARYINGS_NEED_DYNAMIC_LIGHTMAP_UV) && defined(DYNAMICLIGHTMAP_ON)
|
|
inputData.bakedGI = SAMPLE_GI(input.lightmapUVs.xy, input.lightmapUVs.zw, half3(input.sh), normalWS);
|
|
#if defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV)
|
|
inputData.shadowMask = SAMPLE_SHADOWMASK(input.lightmapUVs.xy);
|
|
#endif
|
|
#elif defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV)
|
|
#if !defined(LIGHTMAP_ON) && (defined(PROBE_VOLUMES_L1) || defined(PROBE_VOLUMES_L2))
|
|
inputData.bakedGI = SAMPLE_GI(input.sh,
|
|
GetAbsolutePositionWS(inputData.positionWS),
|
|
inputData.normalWS,
|
|
inputData.viewDirectionWS,
|
|
input.positionCS.xy,
|
|
input.probeOcclusion,
|
|
inputData.shadowMask);
|
|
#else
|
|
inputData.bakedGI = SAMPLE_GI(input.lightmapUVs.xy, half3(input.sh), normalWS);
|
|
#if defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV)
|
|
inputData.shadowMask = SAMPLE_SHADOWMASK(input.lightmapUVs.xy);
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(DEBUG_DISPLAY)
|
|
#if defined(VARYINGS_NEED_DYNAMIC_LIGHTMAP_UV) && defined(DYNAMICLIGHTMAP_ON)
|
|
inputData.dynamicLightmapUV = input.lightmapUVs.zw;
|
|
#endif
|
|
#if defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV) && defined(LIGHTMAP_ON)
|
|
inputData.staticLightmapUV = input.lightmapUVs.xy;
|
|
#elif defined(VARYINGS_NEED_SH)
|
|
inputData.vertexSH = input.sh;
|
|
#endif
|
|
#if defined(USE_APV_PROBE_OCCLUSION)
|
|
inputData.probeOcclusion = input.probeOcclusion;
|
|
#endif
|
|
#endif
|
|
|
|
inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(input.positionCS);
|
|
}
|
|
|
|
void GetSurface(DecalSurfaceData decalSurfaceData, inout SurfaceData surfaceData)
|
|
{
|
|
surfaceData.albedo = decalSurfaceData.baseColor.rgb;
|
|
surfaceData.metallic = saturate(decalSurfaceData.metallic);
|
|
surfaceData.specular = 0;
|
|
surfaceData.smoothness = saturate(decalSurfaceData.smoothness);
|
|
surfaceData.occlusion = decalSurfaceData.occlusion;
|
|
surfaceData.emission = decalSurfaceData.emissive;
|
|
surfaceData.alpha = saturate(decalSurfaceData.baseColor.w);
|
|
surfaceData.clearCoatMask = 0;
|
|
surfaceData.clearCoatSmoothness = 1;
|
|
}
|
|
|
|
PackedVaryings Vert(Attributes inputMesh )
|
|
{
|
|
PackedVaryings packedOutput;
|
|
ZERO_INITIALIZE(PackedVaryings, packedOutput);
|
|
|
|
UNITY_SETUP_INSTANCE_ID(inputMesh);
|
|
UNITY_TRANSFER_INSTANCE_ID(inputMesh, packedOutput);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(packedOutput);
|
|
|
|
inputMesh.tangentOS = float4( 1, 0, 0, -1 );
|
|
inputMesh.normalOS = float3( 0, 1, 0 );
|
|
|
|
|
|
|
|
VertexPositionInputs vertexInput = GetVertexPositionInputs(inputMesh.positionOS.xyz);
|
|
float3 positionWS = TransformObjectToWorld(inputMesh.positionOS);
|
|
|
|
float3 normalWS = TransformObjectToWorldNormal(inputMesh.normalOS);
|
|
|
|
packedOutput.positionCS = TransformWorldToHClip(positionWS);
|
|
|
|
half fogFactor = 0;
|
|
#if !defined(_FOG_FRAGMENT)
|
|
fogFactor = ComputeFogFactor(packedOutput.positionCS.z);
|
|
#endif
|
|
half3 vertexLight = VertexLighting(positionWS, normalWS);
|
|
packedOutput.fogFactorAndVertexLight = half4(fogFactor, vertexLight);
|
|
|
|
packedOutput.normalWS.xyz = normalWS;
|
|
packedOutput.viewDirectionWS.xyz = GetWorldSpaceViewDir(positionWS);
|
|
|
|
#if defined(LIGHTMAP_ON)
|
|
OUTPUT_LIGHTMAP_UV(inputMesh.uv1, unity_LightmapST, packedOutput.lightmapUVs.xy);
|
|
#endif
|
|
|
|
#if defined(DYNAMICLIGHTMAP_ON)
|
|
packedOutput.lightmapUVs.zw = inputMesh.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;
|
|
#endif
|
|
|
|
#if !defined(LIGHTMAP_ON)
|
|
packedOutput.sh.xyz = float3(SampleSHVertex(half3(normalWS)));
|
|
#endif
|
|
|
|
return packedOutput;
|
|
}
|
|
|
|
void Frag(PackedVaryings packedInput,
|
|
out half4 outColor : SV_Target0
|
|
|
|
)
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);
|
|
UNITY_SETUP_INSTANCE_ID(packedInput);
|
|
|
|
half angleFadeFactor = 1.0;
|
|
|
|
#ifdef _DECAL_LAYERS
|
|
#ifdef _RENDER_PASS_ENABLED
|
|
uint surfaceRenderingLayer = DecodeMeshRenderingLayer(LOAD_FRAMEBUFFER_INPUT(GBUFFER4, packedInput.positionCS.xy).r);
|
|
#else
|
|
uint surfaceRenderingLayer = LoadSceneRenderingLayer(packedInput.positionCS.xy);
|
|
#endif
|
|
uint projectorRenderingLayer = uint(UNITY_ACCESS_INSTANCED_PROP(Decal, _DecalLayerMaskFromDecal));
|
|
clip((surfaceRenderingLayer & projectorRenderingLayer) - 0.1);
|
|
#endif
|
|
|
|
#if defined(DECAL_PROJECTOR)
|
|
#if UNITY_REVERSED_Z
|
|
#if _RENDER_PASS_ENABLED
|
|
float depth = LOAD_FRAMEBUFFER_X_INPUT(GBUFFER3, packedInput.positionCS.xy).x;
|
|
#else
|
|
float depth = LoadSceneDepth(packedInput.positionCS.xy);
|
|
#endif
|
|
#else
|
|
#if _RENDER_PASS_ENABLED
|
|
float depth = lerp(UNITY_NEAR_CLIP_VALUE, 1, LOAD_FRAMEBUFFER_X_INPUT(GBUFFER3, packedInput.positionCS.xy));
|
|
#else
|
|
float depth = lerp(UNITY_NEAR_CLIP_VALUE, 1, LoadSceneDepth(packedInput.positionCS.xy));
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(DECAL_RECONSTRUCT_NORMAL)
|
|
#if defined(_DECAL_NORMAL_BLEND_HIGH)
|
|
half3 normalWS = half3(ReconstructNormalTap9(packedInput.positionCS.xy));
|
|
#elif defined(_DECAL_NORMAL_BLEND_MEDIUM)
|
|
half3 normalWS = half3(ReconstructNormalTap5(packedInput.positionCS.xy));
|
|
#else
|
|
half3 normalWS = half3(ReconstructNormalDerivative(packedInput.positionCS.xy));
|
|
#endif
|
|
#elif defined(DECAL_LOAD_NORMAL)
|
|
half3 normalWS = half3(LoadSceneNormals(packedInput.positionCS.xy));
|
|
#endif
|
|
|
|
float2 positionSS = FoveatedRemapNonUniformToLinearCS(packedInput.positionCS.xy) * _ScreenSize.zw;
|
|
|
|
float4 positionCS = ComputeClipSpacePosition( positionSS, depth );
|
|
float4 hpositionVS = mul( UNITY_MATRIX_I_P, positionCS );
|
|
|
|
float4 ScreenPosNorm = float4( positionSS, positionCS.zw );
|
|
float4 ClipPos = positionCS * packedInput.positionCS.w;
|
|
float4 ScreenPos = ComputeScreenPos( ClipPos );
|
|
float3 PositionRWS = mul( ( float3x3 )UNITY_MATRIX_I_V, hpositionVS.xyz / hpositionVS.w );
|
|
float3 PositionWS = PositionRWS + _WorldSpaceCameraPos;
|
|
float3 PositionOS = TransformWorldToObject( PositionWS );
|
|
float3 PositionVS = TransformWorldToView( PositionWS );
|
|
|
|
float3 positionDS = TransformWorldToObject(PositionWS);
|
|
positionDS = positionDS * float3(1.0, -1.0, 1.0);
|
|
|
|
float clipValue = 0.5 - Max3(abs(positionDS).x, abs(positionDS).y, abs(positionDS).z);
|
|
clip(clipValue);
|
|
|
|
float2 texCoord = positionDS.xz + float2(0.5, 0.5);
|
|
|
|
float4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
float2 scale = float2(normalToWorld[3][0], normalToWorld[3][1]);
|
|
float2 offset = float2(normalToWorld[3][2], normalToWorld[3][3]);
|
|
texCoord.xy = texCoord.xy * scale + offset;
|
|
|
|
float2 texCoord0 = texCoord;
|
|
float2 texCoord1 = texCoord;
|
|
float2 texCoord2 = texCoord;
|
|
float2 texCoord3 = texCoord;
|
|
|
|
float3 worldTangent = TransformObjectToWorldDir(float3(1, 0, 0));
|
|
float3 worldNormal = TransformObjectToWorldDir(float3(0, 1, 0));
|
|
float3 worldBitangent = TransformObjectToWorldDir(float3(0, 0, 1));
|
|
|
|
#ifdef DECAL_ANGLE_FADE
|
|
half2 angleFade = half2(normalToWorld[1][3], normalToWorld[2][3]);
|
|
|
|
if (angleFade.y < 0.0f)
|
|
{
|
|
half3 decalNormal = half3(normalToWorld[0].z, normalToWorld[1].z, normalToWorld[2].z);
|
|
half dotAngle = dot(normalWS, decalNormal);
|
|
angleFadeFactor = saturate(angleFade.x + angleFade.y * (dotAngle * (dotAngle - 2.0)));
|
|
}
|
|
#endif
|
|
|
|
half3 viewDirectionWS = half3(packedInput.viewDirectionWS);
|
|
|
|
DecalSurfaceData surfaceData;
|
|
|
|
sampler2D tex23 = _MainTex;
|
|
float2 texCoord28 = texCoord0 * float2( 1,1 ) + float2( 0,0 );
|
|
float2 uv23 = texCoord28;
|
|
float2 texelSize23 = float2( 0.0002441406,0.0002441406 );
|
|
float blurRadius23 = _BlurRadius;
|
|
float localGaussianBlur23 = GaussianBlur23( tex23 , uv23 , texelSize23 , blurRadius23 );
|
|
float4 temp_output_20_0 = ( localGaussianBlur23 * _ShadowColor );
|
|
|
|
|
|
SurfaceDescription surfaceDescription = (SurfaceDescription)0;
|
|
|
|
surfaceDescription.BaseColor = temp_output_20_0.rgb;
|
|
surfaceDescription.Alpha = temp_output_20_0.a;
|
|
surfaceDescription.NormalTS = float3(0.0f, 0.0f, 1.0f);
|
|
surfaceDescription.NormalAlpha = 1;
|
|
#if defined( _MATERIAL_AFFECTS_MAOS )
|
|
surfaceDescription.Metallic = 0;
|
|
surfaceDescription.Occlusion = 1;
|
|
surfaceDescription.Smoothness = 0.5;
|
|
surfaceDescription.MAOSAlpha = 1;
|
|
#endif
|
|
|
|
#if defined( _MATERIAL_AFFECTS_EMISSION )
|
|
surfaceDescription.Emission = float3(0, 0, 0);
|
|
#endif
|
|
|
|
GetSurfaceData( surfaceDescription, angleFadeFactor, surfaceData);
|
|
|
|
half3 normalToPack = surfaceData.normalWS.xyz;
|
|
#ifdef DECAL_RECONSTRUCT_NORMAL
|
|
surfaceData.normalWS.xyz = normalize(lerp(normalWS.xyz, surfaceData.normalWS.xyz, surfaceData.normalWS.w));
|
|
#endif
|
|
|
|
InputData inputData;
|
|
InitializeInputData( packedInput, PositionWS, surfaceData.normalWS.xyz, viewDirectionWS, inputData);
|
|
|
|
SurfaceData surface = (SurfaceData)0;
|
|
GetSurface(surfaceData, surface);
|
|
|
|
half4 color = UniversalFragmentPBR(inputData, surface);
|
|
color.rgb = MixFog(color.rgb, inputData.fogCoord);
|
|
outColor = color;
|
|
|
|
}
|
|
ENDHLSL
|
|
}
|
|
|
|
|
|
Pass
|
|
{
|
|
|
|
Name "DecalGBufferProjector"
|
|
Tags { "LightMode"="DecalGBufferProjector" }
|
|
|
|
Cull Front
|
|
Blend 0 SrcAlpha OneMinusSrcAlpha
|
|
Blend 1 SrcAlpha OneMinusSrcAlpha
|
|
Blend 2 SrcAlpha OneMinusSrcAlpha
|
|
Blend 3 SrcAlpha OneMinusSrcAlpha
|
|
ZTest Greater
|
|
ZWrite Off
|
|
ColorMask RGB
|
|
ColorMask 0 1
|
|
ColorMask 0 2
|
|
ColorMask RGB 3
|
|
|
|
HLSLPROGRAM
|
|
|
|
#define _MATERIAL_AFFECTS_ALBEDO 1
|
|
#define _MATERIAL_AFFECTS_NORMAL_BLEND 1
|
|
#define ASE_VERSION 19904
|
|
#define ASE_SRP_VERSION 170200
|
|
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment Frag
|
|
#pragma multi_compile_instancing
|
|
#pragma editor_sync_compilation
|
|
|
|
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN
|
|
#pragma multi_compile_fragment _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH
|
|
#pragma multi_compile _DECAL_NORMAL_BLEND_LOW _DECAL_NORMAL_BLEND_MEDIUM _DECAL_NORMAL_BLEND_HIGH
|
|
#pragma multi_compile _ _DECAL_LAYERS
|
|
#pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT
|
|
#pragma multi_compile_fragment _ _RENDER_PASS_ENABLED
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
|
|
#define ATTRIBUTES_NEED_NORMAL
|
|
#define ATTRIBUTES_NEED_TEXCOORD0
|
|
#define VARYINGS_NEED_NORMAL_WS
|
|
#define VARYINGS_NEED_TEXCOORD0
|
|
#define VARYINGS_NEED_VIEWDIRECTION_WS
|
|
#define VARYINGS_NEED_SH
|
|
#define VARYINGS_NEED_STATIC_LIGHTMAP_UV
|
|
#define VARYINGS_NEED_DYNAMIC_LIGHTMAP_UV
|
|
|
|
#define HAVE_MESH_MODIFICATION
|
|
|
|
#define SHADERPASS SHADERPASS_DECAL_GBUFFER_PROJECTOR
|
|
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Fog.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#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/Input.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DebugMipmapStreamingMacros.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ProbeVolumeVariants.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/GBufferOutput.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DecalInput.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderVariablesDecal.hlsl"
|
|
|
|
#if defined(LOD_FADE_CROSSFADE)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/LODCrossFade.hlsl"
|
|
#endif
|
|
|
|
#if _RENDER_PASS_ENABLED
|
|
#define GBUFFER3 0
|
|
#define GBUFFER4 1
|
|
FRAMEBUFFER_INPUT_X_HALF(GBUFFER3);
|
|
FRAMEBUFFER_INPUT_X_UINT(GBUFFER4);
|
|
#endif
|
|
|
|
#define ASE_NEEDS_FRAG_TEXTURE_COORDINATES0
|
|
|
|
|
|
struct SurfaceDescription
|
|
{
|
|
float3 BaseColor;
|
|
float Alpha;
|
|
float3 NormalTS;
|
|
float NormalAlpha;
|
|
float Metallic;
|
|
float Occlusion;
|
|
float Smoothness;
|
|
float MAOSAlpha;
|
|
float3 Emission;
|
|
};
|
|
|
|
struct Attributes
|
|
{
|
|
float3 positionOS : POSITION;
|
|
float3 normalOS : NORMAL;
|
|
float4 tangentOS : TANGENT;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct PackedVaryings
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
float3 normalWS : TEXCOORD0;
|
|
float3 viewDirectionWS : TEXCOORD1;
|
|
float4 lightmapUVs : TEXCOORD2; // @diogo: packs both static (xy) and dynamic (zw)
|
|
float3 sh : TEXCOORD3;
|
|
#ifdef USE_APV_PROBE_OCCLUSION
|
|
float4 probeOcclusion : TEXCOORD4;
|
|
#endif
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _ShadowColor;
|
|
float _BlurRadius;
|
|
float _DrawOrder;
|
|
float _DecalMeshBiasType;
|
|
float _DecalMeshDepthBias;
|
|
float _DecalMeshViewBias;
|
|
#if defined(DECAL_ANGLE_FADE)
|
|
float _DecalAngleFadeSupported;
|
|
#endif
|
|
UNITY_TEXTURE_STREAMING_DEBUG_VARS;
|
|
CBUFFER_END
|
|
|
|
#ifdef SCENEPICKINGPASS
|
|
float4 _SelectionID;
|
|
#endif
|
|
|
|
#ifdef SCENESELECTIONPASS
|
|
int _ObjectId;
|
|
int _PassValue;
|
|
#endif
|
|
|
|
sampler2D _MainTex;
|
|
|
|
|
|
float GaussianBlur23( sampler2D tex, float2 uv, float2 texelSize, float blurRadius )
|
|
{
|
|
float kernel[12] = {0.02, 0.05, 0.08, 0.12, 0.15, 0.18, 0.18, 0.15, 0.12, 0.08, 0.05, 0.02};
|
|
float kernelSum = 0.0;
|
|
float blurResult = 0.0;
|
|
for (int x = -6; x <= 6; x++) {
|
|
for (int y = -6; y <= 6; y++) {
|
|
float2 sampleUV = uv + texelSize * float2(x, y) * blurRadius;
|
|
float weight = kernel[abs(x)] * kernel[abs(y)];
|
|
|
|
// 텍스처 샘플링
|
|
float4 texColor = tex2D(tex, sampleUV);
|
|
|
|
// RGB → 그레이스케일 (luminance 방식)
|
|
float grayscale = dot(texColor.rgb, float3(0.299, 0.587, 0.114));
|
|
|
|
// 그레이스케일 * 1000000 → 클램프(0,1)
|
|
float boostedGray = saturate(grayscale * 1000000.0);
|
|
|
|
// 알파와 더하기 → 클램프(0,1)
|
|
float combined = saturate(boostedGray + texColor.a);
|
|
|
|
// 가중치 적용
|
|
blurResult += combined * weight;
|
|
kernelSum += weight;
|
|
}
|
|
}
|
|
return blurResult / kernelSum;
|
|
}
|
|
|
|
|
|
void GetSurfaceData(SurfaceDescription surfaceDescription, float angleFadeFactor, out DecalSurfaceData surfaceData)
|
|
{
|
|
half4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
half 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]);
|
|
|
|
ZERO_INITIALIZE(DecalSurfaceData, surfaceData);
|
|
surfaceData.occlusion = half(1.0);
|
|
surfaceData.smoothness = half(0);
|
|
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
surfaceData.normalWS.w = half(1.0);
|
|
#else
|
|
surfaceData.normalWS.w = half(0.0);
|
|
#endif
|
|
|
|
#if defined( _MATERIAL_AFFECTS_EMISSION )
|
|
surfaceData.emissive.rgb = half3(surfaceDescription.Emission.rgb * fadeFactor);
|
|
#endif
|
|
|
|
surfaceData.baseColor.xyz = half3(surfaceDescription.BaseColor);
|
|
surfaceData.baseColor.w = half(surfaceDescription.Alpha * fadeFactor);
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR)
|
|
#if defined(_MATERIAL_AFFECTS_NORMAL)
|
|
surfaceData.normalWS.xyz = normalize(mul((half3x3)normalToWorld, surfaceDescription.NormalTS.xyz));
|
|
#else
|
|
surfaceData.normalWS.xyz = normalize(normalToWorld[2].xyz);
|
|
#endif
|
|
#elif (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#if defined(_MATERIAL_AFFECTS_NORMAL)
|
|
float sgn = input.tangentWS.w;
|
|
float3 bitangent = sgn * cross(input.normalWS.xyz, input.tangentWS.xyz);
|
|
half3x3 tangentToWorld = half3x3(input.tangentWS.xyz, bitangent.xyz, input.normalWS.xyz);
|
|
surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(surfaceDescription.NormalTS, tangentToWorld));
|
|
#else
|
|
surfaceData.normalWS.xyz = normalize(half3(input.normalWS));
|
|
#endif
|
|
#endif
|
|
|
|
surfaceData.normalWS.w = surfaceDescription.NormalAlpha * fadeFactor;
|
|
|
|
#if defined( _MATERIAL_AFFECTS_MAOS )
|
|
surfaceData.metallic = half(surfaceDescription.Metallic);
|
|
surfaceData.occlusion = half(surfaceDescription.Occlusion);
|
|
surfaceData.smoothness = half(surfaceDescription.Smoothness);
|
|
surfaceData.MAOSAlpha = half(surfaceDescription.MAOSAlpha * fadeFactor);
|
|
#endif
|
|
}
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR)
|
|
#define DECAL_PROJECTOR
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_MESH
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
#define DECAL_DBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH)
|
|
#define DECAL_SCREEN_SPACE
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_GBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH)
|
|
#define DECAL_FORWARD_EMISSIVE
|
|
#endif
|
|
|
|
#if ((!defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_ALBEDO)) || (defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_NORMAL_BLEND))) && (defined(DECAL_SCREEN_SPACE) || defined(DECAL_GBUFFER))
|
|
#define DECAL_RECONSTRUCT_NORMAL
|
|
#elif defined(DECAL_ANGLE_FADE)
|
|
#define DECAL_LOAD_NORMAL
|
|
#endif
|
|
|
|
#ifdef _DECAL_LAYERS
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareRenderingLayerTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_LOAD_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_PROJECTOR) || defined(DECAL_RECONSTRUCT_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_MESH
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/DecalMeshBiasTypeEnum.cs.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_RECONSTRUCT_NORMAL
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/NormalReconstruction.hlsl"
|
|
#endif
|
|
|
|
void InitializeInputData(PackedVaryings input, float3 positionWS, half3 normalWS, half3 viewDirectionWS, out InputData inputData)
|
|
{
|
|
inputData = (InputData)0;
|
|
|
|
inputData.positionWS = positionWS;
|
|
inputData.normalWS = normalWS;
|
|
inputData.viewDirectionWS = viewDirectionWS;
|
|
inputData.shadowCoord = float4(0, 0, 0, 0);
|
|
|
|
#ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT
|
|
inputData.fogCoord = InitializeInputDataFog(float4(positionWS, 1.0), input.fogFactorAndVertexLight.x);
|
|
inputData.vertexLighting = input.fogFactorAndVertexLight.yzw;
|
|
#endif
|
|
|
|
#if defined(VARYINGS_NEED_DYNAMIC_LIGHTMAP_UV) && defined(DYNAMICLIGHTMAP_ON)
|
|
inputData.bakedGI = SAMPLE_GI(input.lightmapUVs.xy, input.lightmapUVs.zw, half3(input.sh), normalWS);
|
|
#if defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV)
|
|
inputData.shadowMask = SAMPLE_SHADOWMASK(input.lightmapUVs.xy);
|
|
#endif
|
|
#elif defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV)
|
|
#if !defined(LIGHTMAP_ON) && (defined(PROBE_VOLUMES_L1) || defined(PROBE_VOLUMES_L2))
|
|
inputData.bakedGI = SAMPLE_GI(input.sh,
|
|
GetAbsolutePositionWS(inputData.positionWS),
|
|
inputData.normalWS,
|
|
inputData.viewDirectionWS,
|
|
input.positionCS.xy,
|
|
input.probeOcclusion,
|
|
inputData.shadowMask);
|
|
#else
|
|
inputData.bakedGI = SAMPLE_GI(input.lightmapUVs.xy, half3(input.sh), normalWS);
|
|
#if defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV)
|
|
inputData.shadowMask = SAMPLE_SHADOWMASK(input.lightmapUVs.xy);
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(DEBUG_DISPLAY)
|
|
#if defined(VARYINGS_NEED_DYNAMIC_LIGHTMAP_UV) && defined(DYNAMICLIGHTMAP_ON)
|
|
inputData.dynamicLightmapUV = input.lightmapUVs.zw;
|
|
#endif
|
|
#if defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV) && defined(LIGHTMAP_ON)
|
|
inputData.staticLightmapUV = input.lightmapUVs.xy;
|
|
#elif defined(VARYINGS_NEED_SH)
|
|
inputData.vertexSH = input.sh;
|
|
#endif
|
|
#if defined(USE_APV_PROBE_OCCLUSION)
|
|
inputData.probeOcclusion = input.probeOcclusion;
|
|
#endif
|
|
#endif
|
|
|
|
inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(input.positionCS);
|
|
}
|
|
|
|
void GetSurface(DecalSurfaceData decalSurfaceData, inout SurfaceData surfaceData)
|
|
{
|
|
surfaceData.albedo = decalSurfaceData.baseColor.rgb;
|
|
surfaceData.metallic = saturate(decalSurfaceData.metallic);
|
|
surfaceData.specular = 0;
|
|
surfaceData.smoothness = saturate(decalSurfaceData.smoothness);
|
|
surfaceData.occlusion = decalSurfaceData.occlusion;
|
|
surfaceData.emission = decalSurfaceData.emissive;
|
|
surfaceData.alpha = saturate(decalSurfaceData.baseColor.w);
|
|
surfaceData.clearCoatMask = 0;
|
|
surfaceData.clearCoatSmoothness = 1;
|
|
}
|
|
|
|
PackedVaryings Vert(Attributes inputMesh )
|
|
{
|
|
PackedVaryings packedOutput;
|
|
ZERO_INITIALIZE(PackedVaryings, packedOutput);
|
|
|
|
UNITY_SETUP_INSTANCE_ID(inputMesh);
|
|
UNITY_TRANSFER_INSTANCE_ID(inputMesh, packedOutput);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(packedOutput);
|
|
|
|
inputMesh.tangentOS = float4( 1, 0, 0, -1 );
|
|
inputMesh.normalOS = float3( 0, 1, 0 );
|
|
|
|
|
|
|
|
float3 positionWS = TransformObjectToWorld(inputMesh.positionOS);
|
|
float3 normalWS = TransformObjectToWorldNormal(inputMesh.normalOS);
|
|
|
|
packedOutput.positionCS = TransformWorldToHClip(positionWS);
|
|
packedOutput.normalWS.xyz = normalWS;
|
|
packedOutput.viewDirectionWS.xyz = GetWorldSpaceViewDir(positionWS);
|
|
|
|
#if defined(LIGHTMAP_ON)
|
|
OUTPUT_LIGHTMAP_UV(inputMesh.uv1, unity_LightmapST, packedOutput.lightmapUVs.xy);
|
|
#endif
|
|
|
|
#if defined(DYNAMICLIGHTMAP_ON)
|
|
packedOutput.lightmapUVs.zw = inputMesh.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;
|
|
#endif
|
|
|
|
#if !defined(LIGHTMAP_ON)
|
|
packedOutput.sh = float3(SampleSHVertex(half3(normalWS)));
|
|
#endif
|
|
|
|
return packedOutput;
|
|
}
|
|
|
|
void Frag(PackedVaryings packedInput,
|
|
out GBufferFragOutput fragmentOutput
|
|
|
|
)
|
|
{
|
|
//PassGBuffer.template
|
|
#pragma warning (disable : 3578) // The output value isn't completely initialized.
|
|
GBufferFragOutput tempFragmentOutput = (GBufferFragOutput)0;
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);
|
|
UNITY_SETUP_INSTANCE_ID(packedInput);
|
|
|
|
//VFXComputePixelOutputToGBuffer(packedInput, tempFragmentOutput);
|
|
fragmentOutput.gBuffer0 = tempFragmentOutput.gBuffer0;
|
|
fragmentOutput.gBuffer1 = tempFragmentOutput.gBuffer1;
|
|
fragmentOutput.gBuffer2 = tempFragmentOutput.gBuffer2;
|
|
fragmentOutput.color = tempFragmentOutput.color;
|
|
|
|
#if defined(GBUFFER_FEATURE_SHADOWMASK)
|
|
fragmentOutput.shadowMask = tempFragmentOutput.shadowMask; // will have unity_ProbesOcclusion value if subtractive lighting is used (baked)
|
|
#endif
|
|
#pragma warning (default : 3578) // Restore output value isn't completely initialized.
|
|
|
|
|
|
half angleFadeFactor = 1.0;
|
|
|
|
#ifdef _DECAL_LAYERS
|
|
#ifdef _RENDER_PASS_ENABLED
|
|
uint surfaceRenderingLayer = DecodeMeshRenderingLayer(LOAD_FRAMEBUFFER_INPUT(GBUFFER4, packedInput.positionCS.xy).r);
|
|
#else
|
|
uint surfaceRenderingLayer = LoadSceneRenderingLayer(packedInput.positionCS.xy);
|
|
#endif
|
|
uint projectorRenderingLayer = uint(UNITY_ACCESS_INSTANCED_PROP(Decal, _DecalLayerMaskFromDecal));
|
|
clip((surfaceRenderingLayer & projectorRenderingLayer) - 0.1);
|
|
#endif
|
|
|
|
#if defined(DECAL_PROJECTOR)
|
|
#if UNITY_REVERSED_Z
|
|
#if _RENDER_PASS_ENABLED
|
|
float depth = LOAD_FRAMEBUFFER_X_INPUT(GBUFFER3, packedInput.positionCS.xy).x;
|
|
#else
|
|
float depth = LoadSceneDepth(packedInput.positionCS.xy);
|
|
#endif
|
|
#else
|
|
#if _RENDER_PASS_ENABLED
|
|
float depth = lerp(UNITY_NEAR_CLIP_VALUE, 1, LOAD_FRAMEBUFFER_X_INPUT(GBUFFER3, packedInput.positionCS.xy));
|
|
#else
|
|
float depth = lerp(UNITY_NEAR_CLIP_VALUE, 1, LoadSceneDepth(packedInput.positionCS.xy));
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(DECAL_RECONSTRUCT_NORMAL)
|
|
#if defined(_DECAL_NORMAL_BLEND_HIGH)
|
|
half3 normalWS = half3(ReconstructNormalTap9(packedInput.positionCS.xy));
|
|
#elif defined(_DECAL_NORMAL_BLEND_MEDIUM)
|
|
half3 normalWS = half3(ReconstructNormalTap5(packedInput.positionCS.xy));
|
|
#else
|
|
half3 normalWS = half3(ReconstructNormalDerivative(packedInput.positionCS.xy));
|
|
#endif
|
|
#elif defined(DECAL_LOAD_NORMAL)
|
|
half3 normalWS = half3(LoadSceneNormals(packedInput.positionCS.xy));
|
|
#endif
|
|
|
|
float2 positionSS = FoveatedRemapNonUniformToLinearCS(packedInput.positionCS.xy) * _ScreenSize.zw;
|
|
|
|
float4 positionCS = ComputeClipSpacePosition( positionSS, depth );
|
|
float4 hpositionVS = mul( UNITY_MATRIX_I_P, positionCS );
|
|
|
|
float4 ScreenPosNorm = float4( positionSS, positionCS.zw );
|
|
float4 ClipPos = positionCS * packedInput.positionCS.w;
|
|
float4 ScreenPos = ComputeScreenPos( ClipPos );
|
|
float3 PositionRWS = mul( ( float3x3 )UNITY_MATRIX_I_V, hpositionVS.xyz / hpositionVS.w );
|
|
float3 PositionWS = PositionRWS + _WorldSpaceCameraPos;
|
|
float3 PositionOS = TransformWorldToObject( PositionWS );
|
|
float3 PositionVS = TransformWorldToView( PositionWS );
|
|
|
|
float3 positionDS = TransformWorldToObject(PositionWS);
|
|
positionDS = positionDS * float3(1.0, -1.0, 1.0);
|
|
|
|
float clipValue = 0.5 - Max3(abs(positionDS).x, abs(positionDS).y, abs(positionDS).z);
|
|
clip(clipValue);
|
|
|
|
float2 texCoord = positionDS.xz + float2(0.5, 0.5);
|
|
|
|
float4x4 normalToWorld = UNITY_ACCESS_INSTANCED_PROP(Decal, _NormalToWorld);
|
|
float2 scale = float2(normalToWorld[3][0], normalToWorld[3][1]);
|
|
float2 offset = float2(normalToWorld[3][2], normalToWorld[3][3]);
|
|
texCoord.xy = texCoord.xy * scale + offset;
|
|
|
|
float2 texCoord0 = texCoord;
|
|
float2 texCoord1 = texCoord;
|
|
float2 texCoord2 = texCoord;
|
|
float2 texCoord3 = texCoord;
|
|
|
|
float3 worldTangent = TransformObjectToWorldDir(float3(1, 0, 0));
|
|
float3 worldNormal = TransformObjectToWorldDir(float3(0, 1, 0));
|
|
float3 worldBitangent = TransformObjectToWorldDir(float3(0, 0, 1));
|
|
|
|
#ifdef DECAL_ANGLE_FADE
|
|
half2 angleFade = half2(normalToWorld[1][3], normalToWorld[2][3]);
|
|
|
|
if (angleFade.y < 0.0f)
|
|
{
|
|
half3 decalNormal = half3(normalToWorld[0].z, normalToWorld[1].z, normalToWorld[2].z);
|
|
half dotAngle = dot(normalWS, decalNormal);
|
|
angleFadeFactor = saturate(angleFade.x + angleFade.y * (dotAngle * (dotAngle - 2.0)));
|
|
}
|
|
#endif
|
|
|
|
half3 viewDirectionWS = half3(packedInput.viewDirectionWS);
|
|
DecalSurfaceData surfaceData;
|
|
|
|
SurfaceDescription surfaceDescription = (SurfaceDescription)0;
|
|
|
|
sampler2D tex23 = _MainTex;
|
|
float2 texCoord28 = texCoord0 * float2( 1,1 ) + float2( 0,0 );
|
|
float2 uv23 = texCoord28;
|
|
float2 texelSize23 = float2( 0.0002441406,0.0002441406 );
|
|
float blurRadius23 = _BlurRadius;
|
|
float localGaussianBlur23 = GaussianBlur23( tex23 , uv23 , texelSize23 , blurRadius23 );
|
|
float4 temp_output_20_0 = ( localGaussianBlur23 * _ShadowColor );
|
|
|
|
|
|
surfaceDescription.BaseColor = temp_output_20_0.rgb;
|
|
surfaceDescription.Alpha = temp_output_20_0.a;
|
|
surfaceDescription.NormalTS = float3(0.0f, 0.0f, 1.0f);
|
|
surfaceDescription.NormalAlpha = 1;
|
|
|
|
#if defined( _MATERIAL_AFFECTS_MAOS )
|
|
surfaceDescription.Metallic = 0;
|
|
surfaceDescription.Occlusion =1;
|
|
surfaceDescription.Smoothness = 0.5;
|
|
surfaceDescription.MAOSAlpha = 1;
|
|
#endif
|
|
|
|
#if defined( _MATERIAL_AFFECTS_EMISSION )
|
|
surfaceDescription.Emission = float3(0, 0, 0);
|
|
#endif
|
|
|
|
GetSurfaceData(surfaceDescription, angleFadeFactor, surfaceData);
|
|
|
|
half3 normalToPack = surfaceData.normalWS.xyz;
|
|
|
|
#ifdef DECAL_RECONSTRUCT_NORMAL
|
|
surfaceData.normalWS.xyz = normalize(lerp(normalWS.xyz, surfaceData.normalWS.xyz, surfaceData.normalWS.w));
|
|
#endif
|
|
|
|
InputData inputData;
|
|
InitializeInputData(packedInput, PositionWS, surfaceData.normalWS.xyz, viewDirectionWS, inputData);
|
|
|
|
SurfaceData surface = (SurfaceData)0;
|
|
GetSurface(surfaceData, surface);
|
|
|
|
BRDFData brdfData;
|
|
InitializeBRDFData(surface.albedo, surface.metallic, 0, surface.smoothness, surface.alpha, brdfData);
|
|
|
|
#ifdef _MATERIAL_AFFECTS_ALBEDO
|
|
Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, inputData.shadowMask);
|
|
MixRealtimeAndBakedGI(mainLight, surfaceData.normalWS.xyz, inputData.bakedGI, inputData.shadowMask);
|
|
half3 color = GlobalIllumination(brdfData, inputData.bakedGI, surface.occlusion, surfaceData.normalWS.xyz, inputData.viewDirectionWS);
|
|
#else
|
|
half3 color = 0;
|
|
#endif
|
|
|
|
//PassGBuffer.template
|
|
half3 packedNormalWS = PackGBufferNormal(surfaceData.normalWS.xyz);
|
|
fragmentOutput = (GBufferFragOutput)0;
|
|
fragmentOutput.gBuffer0 = half4(surfaceData.baseColor.rgb, surfaceData.baseColor.a);
|
|
fragmentOutput.gBuffer1 = 0;
|
|
fragmentOutput.gBuffer2 = half4(packedNormalWS, surfaceData.normalWS.a);
|
|
#if defined(AFFECT_BASE_COLOR) || defined(AFFECT_EMISSIVE)
|
|
fragmentOutput.color = half4(surfaceData.emissive + color, surfaceData.baseColor.a);
|
|
#else
|
|
fragmentOutput.color = 0;
|
|
#endif
|
|
|
|
#if defined(GBUFFER_FEATURE_SHADOWMASK)
|
|
fragmentOutput.shadowMask = inputData.shadowMask; // will have unity_ProbesOcclusion value if subtractive lighting is used (baked)
|
|
#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
|
|
ZTest LEqual
|
|
ZWrite Off
|
|
ColorMask RGBA
|
|
ColorMask 0 1
|
|
ColorMask RGBA 2
|
|
|
|
HLSLPROGRAM
|
|
|
|
#define _MATERIAL_AFFECTS_ALBEDO 1
|
|
#define _MATERIAL_AFFECTS_NORMAL_BLEND 1
|
|
#define ASE_VERSION 19904
|
|
#define ASE_SRP_VERSION 170200
|
|
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment Frag
|
|
#pragma multi_compile_instancing
|
|
#pragma editor_sync_compilation
|
|
|
|
#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3
|
|
#pragma multi_compile _ _DECAL_LAYERS
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
|
|
#define ATTRIBUTES_NEED_NORMAL
|
|
#define ATTRIBUTES_NEED_TANGENT
|
|
#define ATTRIBUTES_NEED_TEXCOORD0
|
|
#define ATTRIBUTES_NEED_TEXCOORD1
|
|
#define ATTRIBUTES_NEED_TEXCOORD2
|
|
#define VARYINGS_NEED_POSITION_WS
|
|
#define VARYINGS_NEED_NORMAL_WS
|
|
#define VARYINGS_NEED_TANGENT_WS
|
|
#define VARYINGS_NEED_TEXCOORD0
|
|
|
|
#define HAVE_MESH_MODIFICATION
|
|
|
|
#define SHADERPASS SHADERPASS_DBUFFER_MESH
|
|
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Fog.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#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/Input.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DebugMipmapStreamingMacros.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ProbeVolumeVariants.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DecalInput.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderVariablesDecal.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl"
|
|
|
|
#if defined(LOD_FADE_CROSSFADE)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/LODCrossFade.hlsl"
|
|
#endif
|
|
|
|
#if _RENDER_PASS_ENABLED
|
|
#define GBUFFER3 0
|
|
#define GBUFFER4 1
|
|
FRAMEBUFFER_INPUT_X_HALF(GBUFFER3);
|
|
FRAMEBUFFER_INPUT_X_UINT(GBUFFER4);
|
|
#endif
|
|
|
|
#define ASE_NEEDS_TEXTURE_COORDINATES0
|
|
#define ASE_NEEDS_FRAG_TEXTURE_COORDINATES0
|
|
|
|
|
|
struct SurfaceDescription
|
|
{
|
|
float3 BaseColor;
|
|
float Alpha;
|
|
float3 NormalTS;
|
|
float NormalAlpha;
|
|
float Metallic;
|
|
float Occlusion;
|
|
float Smoothness;
|
|
float MAOSAlpha;
|
|
};
|
|
|
|
struct Attributes
|
|
{
|
|
float3 positionOS : POSITION;
|
|
float3 normalOS : NORMAL;
|
|
float4 tangentOS : TANGENT;
|
|
float4 uv0 : TEXCOORD0;
|
|
float4 uv1 : TEXCOORD1;
|
|
float4 uv2 : TEXCOORD2;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct PackedVaryings
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
float3 positionWS : TEXCOORD0;
|
|
float3 normalWS : TEXCOORD1;
|
|
float4 tangentWS : TEXCOORD2;
|
|
float4 texCoord0 : TEXCOORD3;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _ShadowColor;
|
|
float _BlurRadius;
|
|
float _DrawOrder;
|
|
float _DecalMeshBiasType;
|
|
float _DecalMeshDepthBias;
|
|
float _DecalMeshViewBias;
|
|
#if defined(DECAL_ANGLE_FADE)
|
|
float _DecalAngleFadeSupported;
|
|
#endif
|
|
UNITY_TEXTURE_STREAMING_DEBUG_VARS;
|
|
CBUFFER_END
|
|
|
|
#ifdef SCENEPICKINGPASS
|
|
float4 _SelectionID;
|
|
#endif
|
|
|
|
#ifdef SCENESELECTIONPASS
|
|
int _ObjectId;
|
|
int _PassValue;
|
|
#endif
|
|
|
|
sampler2D _MainTex;
|
|
|
|
|
|
float GaussianBlur23( sampler2D tex, float2 uv, float2 texelSize, float blurRadius )
|
|
{
|
|
float kernel[12] = {0.02, 0.05, 0.08, 0.12, 0.15, 0.18, 0.18, 0.15, 0.12, 0.08, 0.05, 0.02};
|
|
float kernelSum = 0.0;
|
|
float blurResult = 0.0;
|
|
for (int x = -6; x <= 6; x++) {
|
|
for (int y = -6; y <= 6; y++) {
|
|
float2 sampleUV = uv + texelSize * float2(x, y) * blurRadius;
|
|
float weight = kernel[abs(x)] * kernel[abs(y)];
|
|
|
|
// 텍스처 샘플링
|
|
float4 texColor = tex2D(tex, sampleUV);
|
|
|
|
// RGB → 그레이스케일 (luminance 방식)
|
|
float grayscale = dot(texColor.rgb, float3(0.299, 0.587, 0.114));
|
|
|
|
// 그레이스케일 * 1000000 → 클램프(0,1)
|
|
float boostedGray = saturate(grayscale * 1000000.0);
|
|
|
|
// 알파와 더하기 → 클램프(0,1)
|
|
float combined = saturate(boostedGray + texColor.a);
|
|
|
|
// 가중치 적용
|
|
blurResult += combined * weight;
|
|
kernelSum += weight;
|
|
}
|
|
}
|
|
return blurResult / kernelSum;
|
|
}
|
|
|
|
|
|
void GetSurfaceData(PackedVaryings input, SurfaceDescription surfaceDescription, out DecalSurfaceData surfaceData)
|
|
{
|
|
#if defined(LOD_FADE_CROSSFADE)
|
|
LODFadeCrossFade( input.positionCS );
|
|
#endif
|
|
|
|
half fadeFactor = half(1.0);
|
|
|
|
ZERO_INITIALIZE(DecalSurfaceData, surfaceData);
|
|
surfaceData.occlusion = half(1.0);
|
|
surfaceData.smoothness = half(0);
|
|
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
surfaceData.normalWS.w = half(1.0);
|
|
#else
|
|
surfaceData.normalWS.w = half(0.0);
|
|
#endif
|
|
|
|
surfaceData.baseColor.xyz = half3(surfaceDescription.BaseColor);
|
|
surfaceData.baseColor.w = half(surfaceDescription.Alpha * fadeFactor);
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR)
|
|
#if defined(_MATERIAL_AFFECTS_NORMAL)
|
|
surfaceData.normalWS.xyz = normalize(mul((half3x3)normalToWorld, surfaceDescription.NormalTS.xyz));
|
|
#else
|
|
surfaceData.normalWS.xyz = normalize(normalToWorld[2].xyz);
|
|
#endif
|
|
#elif (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#if defined(_MATERIAL_AFFECTS_NORMAL)
|
|
float sgn = input.tangentWS.w;
|
|
float3 bitangent = sgn * cross(input.normalWS.xyz, input.tangentWS.xyz);
|
|
half3x3 tangentToWorld = half3x3(input.tangentWS.xyz, bitangent.xyz, input.normalWS.xyz);
|
|
surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(surfaceDescription.NormalTS, tangentToWorld));
|
|
#else
|
|
surfaceData.normalWS.xyz = normalize(half3(input.normalWS));
|
|
#endif
|
|
#endif
|
|
|
|
surfaceData.normalWS.w = surfaceDescription.NormalAlpha * fadeFactor;
|
|
|
|
#if defined( _MATERIAL_AFFECTS_MAOS )
|
|
surfaceData.metallic = half(surfaceDescription.Metallic);
|
|
surfaceData.occlusion = half(surfaceDescription.Occlusion);
|
|
surfaceData.smoothness = half(surfaceDescription.Smoothness);
|
|
surfaceData.MAOSAlpha = half(surfaceDescription.MAOSAlpha * fadeFactor);
|
|
#endif
|
|
}
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR)
|
|
#define DECAL_PROJECTOR
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_MESH
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
#define DECAL_DBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH)
|
|
#define DECAL_SCREEN_SPACE
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_GBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH)
|
|
#define DECAL_FORWARD_EMISSIVE
|
|
#endif
|
|
|
|
#if ((!defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_ALBEDO)) || (defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_NORMAL_BLEND))) && (defined(DECAL_SCREEN_SPACE) || defined(DECAL_GBUFFER))
|
|
#define DECAL_RECONSTRUCT_NORMAL
|
|
#elif defined(DECAL_ANGLE_FADE)
|
|
#define DECAL_LOAD_NORMAL
|
|
#endif
|
|
|
|
#ifdef _DECAL_LAYERS
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareRenderingLayerTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_LOAD_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_PROJECTOR) || defined(DECAL_RECONSTRUCT_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_MESH
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/DecalMeshBiasTypeEnum.cs.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_RECONSTRUCT_NORMAL
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/NormalReconstruction.hlsl"
|
|
#endif
|
|
|
|
void MeshDecalsPositionZBias(inout PackedVaryings input)
|
|
{
|
|
#if UNITY_REVERSED_Z
|
|
input.positionCS.z -= _DecalMeshDepthBias;
|
|
#else
|
|
input.positionCS.z += _DecalMeshDepthBias;
|
|
#endif
|
|
}
|
|
|
|
PackedVaryings Vert(Attributes inputMesh )
|
|
{
|
|
if (_DecalMeshBiasType == DECALMESHDEPTHBIASTYPE_VIEW_BIAS)
|
|
{
|
|
float3 viewDirectionOS = GetObjectSpaceNormalizeViewDir(inputMesh.positionOS);
|
|
inputMesh.positionOS += viewDirectionOS * (_DecalMeshViewBias);
|
|
}
|
|
|
|
PackedVaryings packedOutput;
|
|
ZERO_INITIALIZE(PackedVaryings, packedOutput);
|
|
|
|
UNITY_SETUP_INSTANCE_ID(inputMesh);
|
|
UNITY_TRANSFER_INSTANCE_ID(inputMesh, packedOutput);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(packedOutput);
|
|
|
|
|
|
|
|
VertexPositionInputs vertexInput = GetVertexPositionInputs(inputMesh.positionOS.xyz);
|
|
|
|
float3 positionWS = TransformObjectToWorld(inputMesh.positionOS);
|
|
|
|
float3 normalWS = TransformObjectToWorldNormal(inputMesh.normalOS);
|
|
float4 tangentWS = float4(TransformObjectToWorldDir(inputMesh.tangentOS.xyz), inputMesh.tangentOS.w);
|
|
|
|
packedOutput.positionWS.xyz = positionWS;
|
|
packedOutput.normalWS.xyz = normalWS;
|
|
packedOutput.tangentWS.xyzw = tangentWS;
|
|
packedOutput.texCoord0.xyzw = inputMesh.uv0;
|
|
packedOutput.positionCS = TransformWorldToHClip(positionWS);
|
|
|
|
if (_DecalMeshBiasType == DECALMESHDEPTHBIASTYPE_DEPTH_BIAS)
|
|
{
|
|
MeshDecalsPositionZBias(packedOutput);
|
|
}
|
|
|
|
return packedOutput;
|
|
}
|
|
|
|
void Frag(PackedVaryings packedInput,
|
|
OUTPUT_DBUFFER(outDBuffer)
|
|
|
|
)
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);
|
|
UNITY_SETUP_INSTANCE_ID(packedInput);
|
|
|
|
half angleFadeFactor = 1.0;
|
|
|
|
#ifdef _DECAL_LAYERS
|
|
#ifdef _RENDER_PASS_ENABLED
|
|
uint surfaceRenderingLayer = DecodeMeshRenderingLayer(LOAD_FRAMEBUFFER_INPUT(GBUFFER4, packedInput.positionCS.xy).r);
|
|
#else
|
|
uint surfaceRenderingLayer = LoadSceneRenderingLayer(packedInput.positionCS.xy);
|
|
#endif
|
|
uint projectorRenderingLayer = uint(UNITY_ACCESS_INSTANCED_PROP(Decal, _DecalLayerMaskFromDecal));
|
|
clip((surfaceRenderingLayer & projectorRenderingLayer) - 0.1);
|
|
#endif
|
|
|
|
#if defined(DECAL_RECONSTRUCT_NORMAL)
|
|
#if defined(_DECAL_NORMAL_BLEND_HIGH)
|
|
half3 normalWS = half3(ReconstructNormalTap9(packedInput.positionCS.xy));
|
|
#elif defined(_DECAL_NORMAL_BLEND_MEDIUM)
|
|
half3 normalWS = half3(ReconstructNormalTap5(packedInput.positionCS.xy));
|
|
#else
|
|
half3 normalWS = half3(ReconstructNormalDerivative(packedInput.positionCS.xy));
|
|
#endif
|
|
#elif defined(DECAL_LOAD_NORMAL)
|
|
half3 normalWS = half3(LoadSceneNormals(packedInput.positionCS.xy));
|
|
#endif
|
|
|
|
float2 positionSS = FoveatedRemapNonUniformToLinearCS(packedInput.positionCS.xy) * _ScreenSize.zw;
|
|
|
|
float3 positionWS = packedInput.positionWS.xyz;
|
|
half3 viewDirectionWS = half3(1.0, 1.0, 1.0);
|
|
|
|
DecalSurfaceData surfaceData;
|
|
SurfaceDescription surfaceDescription;
|
|
|
|
sampler2D tex23 = _MainTex;
|
|
float2 texCoord28 = packedInput.texCoord0.xy * float2( 1,1 ) + float2( 0,0 );
|
|
float2 uv23 = texCoord28;
|
|
float2 texelSize23 = float2( 0.0002441406,0.0002441406 );
|
|
float blurRadius23 = _BlurRadius;
|
|
float localGaussianBlur23 = GaussianBlur23( tex23 , uv23 , texelSize23 , blurRadius23 );
|
|
float4 temp_output_20_0 = ( localGaussianBlur23 * _ShadowColor );
|
|
|
|
|
|
surfaceDescription.BaseColor = temp_output_20_0.rgb;
|
|
surfaceDescription.Alpha = temp_output_20_0.a;
|
|
surfaceDescription.NormalTS = float3(0.0f, 0.0f, 1.0f);
|
|
surfaceDescription.NormalAlpha = 1;
|
|
|
|
#if defined( _MATERIAL_AFFECTS_MAOS )
|
|
surfaceDescription.Metallic = 0;
|
|
surfaceDescription.Occlusion = 1;
|
|
surfaceDescription.Smoothness = 0.5;
|
|
surfaceDescription.MAOSAlpha = 1;
|
|
#endif
|
|
|
|
GetSurfaceData(packedInput, surfaceDescription, surfaceData);
|
|
ENCODE_INTO_DBUFFER(surfaceData, outDBuffer);
|
|
|
|
}
|
|
|
|
ENDHLSL
|
|
}
|
|
|
|
|
|
Pass
|
|
{
|
|
|
|
Name "DecalScreenSpaceMesh"
|
|
Tags { "LightMode"="DecalScreenSpaceMesh" }
|
|
|
|
Blend SrcAlpha OneMinusSrcAlpha
|
|
ZTest LEqual
|
|
ZWrite Off
|
|
|
|
HLSLPROGRAM
|
|
|
|
#define _MATERIAL_AFFECTS_ALBEDO 1
|
|
#define _MATERIAL_AFFECTS_NORMAL_BLEND 1
|
|
#define ASE_VERSION 19904
|
|
#define ASE_SRP_VERSION 170200
|
|
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment Frag
|
|
#pragma multi_compile_instancing
|
|
#pragma editor_sync_compilation
|
|
|
|
#pragma multi_compile _ LIGHTMAP_ON
|
|
#pragma multi_compile _ DYNAMICLIGHTMAP_ON
|
|
#pragma multi_compile _ DIRLIGHTMAP_COMBINED
|
|
#pragma multi_compile _ USE_LEGACY_LIGHTMAPS
|
|
#pragma multi_compile _ LIGHTMAP_BICUBIC_SAMPLING
|
|
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN
|
|
#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
|
|
#pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS
|
|
#pragma multi_compile_fragment _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH
|
|
#pragma multi_compile _ LIGHTMAP_SHADOW_MIXING
|
|
#pragma multi_compile _ SHADOWS_SHADOWMASK
|
|
#pragma multi_compile _ _CLUSTER_LIGHT_LOOP
|
|
#pragma multi_compile _DECAL_NORMAL_BLEND_LOW _DECAL_NORMAL_BLEND_MEDIUM _DECAL_NORMAL_BLEND_HIGH
|
|
#pragma multi_compile_fragment _ DEBUG_DISPLAY
|
|
#pragma multi_compile _ _DECAL_LAYERS
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
|
|
#define ATTRIBUTES_NEED_NORMAL
|
|
#define ATTRIBUTES_NEED_TANGENT
|
|
#define ATTRIBUTES_NEED_TEXCOORD0
|
|
#define ATTRIBUTES_NEED_TEXCOORD1
|
|
#define ATTRIBUTES_NEED_TEXCOORD2
|
|
#define VARYINGS_NEED_POSITION_WS
|
|
#define VARYINGS_NEED_NORMAL_WS
|
|
#define VARYINGS_NEED_VIEWDIRECTION_WS
|
|
#define VARYINGS_NEED_TANGENT_WS
|
|
#define VARYINGS_NEED_TEXCOORD0
|
|
#define VARYINGS_NEED_FOG_AND_VERTEX_LIGHT
|
|
#define VARYINGS_NEED_SH
|
|
#define VARYINGS_NEED_STATIC_LIGHTMAP_UV
|
|
#define VARYINGS_NEED_DYNAMIC_LIGHTMAP_UV
|
|
|
|
#define HAVE_MESH_MODIFICATION
|
|
|
|
#define SHADERPASS SHADERPASS_DECAL_SCREEN_SPACE_MESH
|
|
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Fog.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#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/Input.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DebugMipmapStreamingMacros.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ProbeVolumeVariants.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DecalInput.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderVariablesDecal.hlsl"
|
|
|
|
#if defined(LOD_FADE_CROSSFADE)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/LODCrossFade.hlsl"
|
|
#endif
|
|
|
|
#if _RENDER_PASS_ENABLED
|
|
#define GBUFFER3 0
|
|
#define GBUFFER4 1
|
|
FRAMEBUFFER_INPUT_X_HALF(GBUFFER3);
|
|
FRAMEBUFFER_INPUT_X_UINT(GBUFFER4);
|
|
#endif
|
|
|
|
#define ASE_NEEDS_TEXTURE_COORDINATES0
|
|
#define ASE_NEEDS_FRAG_TEXTURE_COORDINATES0
|
|
|
|
|
|
struct SurfaceDescription
|
|
{
|
|
float3 BaseColor;
|
|
float Alpha;
|
|
float3 NormalTS;
|
|
float NormalAlpha;
|
|
float Metallic;
|
|
float Occlusion;
|
|
float Smoothness;
|
|
float MAOSAlpha;
|
|
float3 Emission;
|
|
};
|
|
|
|
struct Attributes
|
|
{
|
|
float3 positionOS : POSITION;
|
|
float3 normalOS : NORMAL;
|
|
float4 tangentOS : TANGENT;
|
|
float4 uv0 : TEXCOORD0;
|
|
float4 uv1 : TEXCOORD1;
|
|
float4 uv2 : TEXCOORD2;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct PackedVaryings
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
float3 positionWS : TEXCOORD0;
|
|
float3 normalWS : TEXCOORD1;
|
|
float4 tangentWS : TEXCOORD2;
|
|
float4 texCoord0 : TEXCOORD3;
|
|
float3 viewDirectionWS : TEXCOORD4;
|
|
float4 lightmapUVs : TEXCOORD5; // @diogo: packs both static (xy) and dynamic (zw)
|
|
float3 sh : TEXCOORD6;
|
|
float4 fogFactorAndVertexLight : TEXCOORD7;
|
|
#ifdef USE_APV_PROBE_OCCLUSION
|
|
float4 probeOcclusion : TEXCOORD8;
|
|
#endif
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _ShadowColor;
|
|
float _BlurRadius;
|
|
float _DrawOrder;
|
|
float _DecalMeshBiasType;
|
|
float _DecalMeshDepthBias;
|
|
float _DecalMeshViewBias;
|
|
#if defined(DECAL_ANGLE_FADE)
|
|
float _DecalAngleFadeSupported;
|
|
#endif
|
|
UNITY_TEXTURE_STREAMING_DEBUG_VARS;
|
|
CBUFFER_END
|
|
|
|
#ifdef SCENEPICKINGPASS
|
|
float4 _SelectionID;
|
|
#endif
|
|
|
|
#ifdef SCENESELECTIONPASS
|
|
int _ObjectId;
|
|
int _PassValue;
|
|
#endif
|
|
|
|
sampler2D _MainTex;
|
|
|
|
|
|
float GaussianBlur23( sampler2D tex, float2 uv, float2 texelSize, float blurRadius )
|
|
{
|
|
float kernel[12] = {0.02, 0.05, 0.08, 0.12, 0.15, 0.18, 0.18, 0.15, 0.12, 0.08, 0.05, 0.02};
|
|
float kernelSum = 0.0;
|
|
float blurResult = 0.0;
|
|
for (int x = -6; x <= 6; x++) {
|
|
for (int y = -6; y <= 6; y++) {
|
|
float2 sampleUV = uv + texelSize * float2(x, y) * blurRadius;
|
|
float weight = kernel[abs(x)] * kernel[abs(y)];
|
|
|
|
// 텍스처 샘플링
|
|
float4 texColor = tex2D(tex, sampleUV);
|
|
|
|
// RGB → 그레이스케일 (luminance 방식)
|
|
float grayscale = dot(texColor.rgb, float3(0.299, 0.587, 0.114));
|
|
|
|
// 그레이스케일 * 1000000 → 클램프(0,1)
|
|
float boostedGray = saturate(grayscale * 1000000.0);
|
|
|
|
// 알파와 더하기 → 클램프(0,1)
|
|
float combined = saturate(boostedGray + texColor.a);
|
|
|
|
// 가중치 적용
|
|
blurResult += combined * weight;
|
|
kernelSum += weight;
|
|
}
|
|
}
|
|
return blurResult / kernelSum;
|
|
}
|
|
|
|
|
|
void GetSurfaceData(PackedVaryings input, SurfaceDescription surfaceDescription, out DecalSurfaceData surfaceData)
|
|
{
|
|
#if defined(LOD_FADE_CROSSFADE)
|
|
LODFadeCrossFade( input.positionCS );
|
|
#endif
|
|
|
|
half fadeFactor = half(1.0);
|
|
|
|
ZERO_INITIALIZE(DecalSurfaceData, surfaceData);
|
|
surfaceData.occlusion = half(1.0);
|
|
surfaceData.smoothness = half(0);
|
|
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
surfaceData.normalWS.w = half(1.0);
|
|
#else
|
|
surfaceData.normalWS.w = half(0.0);
|
|
#endif
|
|
|
|
#if defined( _MATERIAL_AFFECTS_EMISSION )
|
|
surfaceData.emissive.rgb = half3(surfaceDescription.Emission.rgb * fadeFactor);
|
|
#endif
|
|
|
|
surfaceData.baseColor.xyz = half3(surfaceDescription.BaseColor);
|
|
surfaceData.baseColor.w = half(surfaceDescription.Alpha * fadeFactor);
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR)
|
|
#if defined(_MATERIAL_AFFECTS_NORMAL)
|
|
surfaceData.normalWS.xyz = normalize(mul((half3x3)normalToWorld, surfaceDescription.NormalTS.xyz));
|
|
#else
|
|
surfaceData.normalWS.xyz = normalize(normalToWorld[2].xyz);
|
|
#endif
|
|
#elif (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#if defined(_MATERIAL_AFFECTS_NORMAL)
|
|
float sgn = input.tangentWS.w;
|
|
float3 bitangent = sgn * cross(input.normalWS.xyz, input.tangentWS.xyz);
|
|
half3x3 tangentToWorld = half3x3(input.tangentWS.xyz, bitangent.xyz, input.normalWS.xyz);
|
|
surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(surfaceDescription.NormalTS, tangentToWorld));
|
|
#else
|
|
surfaceData.normalWS.xyz = normalize(half3(input.normalWS));
|
|
#endif
|
|
#endif
|
|
|
|
surfaceData.normalWS.w = surfaceDescription.NormalAlpha * fadeFactor;
|
|
|
|
#if defined( _MATERIAL_AFFECTS_MAOS )
|
|
surfaceData.metallic = half(surfaceDescription.Metallic);
|
|
surfaceData.occlusion = half(surfaceDescription.Occlusion);
|
|
surfaceData.smoothness = half(surfaceDescription.Smoothness);
|
|
surfaceData.MAOSAlpha = half(surfaceDescription.MAOSAlpha * fadeFactor);
|
|
#endif
|
|
}
|
|
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR)
|
|
#define DECAL_PROJECTOR
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_MESH
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
#define DECAL_DBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH)
|
|
#define DECAL_SCREEN_SPACE
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_GBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH)
|
|
#define DECAL_FORWARD_EMISSIVE
|
|
#endif
|
|
|
|
#if ((!defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_ALBEDO)) || (defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_NORMAL_BLEND))) && (defined(DECAL_SCREEN_SPACE) || defined(DECAL_GBUFFER))
|
|
#define DECAL_RECONSTRUCT_NORMAL
|
|
#elif defined(DECAL_ANGLE_FADE)
|
|
#define DECAL_LOAD_NORMAL
|
|
#endif
|
|
|
|
#ifdef _DECAL_LAYERS
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareRenderingLayerTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_LOAD_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_PROJECTOR) || defined(DECAL_RECONSTRUCT_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_MESH
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/DecalMeshBiasTypeEnum.cs.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_RECONSTRUCT_NORMAL
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/NormalReconstruction.hlsl"
|
|
#endif
|
|
|
|
void MeshDecalsPositionZBias(inout PackedVaryings input)
|
|
{
|
|
#if UNITY_REVERSED_Z
|
|
input.positionCS.z -= _DecalMeshDepthBias;
|
|
#else
|
|
input.positionCS.z += _DecalMeshDepthBias;
|
|
#endif
|
|
}
|
|
|
|
void InitializeInputData(PackedVaryings input, float3 positionWS, half3 normalWS, half3 viewDirectionWS, out InputData inputData)
|
|
{
|
|
inputData = (InputData)0;
|
|
|
|
inputData.positionWS = positionWS;
|
|
inputData.normalWS = normalWS;
|
|
inputData.viewDirectionWS = viewDirectionWS;
|
|
inputData.shadowCoord = float4(0, 0, 0, 0);
|
|
|
|
#ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT
|
|
inputData.fogCoord = InitializeInputDataFog(float4(positionWS, 1.0), input.fogFactorAndVertexLight.x);
|
|
inputData.vertexLighting = input.fogFactorAndVertexLight.yzw;
|
|
#endif
|
|
|
|
#if defined(VARYINGS_NEED_DYNAMIC_LIGHTMAP_UV) && defined(DYNAMICLIGHTMAP_ON)
|
|
inputData.bakedGI = SAMPLE_GI(input.lightmapUVs.xy, input.lightmapUVs.zw, half3(input.sh), normalWS);
|
|
#if defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV)
|
|
inputData.shadowMask = SAMPLE_SHADOWMASK(input.lightmapUVs.xy);
|
|
#endif
|
|
#elif defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV)
|
|
#if !defined(LIGHTMAP_ON) && (defined(PROBE_VOLUMES_L1) || defined(PROBE_VOLUMES_L2))
|
|
inputData.bakedGI = SAMPLE_GI(input.sh,
|
|
GetAbsolutePositionWS(inputData.positionWS),
|
|
inputData.normalWS,
|
|
inputData.viewDirectionWS,
|
|
input.positionCS.xy,
|
|
input.probeOcclusion,
|
|
inputData.shadowMask);
|
|
#else
|
|
inputData.bakedGI = SAMPLE_GI(input.lightmapUVs.xy, half3(input.sh), normalWS);
|
|
#if defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV)
|
|
inputData.shadowMask = SAMPLE_SHADOWMASK(input.lightmapUVs.xy);
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(DEBUG_DISPLAY)
|
|
#if defined(VARYINGS_NEED_DYNAMIC_LIGHTMAP_UV) && defined(DYNAMICLIGHTMAP_ON)
|
|
inputData.dynamicLightmapUV = input.lightmapUVs.zw;
|
|
#endif
|
|
#if defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV) && defined(LIGHTMAP_ON)
|
|
inputData.staticLightmapUV = input.lightmapUVs.xy;
|
|
#elif defined(VARYINGS_NEED_SH)
|
|
inputData.vertexSH = input.sh;
|
|
#endif
|
|
#if defined(USE_APV_PROBE_OCCLUSION)
|
|
inputData.probeOcclusion = input.probeOcclusion;
|
|
#endif
|
|
#endif
|
|
|
|
inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(input.positionCS);
|
|
}
|
|
|
|
void GetSurface(DecalSurfaceData decalSurfaceData, inout SurfaceData surfaceData)
|
|
{
|
|
surfaceData.albedo = decalSurfaceData.baseColor.rgb;
|
|
surfaceData.metallic = saturate(decalSurfaceData.metallic);
|
|
surfaceData.specular = 0;
|
|
surfaceData.smoothness = saturate(decalSurfaceData.smoothness);
|
|
surfaceData.occlusion = decalSurfaceData.occlusion;
|
|
surfaceData.emission = decalSurfaceData.emissive;
|
|
surfaceData.alpha = saturate(decalSurfaceData.baseColor.w);
|
|
surfaceData.clearCoatMask = 0;
|
|
surfaceData.clearCoatSmoothness = 1;
|
|
}
|
|
|
|
PackedVaryings Vert(Attributes inputMesh )
|
|
{
|
|
if (_DecalMeshBiasType == DECALMESHDEPTHBIASTYPE_VIEW_BIAS)
|
|
{
|
|
float3 viewDirectionOS = GetObjectSpaceNormalizeViewDir(inputMesh.positionOS);
|
|
inputMesh.positionOS += viewDirectionOS * (_DecalMeshViewBias);
|
|
}
|
|
|
|
PackedVaryings packedOutput;
|
|
ZERO_INITIALIZE(PackedVaryings, packedOutput);
|
|
|
|
UNITY_SETUP_INSTANCE_ID(inputMesh);
|
|
UNITY_TRANSFER_INSTANCE_ID(inputMesh, packedOutput);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(packedOutput);
|
|
|
|
|
|
|
|
VertexPositionInputs vertexInput = GetVertexPositionInputs(inputMesh.positionOS.xyz);
|
|
float3 positionWS = TransformObjectToWorld(inputMesh.positionOS);
|
|
float3 normalWS = TransformObjectToWorldNormal(inputMesh.normalOS);
|
|
float4 tangentWS = float4(TransformObjectToWorldDir(inputMesh.tangentOS.xyz), inputMesh.tangentOS.w);
|
|
|
|
packedOutput.positionCS = TransformWorldToHClip(positionWS);
|
|
|
|
half fogFactor = 0;
|
|
#if !defined(_FOG_FRAGMENT)
|
|
fogFactor = ComputeFogFactor(packedOutput.positionCS.z);
|
|
#endif
|
|
|
|
half3 vertexLight = VertexLighting(positionWS, normalWS);
|
|
packedOutput.fogFactorAndVertexLight = half4(fogFactor, vertexLight);
|
|
|
|
if (_DecalMeshBiasType == DECALMESHDEPTHBIASTYPE_DEPTH_BIAS)
|
|
{
|
|
MeshDecalsPositionZBias(packedOutput);
|
|
}
|
|
|
|
packedOutput.positionWS.xyz = positionWS;
|
|
packedOutput.normalWS.xyz = normalWS;
|
|
packedOutput.tangentWS.xyzw = tangentWS;
|
|
packedOutput.texCoord0.xyzw = inputMesh.uv0;
|
|
packedOutput.viewDirectionWS.xyz = GetWorldSpaceViewDir(positionWS);
|
|
|
|
#if defined(LIGHTMAP_ON)
|
|
OUTPUT_LIGHTMAP_UV(inputMesh.uv1, unity_LightmapST, packedOutput.lightmapUVs.xy);
|
|
#endif
|
|
|
|
#if defined(DYNAMICLIGHTMAP_ON)
|
|
packedOutput.lightmapUVs.zw = inputMesh.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;
|
|
#endif
|
|
|
|
#if !defined(LIGHTMAP_ON)
|
|
packedOutput.sh = float3(SampleSHVertex(half3(normalWS)));
|
|
#endif
|
|
|
|
return packedOutput;
|
|
}
|
|
|
|
void Frag(PackedVaryings packedInput,
|
|
out half4 outColor : SV_Target0
|
|
|
|
)
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);
|
|
UNITY_SETUP_INSTANCE_ID(packedInput);
|
|
|
|
half angleFadeFactor = 1.0;
|
|
|
|
#ifdef _DECAL_LAYERS
|
|
#ifdef _RENDER_PASS_ENABLED
|
|
uint surfaceRenderingLayer = DecodeMeshRenderingLayer(LOAD_FRAMEBUFFER_INPUT(GBUFFER4, packedInput.positionCS.xy).r);
|
|
#else
|
|
uint surfaceRenderingLayer = LoadSceneRenderingLayer(packedInput.positionCS.xy);
|
|
#endif
|
|
uint projectorRenderingLayer = uint(UNITY_ACCESS_INSTANCED_PROP(Decal, _DecalLayerMaskFromDecal));
|
|
clip((surfaceRenderingLayer & projectorRenderingLayer) - 0.1);
|
|
#endif
|
|
|
|
#if defined(DECAL_RECONSTRUCT_NORMAL)
|
|
#if defined(_DECAL_NORMAL_BLEND_HIGH)
|
|
half3 normalWS = half3(ReconstructNormalTap9(packedInput.positionCS.xy));
|
|
#elif defined(_DECAL_NORMAL_BLEND_MEDIUM)
|
|
half3 normalWS = half3(ReconstructNormalTap5(packedInput.positionCS.xy));
|
|
#else
|
|
half3 normalWS = half3(ReconstructNormalDerivative(packedInput.positionCS.xy));
|
|
#endif
|
|
#elif defined(DECAL_LOAD_NORMAL)
|
|
half3 normalWS = half3(LoadSceneNormals(packedInput.positionCS.xy));
|
|
#endif
|
|
|
|
float2 positionSS = FoveatedRemapNonUniformToLinearCS(packedInput.positionCS.xy) * _ScreenSize.zw;
|
|
|
|
float3 positionWS = packedInput.positionWS.xyz;
|
|
half3 viewDirectionWS = half3(packedInput.viewDirectionWS);
|
|
|
|
DecalSurfaceData surfaceData;
|
|
SurfaceDescription surfaceDescription = (SurfaceDescription)0;
|
|
|
|
sampler2D tex23 = _MainTex;
|
|
float2 texCoord28 = packedInput.texCoord0.xy * float2( 1,1 ) + float2( 0,0 );
|
|
float2 uv23 = texCoord28;
|
|
float2 texelSize23 = float2( 0.0002441406,0.0002441406 );
|
|
float blurRadius23 = _BlurRadius;
|
|
float localGaussianBlur23 = GaussianBlur23( tex23 , uv23 , texelSize23 , blurRadius23 );
|
|
float4 temp_output_20_0 = ( localGaussianBlur23 * _ShadowColor );
|
|
|
|
|
|
surfaceDescription.BaseColor = temp_output_20_0.rgb;
|
|
surfaceDescription.Alpha = temp_output_20_0.a;
|
|
surfaceDescription.NormalTS = float3(0.0f, 0.0f, 1.0f);
|
|
surfaceDescription.NormalAlpha = 1;
|
|
|
|
#if defined( _MATERIAL_AFFECTS_MAOS )
|
|
surfaceDescription.Metallic = 0;
|
|
surfaceDescription.Occlusion = 1;
|
|
surfaceDescription.Smoothness = 0.5;
|
|
surfaceDescription.MAOSAlpha = 1;
|
|
#endif
|
|
|
|
#if defined( _MATERIAL_AFFECTS_EMISSION )
|
|
surfaceDescription.Emission = float3(0, 0, 0);
|
|
#endif
|
|
|
|
GetSurfaceData(packedInput, surfaceDescription, surfaceData);
|
|
|
|
half3 normalToPack = surfaceData.normalWS.xyz;
|
|
#ifdef DECAL_RECONSTRUCT_NORMAL
|
|
surfaceData.normalWS.xyz = normalize(lerp(normalWS.xyz, surfaceData.normalWS.xyz, surfaceData.normalWS.w));
|
|
#endif
|
|
|
|
InputData inputData;
|
|
InitializeInputData(packedInput, positionWS, surfaceData.normalWS.xyz, viewDirectionWS, inputData);
|
|
|
|
SurfaceData surface = (SurfaceData)0;
|
|
GetSurface(surfaceData, surface);
|
|
|
|
half4 color = UniversalFragmentPBR(inputData, surface);
|
|
color.rgb = MixFog(color.rgb, inputData.fogCoord);
|
|
outColor = color;
|
|
|
|
}
|
|
ENDHLSL
|
|
}
|
|
|
|
|
|
Pass
|
|
{
|
|
|
|
Name "DecalGBufferMesh"
|
|
Tags { "LightMode"="DecalGBufferMesh" }
|
|
|
|
Blend 0 SrcAlpha OneMinusSrcAlpha
|
|
Blend 1 SrcAlpha OneMinusSrcAlpha
|
|
Blend 2 SrcAlpha OneMinusSrcAlpha
|
|
Blend 3 SrcAlpha OneMinusSrcAlpha
|
|
ZWrite Off
|
|
ColorMask RGB
|
|
ColorMask 0 1
|
|
ColorMask 0 2
|
|
ColorMask RGB 3
|
|
|
|
HLSLPROGRAM
|
|
|
|
#define _MATERIAL_AFFECTS_ALBEDO 1
|
|
#define _MATERIAL_AFFECTS_NORMAL_BLEND 1
|
|
#define ASE_VERSION 19904
|
|
#define ASE_SRP_VERSION 170200
|
|
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment Frag
|
|
#pragma multi_compile_instancing
|
|
#pragma editor_sync_compilation
|
|
|
|
#pragma multi_compile _ LIGHTMAP_ON
|
|
#pragma multi_compile _ DYNAMICLIGHTMAP_ON
|
|
#pragma multi_compile _ DIRLIGHTMAP_COMBINED
|
|
#pragma multi_compile _ USE_LEGACY_LIGHTMAPS
|
|
#pragma multi_compile _ LIGHTMAP_BICUBIC_SAMPLING
|
|
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN
|
|
#pragma multi_compile_fragment _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH
|
|
#pragma multi_compile _ LIGHTMAP_SHADOW_MIXING
|
|
#pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE
|
|
#pragma multi_compile _DECAL_NORMAL_BLEND_LOW _DECAL_NORMAL_BLEND_MEDIUM _DECAL_NORMAL_BLEND_HIGH
|
|
#pragma multi_compile _ _DECAL_LAYERS
|
|
#pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT
|
|
#pragma multi_compile_fragment _ _RENDER_PASS_ENABLED
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
|
|
#define ATTRIBUTES_NEED_NORMAL
|
|
#define ATTRIBUTES_NEED_TANGENT
|
|
#define ATTRIBUTES_NEED_TEXCOORD0
|
|
#define ATTRIBUTES_NEED_TEXCOORD1
|
|
#define ATTRIBUTES_NEED_TEXCOORD2
|
|
#define VARYINGS_NEED_POSITION_WS
|
|
#define VARYINGS_NEED_NORMAL_WS
|
|
#define VARYINGS_NEED_VIEWDIRECTION_WS
|
|
#define VARYINGS_NEED_TANGENT_WS
|
|
#define VARYINGS_NEED_TEXCOORD0
|
|
#define VARYINGS_NEED_FOG_AND_VERTEX_LIGHT
|
|
#define VARYINGS_NEED_SH
|
|
#define VARYINGS_NEED_STATIC_LIGHTMAP_UV
|
|
#define VARYINGS_NEED_DYNAMIC_LIGHTMAP_UV
|
|
|
|
#define HAVE_MESH_MODIFICATION
|
|
|
|
#define SHADERPASS SHADERPASS_DECAL_GBUFFER_MESH
|
|
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Fog.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#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/Input.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DebugMipmapStreamingMacros.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ProbeVolumeVariants.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/GBufferOutput.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DecalInput.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderVariablesDecal.hlsl"
|
|
|
|
#if defined(LOD_FADE_CROSSFADE)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/LODCrossFade.hlsl"
|
|
#endif
|
|
|
|
#if _RENDER_PASS_ENABLED
|
|
#define GBUFFER3 0
|
|
#define GBUFFER4 1
|
|
FRAMEBUFFER_INPUT_X_HALF(GBUFFER3);
|
|
FRAMEBUFFER_INPUT_X_UINT(GBUFFER4);
|
|
#endif
|
|
|
|
#define ASE_NEEDS_TEXTURE_COORDINATES0
|
|
#define ASE_NEEDS_FRAG_TEXTURE_COORDINATES0
|
|
|
|
|
|
struct SurfaceDescription
|
|
{
|
|
float3 BaseColor;
|
|
float Alpha;
|
|
float3 NormalTS;
|
|
float NormalAlpha;
|
|
float Metallic;
|
|
float Occlusion;
|
|
float Smoothness;
|
|
float MAOSAlpha;
|
|
float3 Emission;
|
|
};
|
|
|
|
struct Attributes
|
|
{
|
|
float3 positionOS : POSITION;
|
|
float3 normalOS : NORMAL;
|
|
float4 tangentOS : TANGENT;
|
|
float4 uv0 : TEXCOORD0;
|
|
float4 uv1 : TEXCOORD1;
|
|
float4 uv2 : TEXCOORD2;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct PackedVaryings
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
float3 positionWS : TEXCOORD0;
|
|
float3 normalWS : TEXCOORD1;
|
|
float4 tangentWS : TEXCOORD2;
|
|
float4 texCoord0 : TEXCOORD3;
|
|
float3 viewDirectionWS : TEXCOORD4;
|
|
float4 lightmapUVs : TEXCOORD5; // @diogo: packs both static (xy) and dynamic (zw)
|
|
float3 sh : TEXCOORD6;
|
|
float4 fogFactorAndVertexLight : TEXCOORD7;
|
|
#ifdef USE_APV_PROBE_OCCLUSION
|
|
float4 probeOcclusion : TEXCOORD10;
|
|
#endif
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _ShadowColor;
|
|
float _BlurRadius;
|
|
float _DrawOrder;
|
|
float _DecalMeshBiasType;
|
|
float _DecalMeshDepthBias;
|
|
float _DecalMeshViewBias;
|
|
#if defined(DECAL_ANGLE_FADE)
|
|
float _DecalAngleFadeSupported;
|
|
#endif
|
|
UNITY_TEXTURE_STREAMING_DEBUG_VARS;
|
|
CBUFFER_END
|
|
|
|
#ifdef SCENEPICKINGPASS
|
|
float4 _SelectionID;
|
|
#endif
|
|
|
|
#ifdef SCENESELECTIONPASS
|
|
int _ObjectId;
|
|
int _PassValue;
|
|
#endif
|
|
|
|
sampler2D _MainTex;
|
|
|
|
|
|
float GaussianBlur23( sampler2D tex, float2 uv, float2 texelSize, float blurRadius )
|
|
{
|
|
float kernel[12] = {0.02, 0.05, 0.08, 0.12, 0.15, 0.18, 0.18, 0.15, 0.12, 0.08, 0.05, 0.02};
|
|
float kernelSum = 0.0;
|
|
float blurResult = 0.0;
|
|
for (int x = -6; x <= 6; x++) {
|
|
for (int y = -6; y <= 6; y++) {
|
|
float2 sampleUV = uv + texelSize * float2(x, y) * blurRadius;
|
|
float weight = kernel[abs(x)] * kernel[abs(y)];
|
|
|
|
// 텍스처 샘플링
|
|
float4 texColor = tex2D(tex, sampleUV);
|
|
|
|
// RGB → 그레이스케일 (luminance 방식)
|
|
float grayscale = dot(texColor.rgb, float3(0.299, 0.587, 0.114));
|
|
|
|
// 그레이스케일 * 1000000 → 클램프(0,1)
|
|
float boostedGray = saturate(grayscale * 1000000.0);
|
|
|
|
// 알파와 더하기 → 클램프(0,1)
|
|
float combined = saturate(boostedGray + texColor.a);
|
|
|
|
// 가중치 적용
|
|
blurResult += combined * weight;
|
|
kernelSum += weight;
|
|
}
|
|
}
|
|
return blurResult / kernelSum;
|
|
}
|
|
|
|
|
|
void GetSurfaceData(PackedVaryings input, SurfaceDescription surfaceDescription, out DecalSurfaceData surfaceData)
|
|
{
|
|
#if defined(LOD_FADE_CROSSFADE)
|
|
LODFadeCrossFade( input.positionCS );
|
|
#endif
|
|
|
|
half fadeFactor = half(1.0);
|
|
|
|
ZERO_INITIALIZE(DecalSurfaceData, surfaceData);
|
|
surfaceData.occlusion = half(1.0);
|
|
surfaceData.smoothness = half(0);
|
|
|
|
#ifdef _MATERIAL_AFFECTS_NORMAL
|
|
surfaceData.normalWS.w = half(1.0);
|
|
#else
|
|
surfaceData.normalWS.w = half(0.0);
|
|
#endif
|
|
|
|
#if defined( _MATERIAL_AFFECTS_EMISSION )
|
|
surfaceData.emissive.rgb = half3(surfaceDescription.Emission.rgb * fadeFactor);
|
|
#endif
|
|
|
|
surfaceData.baseColor.xyz = half3(surfaceDescription.BaseColor);
|
|
surfaceData.baseColor.w = half(surfaceDescription.Alpha * fadeFactor);
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR)
|
|
#if defined(_MATERIAL_AFFECTS_NORMAL)
|
|
surfaceData.normalWS.xyz = normalize(mul((half3x3)normalToWorld, surfaceDescription.NormalTS.xyz));
|
|
#else
|
|
surfaceData.normalWS.xyz = normalize(normalToWorld[2].xyz);
|
|
#endif
|
|
#elif (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#if defined(_MATERIAL_AFFECTS_NORMAL)
|
|
float sgn = input.tangentWS.w;
|
|
float3 bitangent = sgn * cross(input.normalWS.xyz, input.tangentWS.xyz);
|
|
half3x3 tangentToWorld = half3x3(input.tangentWS.xyz, bitangent.xyz, input.normalWS.xyz);
|
|
surfaceData.normalWS.xyz = normalize(TransformTangentToWorld(surfaceDescription.NormalTS, tangentToWorld));
|
|
#else
|
|
surfaceData.normalWS.xyz = normalize(half3(input.normalWS));
|
|
#endif
|
|
#endif
|
|
|
|
surfaceData.normalWS.w = surfaceDescription.NormalAlpha * fadeFactor;
|
|
|
|
#if defined( _MATERIAL_AFFECTS_MAOS )
|
|
surfaceData.metallic = half(surfaceDescription.Metallic);
|
|
surfaceData.occlusion = half(surfaceDescription.Occlusion);
|
|
surfaceData.smoothness = half(surfaceDescription.Smoothness);
|
|
surfaceData.MAOSAlpha = half(surfaceDescription.MAOSAlpha * fadeFactor);
|
|
#endif
|
|
}
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR)
|
|
#define DECAL_PROJECTOR
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_MESH
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
#define DECAL_DBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH)
|
|
#define DECAL_SCREEN_SPACE
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_GBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH)
|
|
#define DECAL_FORWARD_EMISSIVE
|
|
#endif
|
|
|
|
#if ((!defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_ALBEDO)) || (defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_NORMAL_BLEND))) && (defined(DECAL_SCREEN_SPACE) || defined(DECAL_GBUFFER))
|
|
#define DECAL_RECONSTRUCT_NORMAL
|
|
#elif defined(DECAL_ANGLE_FADE)
|
|
#define DECAL_LOAD_NORMAL
|
|
#endif
|
|
|
|
#ifdef _DECAL_LAYERS
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareRenderingLayerTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_LOAD_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_PROJECTOR) || defined(DECAL_RECONSTRUCT_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_MESH
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/DecalMeshBiasTypeEnum.cs.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_RECONSTRUCT_NORMAL
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/NormalReconstruction.hlsl"
|
|
#endif
|
|
|
|
void MeshDecalsPositionZBias(inout PackedVaryings input)
|
|
{
|
|
#if UNITY_REVERSED_Z
|
|
input.positionCS.z -= _DecalMeshDepthBias;
|
|
#else
|
|
input.positionCS.z += _DecalMeshDepthBias;
|
|
#endif
|
|
}
|
|
|
|
void InitializeInputData(PackedVaryings input, float3 positionWS, half3 normalWS, half3 viewDirectionWS, out InputData inputData)
|
|
{
|
|
inputData = (InputData)0;
|
|
|
|
inputData.positionWS = positionWS;
|
|
inputData.normalWS = normalWS;
|
|
inputData.viewDirectionWS = viewDirectionWS;
|
|
inputData.shadowCoord = float4(0, 0, 0, 0);
|
|
|
|
#ifdef VARYINGS_NEED_FOG_AND_VERTEX_LIGHT
|
|
inputData.fogCoord = InitializeInputDataFog(float4(positionWS, 1.0), input.fogFactorAndVertexLight.x);
|
|
inputData.vertexLighting = input.fogFactorAndVertexLight.yzw;
|
|
#endif
|
|
|
|
#if defined(VARYINGS_NEED_DYNAMIC_LIGHTMAP_UV) && defined(DYNAMICLIGHTMAP_ON)
|
|
inputData.bakedGI = SAMPLE_GI(input.lightmapUVs.xy, input.lightmapUVs.zw, half3(input.sh), normalWS);
|
|
#if defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV)
|
|
inputData.shadowMask = SAMPLE_SHADOWMASK(input.lightmapUVs.xy);
|
|
#endif
|
|
#elif defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV)
|
|
#if !defined(LIGHTMAP_ON) && (defined(PROBE_VOLUMES_L1) || defined(PROBE_VOLUMES_L2))
|
|
inputData.bakedGI = SAMPLE_GI(input.sh,
|
|
GetAbsolutePositionWS(inputData.positionWS),
|
|
inputData.normalWS,
|
|
inputData.viewDirectionWS,
|
|
input.positionCS.xy,
|
|
input.probeOcclusion,
|
|
inputData.shadowMask);
|
|
#else
|
|
inputData.bakedGI = SAMPLE_GI(input.lightmapUVs.xy, half3(input.sh), normalWS);
|
|
#if defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV)
|
|
inputData.shadowMask = SAMPLE_SHADOWMASK(input.lightmapUVs.xy);
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(DEBUG_DISPLAY)
|
|
#if defined(VARYINGS_NEED_DYNAMIC_LIGHTMAP_UV) && defined(DYNAMICLIGHTMAP_ON)
|
|
inputData.dynamicLightmapUV = input.lightmapUVs.zw;
|
|
#endif
|
|
#if defined(VARYINGS_NEED_STATIC_LIGHTMAP_UV) && defined(LIGHTMAP_ON)
|
|
inputData.staticLightmapUV = input.lightmapUVs.xy;
|
|
#elif defined(VARYINGS_NEED_SH)
|
|
inputData.vertexSH = input.sh;
|
|
#endif
|
|
#if defined(USE_APV_PROBE_OCCLUSION)
|
|
inputData.probeOcclusion = input.probeOcclusion;
|
|
#endif
|
|
#endif
|
|
|
|
inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(input.positionCS);
|
|
}
|
|
|
|
void GetSurface(DecalSurfaceData decalSurfaceData, inout SurfaceData surfaceData)
|
|
{
|
|
surfaceData.albedo = decalSurfaceData.baseColor.rgb;
|
|
surfaceData.metallic = saturate(decalSurfaceData.metallic);
|
|
surfaceData.specular = 0;
|
|
surfaceData.smoothness = saturate(decalSurfaceData.smoothness);
|
|
surfaceData.occlusion = decalSurfaceData.occlusion;
|
|
surfaceData.emission = decalSurfaceData.emissive;
|
|
surfaceData.alpha = saturate(decalSurfaceData.baseColor.w);
|
|
surfaceData.clearCoatMask = 0;
|
|
surfaceData.clearCoatSmoothness = 1;
|
|
}
|
|
|
|
PackedVaryings Vert(Attributes inputMesh )
|
|
{
|
|
if (_DecalMeshBiasType == DECALMESHDEPTHBIASTYPE_VIEW_BIAS)
|
|
{
|
|
float3 viewDirectionOS = GetObjectSpaceNormalizeViewDir(inputMesh.positionOS);
|
|
inputMesh.positionOS += viewDirectionOS * (_DecalMeshViewBias);
|
|
}
|
|
|
|
PackedVaryings packedOutput;
|
|
ZERO_INITIALIZE(PackedVaryings, packedOutput);
|
|
|
|
UNITY_SETUP_INSTANCE_ID(inputMesh);
|
|
UNITY_TRANSFER_INSTANCE_ID(inputMesh, packedOutput);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(packedOutput);
|
|
|
|
|
|
|
|
VertexPositionInputs vertexInput = GetVertexPositionInputs(inputMesh.positionOS.xyz);
|
|
|
|
float3 positionWS = TransformObjectToWorld(inputMesh.positionOS);
|
|
float3 normalWS = TransformObjectToWorldNormal(inputMesh.normalOS);
|
|
float4 tangentWS = float4(TransformObjectToWorldDir(inputMesh.tangentOS.xyz), inputMesh.tangentOS.w);
|
|
|
|
packedOutput.positionCS = TransformWorldToHClip(positionWS);
|
|
|
|
if (_DecalMeshBiasType == DECALMESHDEPTHBIASTYPE_DEPTH_BIAS)
|
|
{
|
|
MeshDecalsPositionZBias(packedOutput);
|
|
}
|
|
|
|
packedOutput.positionWS.xyz = positionWS;
|
|
packedOutput.normalWS.xyz = normalWS;
|
|
packedOutput.tangentWS.xyzw = tangentWS;
|
|
packedOutput.texCoord0.xyzw = inputMesh.uv0;
|
|
packedOutput.viewDirectionWS.xyz = GetWorldSpaceViewDir(positionWS);
|
|
|
|
#if defined(LIGHTMAP_ON)
|
|
OUTPUT_LIGHTMAP_UV(inputMesh.uv1, unity_LightmapST, packedOutput.lightmapUVs.xy);
|
|
#endif
|
|
|
|
#if defined(DYNAMICLIGHTMAP_ON)
|
|
packedOutput.lightmapUVs.zw = inputMesh.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;
|
|
#endif
|
|
|
|
#if !defined(LIGHTMAP_ON)
|
|
packedOutput.sh.xyz = float3(SampleSHVertex(half3(normalWS)));
|
|
#endif
|
|
|
|
half fogFactor = 0;
|
|
#if !defined(_FOG_FRAGMENT)
|
|
fogFactor = ComputeFogFactor(packedOutput.positionCS.z);
|
|
#endif
|
|
|
|
half3 vertexLight = VertexLighting(positionWS, normalWS);
|
|
packedOutput.fogFactorAndVertexLight = half4(fogFactor, vertexLight);
|
|
|
|
return packedOutput;
|
|
}
|
|
|
|
void Frag(PackedVaryings packedInput,
|
|
out GBufferFragOutput fragmentOutput
|
|
|
|
)
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput);
|
|
UNITY_SETUP_INSTANCE_ID(packedInput);
|
|
|
|
half angleFadeFactor = 1.0;
|
|
|
|
#ifdef _DECAL_LAYERS
|
|
#ifdef _RENDER_PASS_ENABLED
|
|
uint surfaceRenderingLayer = DecodeMeshRenderingLayer(LOAD_FRAMEBUFFER_INPUT(GBUFFER4, packedInput.positionCS.xy).r);
|
|
#else
|
|
uint surfaceRenderingLayer = LoadSceneRenderingLayer(packedInput.positionCS.xy);
|
|
#endif
|
|
uint projectorRenderingLayer = uint(UNITY_ACCESS_INSTANCED_PROP(Decal, _DecalLayerMaskFromDecal));
|
|
clip((surfaceRenderingLayer & projectorRenderingLayer) - 0.1);
|
|
#endif
|
|
|
|
#if defined(DECAL_RECONSTRUCT_NORMAL)
|
|
#if defined(_DECAL_NORMAL_BLEND_HIGH)
|
|
half3 normalWS = half3(ReconstructNormalTap9(packedInput.positionCS.xy));
|
|
#elif defined(_DECAL_NORMAL_BLEND_MEDIUM)
|
|
half3 normalWS = half3(ReconstructNormalTap5(packedInput.positionCS.xy));
|
|
#else
|
|
half3 normalWS = half3(ReconstructNormalDerivative(packedInput.positionCS.xy));
|
|
#endif
|
|
#elif defined(DECAL_LOAD_NORMAL)
|
|
half3 normalWS = half3(LoadSceneNormals(packedInput.positionCS.xy));
|
|
#endif
|
|
|
|
float2 positionSS = FoveatedRemapNonUniformToLinearCS(packedInput.positionCS.xy) * _ScreenSize.zw;
|
|
|
|
float3 positionWS = packedInput.positionWS.xyz;
|
|
half3 viewDirectionWS = half3(packedInput.viewDirectionWS);
|
|
|
|
DecalSurfaceData surfaceData;
|
|
SurfaceDescription surfaceDescription = (SurfaceDescription)0;
|
|
|
|
sampler2D tex23 = _MainTex;
|
|
float2 texCoord28 = packedInput.texCoord0.xy * float2( 1,1 ) + float2( 0,0 );
|
|
float2 uv23 = texCoord28;
|
|
float2 texelSize23 = float2( 0.0002441406,0.0002441406 );
|
|
float blurRadius23 = _BlurRadius;
|
|
float localGaussianBlur23 = GaussianBlur23( tex23 , uv23 , texelSize23 , blurRadius23 );
|
|
float4 temp_output_20_0 = ( localGaussianBlur23 * _ShadowColor );
|
|
|
|
|
|
surfaceDescription.BaseColor = temp_output_20_0.rgb;
|
|
surfaceDescription.Alpha = temp_output_20_0.a;
|
|
surfaceDescription.NormalTS = float3(0.0f, 0.0f, 1.0f);
|
|
surfaceDescription.NormalAlpha = 1;
|
|
|
|
#if defined( _MATERIAL_AFFECTS_MAOS )
|
|
surfaceDescription.Metallic = 0;
|
|
surfaceDescription.Occlusion = 1;
|
|
surfaceDescription.Smoothness = 0.5;
|
|
surfaceDescription.MAOSAlpha = 1;
|
|
#endif
|
|
|
|
#if defined( _MATERIAL_AFFECTS_EMISSION )
|
|
surfaceDescription.Emission = float3(0, 0, 0);
|
|
#endif
|
|
|
|
GetSurfaceData(packedInput, surfaceDescription, surfaceData);
|
|
|
|
half3 normalToPack = surfaceData.normalWS.xyz;
|
|
#ifdef DECAL_RECONSTRUCT_NORMAL
|
|
surfaceData.normalWS.xyz = normalize(lerp(normalWS.xyz, surfaceData.normalWS.xyz, surfaceData.normalWS.w));
|
|
#endif
|
|
|
|
InputData inputData;
|
|
InitializeInputData(packedInput, positionWS, surfaceData.normalWS.xyz, viewDirectionWS, inputData);
|
|
|
|
SurfaceData surface = (SurfaceData)0;
|
|
GetSurface(surfaceData, surface);
|
|
|
|
BRDFData brdfData;
|
|
InitializeBRDFData(surface.albedo, surface.metallic, 0, surface.smoothness, surface.alpha, brdfData);
|
|
|
|
#ifdef _MATERIAL_AFFECTS_ALBEDO
|
|
Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, inputData.shadowMask);
|
|
MixRealtimeAndBakedGI(mainLight, surfaceData.normalWS.xyz, inputData.bakedGI, inputData.shadowMask);
|
|
half3 color = GlobalIllumination(brdfData, inputData.bakedGI, surface.occlusion, surfaceData.normalWS.xyz, inputData.viewDirectionWS);
|
|
#else
|
|
half3 color = 0;
|
|
#endif
|
|
|
|
#pragma warning (disable : 3578) // The output value isn't completely initialized.
|
|
half3 packedNormalWS = PackGBufferNormal(normalToPack);
|
|
fragmentOutput.gBuffer0 = half4(surfaceData.baseColor.rgb, surfaceData.baseColor.a);
|
|
fragmentOutput.gBuffer1 = 0;
|
|
fragmentOutput.gBuffer2 = half4(packedNormalWS, surfaceData.normalWS.a);
|
|
fragmentOutput.color = half4(surfaceData.emissive + color, surfaceData.baseColor.a);
|
|
|
|
#if defined(GBUFFER_FEATURE_SHADOWMASK)
|
|
fragmentOutput.shadowMask = inputData.shadowMask;
|
|
#endif
|
|
|
|
#pragma warning (default : 3578) // Restore output value isn't completely initialized.
|
|
|
|
}
|
|
|
|
ENDHLSL
|
|
}
|
|
|
|
|
|
Pass
|
|
{
|
|
|
|
Name "ScenePickingPass"
|
|
Tags { "LightMode"="Picking" }
|
|
|
|
Cull Back
|
|
|
|
HLSLPROGRAM
|
|
|
|
#define _MATERIAL_AFFECTS_ALBEDO 1
|
|
#define _MATERIAL_AFFECTS_NORMAL_BLEND 1
|
|
#define ASE_VERSION 19904
|
|
#define ASE_SRP_VERSION 170200
|
|
|
|
|
|
#pragma multi_compile_instancing
|
|
#pragma editor_sync_compilation
|
|
#pragma vertex Vert
|
|
#pragma fragment Frag
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
|
|
#define HAVE_MESH_MODIFICATION
|
|
|
|
#define SHADERPASS SHADERPASS_DEPTHONLY
|
|
#define SCENEPICKINGPASS 1
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"
|
|
#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/Input.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl"
|
|
#include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DebugMipmapStreamingMacros.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DecalInput.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderVariablesDecal.hlsl"
|
|
|
|
#if _RENDER_PASS_ENABLED
|
|
#define GBUFFER3 0
|
|
#define GBUFFER4 1
|
|
FRAMEBUFFER_INPUT_X_HALF(GBUFFER3);
|
|
FRAMEBUFFER_INPUT_X_UINT(GBUFFER4);
|
|
#endif
|
|
|
|
#define ASE_NEEDS_TEXTURE_COORDINATES0
|
|
|
|
|
|
struct Attributes
|
|
{
|
|
float3 positionOS : POSITION;
|
|
float3 normalOS : NORMAL;
|
|
float4 tangentOS : TANGENT;
|
|
float4 ase_texcoord : TEXCOORD0;
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct PackedVaryings
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
float4 ase_texcoord : TEXCOORD0;
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _ShadowColor;
|
|
float _BlurRadius;
|
|
float _DrawOrder;
|
|
float _DecalMeshBiasType;
|
|
float _DecalMeshDepthBias;
|
|
float _DecalMeshViewBias;
|
|
#if defined(DECAL_ANGLE_FADE)
|
|
float _DecalAngleFadeSupported;
|
|
#endif
|
|
UNITY_TEXTURE_STREAMING_DEBUG_VARS;
|
|
CBUFFER_END
|
|
|
|
#ifdef SCENEPICKINGPASS
|
|
float4 _SelectionID;
|
|
#endif
|
|
|
|
#ifdef SCENESELECTIONPASS
|
|
int _ObjectId;
|
|
int _PassValue;
|
|
#endif
|
|
|
|
sampler2D _MainTex;
|
|
|
|
|
|
float GaussianBlur23( sampler2D tex, float2 uv, float2 texelSize, float blurRadius )
|
|
{
|
|
float kernel[12] = {0.02, 0.05, 0.08, 0.12, 0.15, 0.18, 0.18, 0.15, 0.12, 0.08, 0.05, 0.02};
|
|
float kernelSum = 0.0;
|
|
float blurResult = 0.0;
|
|
for (int x = -6; x <= 6; x++) {
|
|
for (int y = -6; y <= 6; y++) {
|
|
float2 sampleUV = uv + texelSize * float2(x, y) * blurRadius;
|
|
float weight = kernel[abs(x)] * kernel[abs(y)];
|
|
|
|
// 텍스처 샘플링
|
|
float4 texColor = tex2D(tex, sampleUV);
|
|
|
|
// RGB → 그레이스케일 (luminance 방식)
|
|
float grayscale = dot(texColor.rgb, float3(0.299, 0.587, 0.114));
|
|
|
|
// 그레이스케일 * 1000000 → 클램프(0,1)
|
|
float boostedGray = saturate(grayscale * 1000000.0);
|
|
|
|
// 알파와 더하기 → 클램프(0,1)
|
|
float combined = saturate(boostedGray + texColor.a);
|
|
|
|
// 가중치 적용
|
|
blurResult += combined * weight;
|
|
kernelSum += weight;
|
|
}
|
|
}
|
|
return blurResult / kernelSum;
|
|
}
|
|
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR)
|
|
#define DECAL_PROJECTOR
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_MESH) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_MESH
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DBUFFER_MESH)
|
|
#define DECAL_DBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_SCREEN_SPACE_MESH)
|
|
#define DECAL_SCREEN_SPACE
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_DECAL_GBUFFER_PROJECTOR) || (SHADERPASS == SHADERPASS_DECAL_GBUFFER_MESH)
|
|
#define DECAL_GBUFFER
|
|
#endif
|
|
|
|
#if (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_PROJECTOR) || (SHADERPASS == SHADERPASS_FORWARD_EMISSIVE_MESH)
|
|
#define DECAL_FORWARD_EMISSIVE
|
|
#endif
|
|
|
|
#if ((!defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_ALBEDO)) || (defined(_MATERIAL_AFFECTS_NORMAL) && defined(_MATERIAL_AFFECTS_NORMAL_BLEND))) && (defined(DECAL_SCREEN_SPACE) || defined(DECAL_GBUFFER))
|
|
#define DECAL_RECONSTRUCT_NORMAL
|
|
#elif defined(DECAL_ANGLE_FADE)
|
|
#define DECAL_LOAD_NORMAL
|
|
#endif
|
|
|
|
#ifdef _DECAL_LAYERS
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareRenderingLayerTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_LOAD_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl"
|
|
#endif
|
|
|
|
#if defined(DECAL_PROJECTOR) || defined(DECAL_RECONSTRUCT_NORMAL)
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_MESH
|
|
#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/DecalMeshBiasTypeEnum.cs.hlsl"
|
|
#endif
|
|
|
|
#ifdef DECAL_RECONSTRUCT_NORMAL
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/NormalReconstruction.hlsl"
|
|
#endif
|
|
|
|
PackedVaryings Vert(Attributes inputMesh )
|
|
{
|
|
PackedVaryings packedOutput;
|
|
ZERO_INITIALIZE(PackedVaryings, packedOutput);
|
|
|
|
UNITY_SETUP_INSTANCE_ID(inputMesh);
|
|
UNITY_TRANSFER_INSTANCE_ID(inputMesh, packedOutput);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(packedOutput);
|
|
|
|
inputMesh.tangentOS = float4( 1, 0, 0, -1 );
|
|
inputMesh.normalOS = float3( 0, 1, 0 );
|
|
|
|
packedOutput.ase_texcoord.xy = inputMesh.ase_texcoord.xy;
|
|
|
|
//setting value to unused interpolator channels and avoid initialization warnings
|
|
packedOutput.ase_texcoord.zw = 0;
|
|
|
|
float3 positionWS = TransformObjectToWorld(inputMesh.positionOS);
|
|
packedOutput.positionCS = TransformWorldToHClip(positionWS);
|
|
|
|
return packedOutput;
|
|
}
|
|
|
|
void Frag(PackedVaryings packedInput,
|
|
out float4 outColor : SV_Target0
|
|
|
|
)
|
|
{
|
|
sampler2D tex23 = _MainTex;
|
|
float2 texCoord28 = packedInput.ase_texcoord.xy * float2( 1,1 ) + float2( 0,0 );
|
|
float2 uv23 = texCoord28;
|
|
float2 texelSize23 = float2( 0.0002441406,0.0002441406 );
|
|
float blurRadius23 = _BlurRadius;
|
|
float localGaussianBlur23 = GaussianBlur23( tex23 , uv23 , texelSize23 , blurRadius23 );
|
|
float4 temp_output_20_0 = ( localGaussianBlur23 * _ShadowColor );
|
|
|
|
|
|
float3 BaseColor = temp_output_20_0.rgb;
|
|
|
|
outColor = unity_SelectionID;
|
|
}
|
|
ENDHLSL
|
|
}
|
|
}
|
|
CustomEditor "UnityEditor.Rendering.Universal.DecalShaderGraphGUI"
|
|
FallBack "Hidden/Shader Graph/FallbackError"
|
|
|
|
Fallback Off
|
|
}
|
|
/*ASEBEGIN
|
|
Version=19904
|
|
Node;AmplifyShaderEditor.TextureCoordinatesNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;28;-1440,320;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, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;30;-1552,496;Inherit;False;Property;_BlurRadius;Blur Radius;2;0;Create;True;0;0;0;False;0;False;0;0;0;10;0;1;FLOAT;0
|
|
Node;AmplifyShaderEditor.TexturePropertyNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;24;-1520,96;Inherit;True;Property;_MainTex;MainTex;1;0;Create;True;0;0;0;False;0;False;None;None;False;white;Auto;Texture2D;False;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1
|
|
Node;AmplifyShaderEditor.ColorNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;21;-1136,64;Inherit;False;Property;_ShadowColor;Shadow Color;0;0;Create;True;0;0;0;False;0;False;1,1,1,1;1,1,1,1;True;True;0;6;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT3;5
|
|
Node;AmplifyShaderEditor.CustomExpressionNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;23;-1088,288;Inherit;False; float kernel[12] = {0.02, 0.05, 0.08, 0.12, 0.15, 0.18, 0.18, 0.15, 0.12, 0.08, 0.05, 0.02}@$ float kernelSum = 0.0@$ float blurResult = 0.0@$$ for (int x = -6@ x <= 6@ x++) {$ for (int y = -6@ y <= 6@ y++) {$ float2 sampleUV = uv + texelSize * float2(x, y) * blurRadius@$ float weight = kernel[abs(x)] * kernel[abs(y)]@$ $ // 텍스처 샘플링$ float4 texColor = tex2D(tex, sampleUV)@$ $ // RGB → 그레이스케일 (luminance 방식)$ float grayscale = dot(texColor.rgb, float3(0.299, 0.587, 0.114))@$ $ // 그레이스케일 * 1000000 → 클램프(0,1)$ float boostedGray = saturate(grayscale * 1000000.0)@$ $ // 알파와 더하기 → 클램프(0,1)$ float combined = saturate(boostedGray + texColor.a)@$ $ // 가중치 적용$ blurResult += combined * weight@$ kernelSum += weight@$ }$ }$$ return blurResult / kernelSum@;1;Create;4;True;tex;SAMPLER2D;;In;;Inherit;False;True;uv;FLOAT2;0,0;In;;Inherit;False;True;texelSize;FLOAT2;0.0002441406,0.0002441406;In;;Inherit;False;True;blurRadius;FLOAT;0;In;;Float;False;GaussianBlur;True;False;0;;False;4;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT2;0.0002441406,0.0002441406;False;3;FLOAT;0;False;1;FLOAT;0
|
|
Node;AmplifyShaderEditor.SimpleMultiplyOpNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;20;-848,-80;Inherit;False;2;2;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
|
|
Node;AmplifyShaderEditor.BreakToComponentsNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;29;-638.307,131.2985;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15
|
|
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;11;0,0;Float;False;False;-1;2;UnityEditor.Rendering.Universal.DecalShaderGraphGUI;0;14;New Amplify Shader;c2a467ab6d5391a4ea692226d82ffefd;True;DBufferProjector;0;0;DBufferProjector;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;5;RenderPipeline=UniversalPipeline;PreviewType=Plane;DisableBatching=LODFading=DisableBatching;ShaderGraphShader=true;ShaderGraphTargetId=UniversalDecalSubTarget;True;3;True;12;all;0;False;True;2;5;False;;10;False;;1;0;False;;10;False;;False;False;True;2;5;False;;10;False;;1;0;False;;10;False;;False;False;True;2;5;False;;10;False;;1;0;False;;10;False;;False;False;False;False;False;False;True;1;False;;False;False;False;True;False;False;False;False;0;False;;False;True;True;True;True;True;0;False;;False;False;False;False;False;True;2;False;;True;2;False;;False;True;1;LightMode=DBufferProjector;False;True;9;d3d11;metal;vulkan;xboxone;xboxseries;playstation;ps4;ps5;switch;0;;0;0;Standard;0;False;0
|
|
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;12;0,0;Float;False;False;-1;2;UnityEditor.Rendering.Universal.DecalShaderGraphGUI;0;14;New Amplify Shader;c2a467ab6d5391a4ea692226d82ffefd;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;5;RenderPipeline=UniversalPipeline;PreviewType=Plane;DisableBatching=LODFading=DisableBatching;ShaderGraphShader=true;ShaderGraphTargetId=UniversalDecalSubTarget;True;3;True;12;all;0;False;True;8;5;False;;1;False;;0;1;False;;0;False;;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;True;2;False;;False;True;1;LightMode=DecalProjectorForwardEmissive;False;False;0;;0;0;Standard;0;False;0
|
|
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;13;0,0;Float;False;True;-1;2;UnityEditor.Rendering.Universal.DecalShaderGraphGUI;0;15;Util function/Fake Shadow;c2a467ab6d5391a4ea692226d82ffefd;True;DecalScreenSpaceProjector;0;2;DecalScreenSpaceProjector;9;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;5;RenderPipeline=UniversalPipeline;PreviewType=Plane;DisableBatching=LODFading=DisableBatching;ShaderGraphShader=true;ShaderGraphTargetId=UniversalDecalSubTarget;True;3;True;12;all;0;False;True;2;5;False;;10;False;;0;1;False;;0;False;;False;False;False;False;False;False;False;False;False;False;False;False;True;1;False;;False;False;False;False;False;False;False;False;False;False;False;True;2;False;;True;2;False;;False;True;1;LightMode=DecalScreenSpaceProjector;False;False;0;;0;0;Standard;7;Affect BaseColor;1;0;Affect Normal;0;638824822181487303; Blend;0;0;Affect MAOS;0;638824822138530880;Affect Emission;0;0;Support LOD CrossFade;0;0;Angle Fade;0;638824822193992285;0;9;True;False;True;True;True;False;True;True;True;False;;False;0
|
|
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;14;0,0;Float;False;False;-1;2;UnityEditor.Rendering.Universal.DecalShaderGraphGUI;0;14;New Amplify Shader;c2a467ab6d5391a4ea692226d82ffefd;True;DecalGBufferProjector;0;3;DecalGBufferProjector;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;5;RenderPipeline=UniversalPipeline;PreviewType=Plane;DisableBatching=LODFading=DisableBatching;ShaderGraphShader=true;ShaderGraphTargetId=UniversalDecalSubTarget;True;3;True;12;all;0;False;True;2;5;False;;10;False;;0;1;False;;0;False;;False;False;True;2;5;False;;10;False;;0;1;False;;0;False;;False;False;True;2;5;False;;10;False;;0;1;False;;0;False;;False;False;True;2;5;False;;10;False;;0;1;False;;0;False;;False;False;False;True;1;False;;False;False;False;True;False;False;False;False;0;False;;False;True;False;False;False;False;0;False;;False;True;True;True;True;False;0;False;;False;False;False;True;2;False;;True;2;False;;False;True;1;LightMode=DecalGBufferProjector;False;False;0;;0;0;Standard;0;False;0
|
|
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;15;0,0;Float;False;False;-1;2;UnityEditor.Rendering.Universal.DecalShaderGraphGUI;0;14;New Amplify Shader;c2a467ab6d5391a4ea692226d82ffefd;True;DBufferMesh;0;4;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;5;RenderPipeline=UniversalPipeline;PreviewType=Plane;DisableBatching=LODFading=DisableBatching;ShaderGraphShader=true;ShaderGraphTargetId=UniversalDecalSubTarget;True;3;True;12;all;0;False;True;2;5;False;;10;False;;1;0;False;;10;False;;False;False;True;2;5;False;;10;False;;1;0;False;;10;False;;False;False;True;2;5;False;;10;False;;1;0;False;;10;False;;False;False;False;False;False;False;False;False;False;False;True;False;False;False;False;0;False;;False;True;True;True;True;True;0;False;;False;False;False;False;False;True;2;False;;True;3;False;;False;True;1;LightMode=DBufferMesh;False;False;0;;0;0;Standard;0;False;0
|
|
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;16;0,0;Float;False;False;-1;2;UnityEditor.Rendering.Universal.DecalShaderGraphGUI;0;14;New Amplify Shader;c2a467ab6d5391a4ea692226d82ffefd;True;DecalMeshForwardEmissive;0;5;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;5;RenderPipeline=UniversalPipeline;PreviewType=Plane;DisableBatching=LODFading=DisableBatching;ShaderGraphShader=true;ShaderGraphTargetId=UniversalDecalSubTarget;True;3;True;12;all;0;False;True;8;5;False;;1;False;;0;1;False;;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;True;2;False;;True;3;False;;False;True;1;LightMode=DecalMeshForwardEmissive;False;False;0;;0;0;Standard;0;False;0
|
|
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;17;0,0;Float;False;False;-1;2;UnityEditor.Rendering.Universal.DecalShaderGraphGUI;0;14;New Amplify Shader;c2a467ab6d5391a4ea692226d82ffefd;True;DecalScreenSpaceMesh;0;6;DecalScreenSpaceMesh;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;5;RenderPipeline=UniversalPipeline;PreviewType=Plane;DisableBatching=LODFading=DisableBatching;ShaderGraphShader=true;ShaderGraphTargetId=UniversalDecalSubTarget;True;3;True;12;all;0;False;True;2;5;False;;10;False;;0;1;False;;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;True;2;False;;True;3;False;;False;True;1;LightMode=DecalScreenSpaceMesh;False;False;0;;0;0;Standard;0;False;0
|
|
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;18;0,0;Float;False;False;-1;2;UnityEditor.Rendering.Universal.DecalShaderGraphGUI;0;14;New Amplify Shader;c2a467ab6d5391a4ea692226d82ffefd;True;DecalGBufferMesh;0;7;DecalGBufferMesh;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;False;False;False;False;False;True;5;RenderPipeline=UniversalPipeline;PreviewType=Plane;DisableBatching=LODFading=DisableBatching;ShaderGraphShader=true;ShaderGraphTargetId=UniversalDecalSubTarget;True;3;True;12;all;0;False;True;2;5;False;;10;False;;0;1;False;;0;False;;False;False;True;2;5;False;;10;False;;0;1;False;;0;False;;False;False;True;2;5;False;;10;False;;0;1;False;;0;False;;False;False;True;2;5;False;;10;False;;0;1;False;;0;False;;False;False;False;False;False;False;False;True;False;False;False;False;0;False;;False;True;False;False;False;False;0;False;;False;True;True;True;True;False;0;False;;False;False;False;True;2;False;;False;False;True;1;LightMode=DecalGBufferMesh;False;False;0;;0;0;Standard;0;False;0
|
|
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode, AmplifyShaderEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;19;0,0;Float;False;False;-1;2;UnityEditor.Rendering.Universal.DecalShaderGraphGUI;0;14;New Amplify Shader;c2a467ab6d5391a4ea692226d82ffefd;True;ScenePickingPass;0;8;ScenePickingPass;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;5;RenderPipeline=UniversalPipeline;PreviewType=Plane;DisableBatching=LODFading=DisableBatching;ShaderGraphShader=true;ShaderGraphTargetId=UniversalDecalSubTarget;True;3;True;12;all;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;0;False;;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=Picking;False;False;0;;0;0;Standard;0;False;0
|
|
WireConnection;23;0;24;0
|
|
WireConnection;23;1;28;0
|
|
WireConnection;23;3;30;0
|
|
WireConnection;20;0;23;0
|
|
WireConnection;20;1;21;0
|
|
WireConnection;29;0;20;0
|
|
WireConnection;13;0;20;0
|
|
WireConnection;13;1;29;3
|
|
ASEEND*/
|
|
//CHKSM=90683DD262D715771941E1AD78ADCE635E74E004 |