From c34d6080e256bd80910306b2e8caacbd85704c24 Mon Sep 17 00:00:00 2001 From: "qsxft258@gmail.com" Date: Sun, 24 Aug 2025 20:18:49 +0900 Subject: [PATCH] =?UTF-8?q?Fix=20:=20=EC=BC=80=EB=B9=84=ED=8B=B0=20?= =?UTF-8?q?=ED=8F=AC=EC=8A=A4=ED=8A=B8=20=ED=9A=A8=EA=B3=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=ED=8C=A8=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/SSCC.cs | 43 +++++++++++++++++ .../SRP/URP/Runtime/SSCC.cs | 7 ++- .../SRP/URP/Runtime/SSCCRendererFeature.cs | 46 ++++++++++++++----- .../SRP/URP/Shaders/Shared.cginc | 33 +++++++++++++ .../SRP/URP/Shaders/URP_SSCC.shader | 4 +- ...niversalRenderPipelineGlobalSettings.asset | 4 +- .../Scene/[첸나]방송용 방/GlobalVolumeProfile.asset | 4 +- Packages/manifest.json | 4 +- Packages/packages-lock.json | 4 +- 9 files changed, 127 insertions(+), 22 deletions(-) diff --git a/Assets/External/Screen Space Cavity Curvature/Runtime/SSCC.cs b/Assets/External/Screen Space Cavity Curvature/Runtime/SSCC.cs index 2aefc8b8..ebc54a24 100644 --- a/Assets/External/Screen Space Cavity Curvature/Runtime/SSCC.cs +++ b/Assets/External/Screen Space Cavity Curvature/Runtime/SSCC.cs @@ -24,6 +24,10 @@ namespace ScreenSpaceCavityCurvature [HideInInspector] public Shader ssccShader; + [Header("Volume Integration")] + [Tooltip("Enable this to use Volume-based SSCC instead of this component. This component will be disabled when Volume SSCC is active.")] + public bool useVolumeSystem = true; + // [Tooltip("Lerps the whole effect from 0 to 1.")] [Range(0f, 1f)] public float effectIntensity = 1f; [Tooltip("Divides effect intensity by (depth * distanceFade).\nZero means effect doesn't fade with distance.")] [Range(0f, 1f)] public float distanceFade = 0f; @@ -73,6 +77,25 @@ namespace ScreenSpaceCavityCurvature OutputEffectTo Output => debugMode != DebugMode.Disabled ? OutputEffectTo.Screen : output; + // Volume 시스템 확인 메서드 추가 (Built-in 렌더 파이프라인용) + private bool IsVolumeSystemActive() + { + if (!useVolumeSystem) return false; + + try + { + // Built-in 렌더 파이프라인에서는 볼륨 시스템이 없으므로 항상 false 반환 + // URP용 SSCC가 활성화되어 있는지 확인할 수 없으므로 기본적으로 비활성화 + return false; + } + catch (System.Exception e) + { + Debug.LogWarning($"SSCC Volume system check failed: {e.Message}"); + } + + return false; + } + static class Pass { public const int Copy = 0; @@ -220,6 +243,26 @@ namespace ScreenSpaceCavityCurvature void OnPreRender() { + // 씬뷰에서는 SSCC 효과 비활성화 + if (ssccCamera.cameraType == CameraType.SceneView) + { + if (cmdBuffer != null) + { + ClearCommandBuffer(cmdBuffer); + } + return; + } + + // 볼륨 시스템이 활성화되어 있으면 이 컴포넌트는 비활성화 + if (IsVolumeSystemActive()) + { + if (cmdBuffer != null) + { + ClearCommandBuffer(cmdBuffer); + } + return; + } + if (ssccShader == null || ssccCamera == null) return; FetchRenderParameters(); diff --git a/Assets/External/Screen Space Cavity Curvature/SRP/URP/Runtime/SSCC.cs b/Assets/External/Screen Space Cavity Curvature/SRP/URP/Runtime/SSCC.cs index 81ae7e74..b120332b 100644 --- a/Assets/External/Screen Space Cavity Curvature/SRP/URP/Runtime/SSCC.cs +++ b/Assets/External/Screen Space Cavity Curvature/SRP/URP/Runtime/SSCC.cs @@ -42,7 +42,7 @@ namespace ScreenSpaceCavityCurvature.Universal // [Header("(Make sure Post Processing and Depth Texture are enabled.)")] - [Tooltip("Lerps the whole effect from 0 to 1.")] public ClampedFloatParameter effectIntensity = new ClampedFloatParameter(1f, 0f, 1f); + [Tooltip("Lerps the whole effect from 0 to 1.")] public ClampedFloatParameter effectIntensity = new ClampedFloatParameter(0f, 0f, 1f); [Tooltip("Divides effect intensity by (depth * distanceFade).\nZero means effect doesn't fade with distance.")] public ClampedFloatParameter distanceFade = new ClampedFloatParameter(0f, 0f, 1f); [Space(6)] @@ -73,6 +73,11 @@ namespace ScreenSpaceCavityCurvature.Universal [Space(6)] [Tooltip("Screen: Applies the effect over the entire screen.\n\n_SSCCTexture: Instead of writing the effect to the screen, will write the effect into a global shader texture named _SSCCTexture, so you can sample it selectively in your shaders and exclude certain objects from receiving outlines etc. See \"Output To Texture Examples\" folder for example shaders.")] public OutputParameter output = new OutputParameter(OutputEffectTo.Screen); + + [Space(6)] + + [Header("NiloToon Integration")] + [Tooltip("Enable NiloToon character masking. When enabled, SSCC effect will not be applied to NiloToon characters.")] public BoolParameter enableNiloToonMasking = new BoolParameter(true); // public bool IsActive() => effectIntensity.value > 0f; diff --git a/Assets/External/Screen Space Cavity Curvature/SRP/URP/Runtime/SSCCRendererFeature.cs b/Assets/External/Screen Space Cavity Curvature/SRP/URP/Runtime/SSCCRendererFeature.cs index 6c8e8ef9..53ae2cf7 100644 --- a/Assets/External/Screen Space Cavity Curvature/SRP/URP/Runtime/SSCCRendererFeature.cs +++ b/Assets/External/Screen Space Cavity Curvature/SRP/URP/Runtime/SSCCRendererFeature.cs @@ -67,13 +67,14 @@ namespace ScreenSpaceCavityCurvature.Universal public static int cavityValley = Shader.PropertyToID("_CavityDarks"); public static int globalSSCCTexture = Shader.PropertyToID("_SSCCTexture"); + public static int niloToonPrepassBufferTex = Shader.PropertyToID("_NiloToonPrepassBufferTex"); } Material mat { get; set; } RenderTargetIdentifier source { get; set; } CameraData cameraData { get; set; } RenderTextureDescriptor sourceDesc { get; set; } - + public void Setup(Shader shader, ScriptableRenderer renderer, RenderingData renderingData) { if (mat == null) mat = CoreUtils.CreateEngineMaterial(shader); @@ -157,6 +158,13 @@ namespace ScreenSpaceCavityCurvature.Universal if (!sscc.IsActive()) return; var cmd = CommandBufferPool.Get("SSCC"); + // NiloToon prepass 텍스처는 이미 각 카메라에서 자동 생성되므로 그대로 사용 + if (sscc.enableNiloToonMasking.value) + { + // NiloToon prepass 텍스처가 이미 전역으로 설정되어 있으므로 추가 설정 불필요 + // _NiloToonPrepassBufferTex는 NiloToon 시스템에서 자동으로 관리됨 + } + int div = sscc.cavityResolution.value == SSCC.CavityResolution.Full ? 1 : sscc.cavityResolution.value == SSCC.CavityResolution.HalfUpscaled ? 2 : 2; cmd.GetTemporaryRT(ShaderProperties.cavityTex, sourceDesc.width / div, sourceDesc.height / div, 0, FilterMode.Bilinear, GraphicsFormat.R32G32B32A32_SFloat); cmd.GetTemporaryRT(ShaderProperties.cavityTex1, sourceDesc.width / div, sourceDesc.height / div, 0, FilterMode.Bilinear, GraphicsFormat.R32G32B32A32_SFloat); @@ -224,18 +232,32 @@ namespace ScreenSpaceCavityCurvature.Universal mat.SetFloat(ShaderProperties.cavityValley, sscc.cavityDarks.value * 2f); } - void UpdateShaderKeywords() + private void UpdateShaderKeywords() { - mat.shaderKeywords = new string[] - { - cameraData.camera.orthographic ? "ORTHOGRAPHIC_PROJECTION" : "__", - sscc.debugMode.value == SSCC.DebugMode.EffectOnly ? "DEBUG_EFFECT" : sscc.debugMode.value == SSCC.DebugMode.ViewNormals ? "DEBUG_NORMALS" : "__", - sscc.normalsSource.value == SSCC.PerPixelNormals.ReconstructedFromDepth ? "NORMALS_RECONSTRUCT" : "__", - sscc.cavitySamples.value == SSCC.CavitySamples.Low6 ? "CAVITY_SAMPLES_6" : sscc.cavitySamples.value == SSCC.CavitySamples.Medium8 ? "CAVITY_SAMPLES_8" : sscc.cavitySamples.value == SSCC.CavitySamples.High12 ? "CAVITY_SAMPLES_12" : sscc.cavitySamples.value == SSCC.CavitySamples.VeryHigh20 ? "CAVITY_SAMPLES_20" : "", - sscc.saturateCavity.value ? "SATURATE_CAVITY" : "__", - Output == SSCC.OutputEffectTo._SSCCTexture ? "OUTPUT_TO_TEXTURE" : "__", - sscc.cavityResolution.value == SSCC.CavityResolution.HalfUpscaled ? "UPSCALE_CAVITY" : "__" - }; + if (mat == null) return; + + // 디버그 모드 키워드 설정 + bool debugEffect = sscc.debugMode.value == SSCC.DebugMode.EffectOnly; + bool debugNormals = sscc.debugMode.value == SSCC.DebugMode.ViewNormals; + + CoreUtils.SetKeyword(mat, "DEBUG_EFFECT", debugEffect); + CoreUtils.SetKeyword(mat, "DEBUG_NORMALS", debugNormals); + + // NiloToon 마스킹 키워드 설정 + CoreUtils.SetKeyword(mat, "CHARACTER_MASKING", sscc.enableNiloToonMasking.value); + + // 기타 키워드 설정 + CoreUtils.SetKeyword(mat, "ORTHOGRAPHIC_PROJECTION", cameraData.camera.orthographic); + CoreUtils.SetKeyword(mat, "NORMALS_RECONSTRUCT", sscc.normalsSource.value == SSCC.PerPixelNormals.ReconstructedFromDepth); + CoreUtils.SetKeyword(mat, "SATURATE_CAVITY", sscc.saturateCavity.value); + CoreUtils.SetKeyword(mat, "OUTPUT_TO_TEXTURE", Output == SSCC.OutputEffectTo._SSCCTexture); + CoreUtils.SetKeyword(mat, "UPSCALE_CAVITY", sscc.cavityResolution.value == SSCC.CavityResolution.HalfUpscaled); + + // Cavity 샘플 수 키워드 설정 + CoreUtils.SetKeyword(mat, "CAVITY_SAMPLES_6", sscc.cavitySamples.value == SSCC.CavitySamples.Low6); + CoreUtils.SetKeyword(mat, "CAVITY_SAMPLES_8", sscc.cavitySamples.value == SSCC.CavitySamples.Medium8); + CoreUtils.SetKeyword(mat, "CAVITY_SAMPLES_12", sscc.cavitySamples.value == SSCC.CavitySamples.High12); + CoreUtils.SetKeyword(mat, "CAVITY_SAMPLES_20", sscc.cavitySamples.value == SSCC.CavitySamples.VeryHigh20); } diff --git a/Assets/External/Screen Space Cavity Curvature/SRP/URP/Shaders/Shared.cginc b/Assets/External/Screen Space Cavity Curvature/SRP/URP/Shaders/Shared.cginc index 2b406324..57af7990 100644 --- a/Assets/External/Screen Space Cavity Curvature/SRP/URP/Shaders/Shared.cginc +++ b/Assets/External/Screen Space Cavity Curvature/SRP/URP/Shaders/Shared.cginc @@ -4,6 +4,23 @@ #define SAMPLE(texture, sampler, uv) UNITY_SAMPLE_SCREENSPACE_TEXTURE(texture, uv) #endif +// NiloToon 캐릭터 마스킹 함수 추가 +inline float GetCharacterMask(float2 uv) +{ + #if CHARACTER_MASKING + // NiloToon prepass 텍스처에서 캐릭터 영역 확인 (g 채널이 visible area) + // _NiloToonPrepassBufferTex는 NiloToon 시스템에서 자동으로 전역 설정됨 + float mask = SAMPLE_TEXTURE2D_X(_NiloToonPrepassBufferTex, sampler_PointClamp, uv).g; + // 디버깅: 마스크 값이 0이면 캐릭터 영역, 1이면 배경 영역 + // 텍스처가 없거나 제대로 설정되지 않은 경우를 대비해 안전장치 추가 + // mask 값이 예상 범위를 벗어나면 마스킹을 비활성화 + if (mask < 0.0 || mask > 1.0) return 1.0; // 안전장치 + return mask > 0.0 ? 0.0 : 1.0; // 캐릭터 영역이면 0, 아니면 1 + #else + return 1.0; // 마스킹 비활성화시 항상 1 + #endif +} + //CAVITY V #ifdef CAVITY_SAMPLES_6 #define CAVITY_SAMPLES 6 @@ -255,6 +272,22 @@ float4 Composite_Frag(Varyings input) : SV_Target //float depth01 = FetchRawDepth(uv); //if (depth01 == 1.0 || depth01 == 0.0) return col; + // NiloToon 캐릭터 마스킹 적용 + #if CHARACTER_MASKING + float mask = GetCharacterMask(uv); + // 디버깅: 마스크 값 확인 + // mask가 0이면 캐릭터 영역이므로 원본 색상 반환 + // mask가 1이면 배경 영역이므로 SSCC 효과 적용 + + // 디버깅용: 마스크 값을 시각적으로 확인 (임시로 주석 처리) + // return float4(mask, mask, mask, 1.0); // 마스크 값을 흰색으로 표시 + + if (mask < 0.5) + { + return untouchedCol; // 캐릭터 영역 + } + #endif + float curvature = 0.0; curvature = Curvature(uv, P); diff --git a/Assets/External/Screen Space Cavity Curvature/SRP/URP/Shaders/URP_SSCC.shader b/Assets/External/Screen Space Cavity Curvature/SRP/URP/Shaders/URP_SSCC.shader index 0d8ecf04..11849e2b 100644 --- a/Assets/External/Screen Space Cavity Curvature/SRP/URP/Shaders/URP_SSCC.shader +++ b/Assets/External/Screen Space Cavity Curvature/SRP/URP/Shaders/URP_SSCC.shader @@ -22,6 +22,7 @@ #pragma multi_compile_local __ SATURATE_CAVITY #pragma multi_compile_local __ OUTPUT_TO_TEXTURE #pragma multi_compile_local __ UPSCALE_CAVITY + #pragma multi_compile_local __ CHARACTER_MASKING #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" @@ -32,6 +33,7 @@ TEXTURE2D_X(_MainTex); TEXTURE2D_X(_CavityTex); + TEXTURE2D_X(_NiloToonPrepassBufferTex); //Unity 6.0's urp #includes themselves define sampler_LinearClamp #if UNITY_VERSION < 600000 @@ -158,7 +160,7 @@ #else float3 N = float3(0, 0, 0); #endif - N = float3(N.x, -N.yz); + N = float3(N.x, -N.y, N.z); #endif N = float3(N.x, -N.y, N.z); diff --git a/Assets/Resources/Settings/UniversalRenderPipelineGlobalSettings.asset b/Assets/Resources/Settings/UniversalRenderPipelineGlobalSettings.asset index 85e300da..84ed5b5b 100644 --- a/Assets/Resources/Settings/UniversalRenderPipelineGlobalSettings.asset +++ b/Assets/Resources/Settings/UniversalRenderPipelineGlobalSettings.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:746c070e75212f44f3c62c913ebd92d871a115d2a21830668b498d26d6905df5 -size 21605 +oid sha256:ae0c23d6a3eca133de1ed042f4a4bbd3c852738b30885ac5c628d08f2bb9c8ce +size 21647 diff --git a/Assets/ResourcesData/Background/[첸나]방송용 방/Scene/[첸나]방송용 방/GlobalVolumeProfile.asset b/Assets/ResourcesData/Background/[첸나]방송용 방/Scene/[첸나]방송용 방/GlobalVolumeProfile.asset index 714d0609..44b171dd 100644 --- a/Assets/ResourcesData/Background/[첸나]방송용 방/Scene/[첸나]방송용 방/GlobalVolumeProfile.asset +++ b/Assets/ResourcesData/Background/[첸나]방송용 방/Scene/[첸나]방송용 방/GlobalVolumeProfile.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:36e3c5921b1c28055e88986764e77923917a0e6d09c494b0299023369554fb53 -size 7832 +oid sha256:485c45294c92a85733b7c8346933b7186aa3e2d8bcda10d1b8f7db15b3b3df81 +size 11506 diff --git a/Packages/manifest.json b/Packages/manifest.json index f42ca0e1..077b66f9 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:82db22723c6a76dffd87cda48fb8278c4686913a191301c9f8d71844db7d1d95 -size 2613 +oid sha256:8c39f0bf297b28dcff95210f90f3ab68d6abbe2f17f89e3e18995284f17a7af8 +size 2657 diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 1cd6b549..529b48a2 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f0885d9201efcc7356f702a6eafbc4c65d787e6d68267347d6f314d405fc07c -size 15792 +oid sha256:9ba3f4e738555289c29503c1bedd7828aa0d4aa131938015abd2ae99543713f2 +size 16064