// 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