๐ English Abstract
This article explores technical solutions for severe GPU Fill Rate bottlenecks caused by Screen Space Raymarching Volumetric Fog in Unity's Universal Render Pipeline (URP). We dive deep into architectural optimizations using Half-Resolution Render Passes combined with Depth-Aware Bilateral Upsampling and Temporal Reprojection. Readers will learn how to drastically cut down rendering frame times without sacrificing visual fidelity while resolving common edge-bleeding and ghosting artifacts.
์ ๋ํฐ์ ์ ๋๋ฒ์ค ๋ ๋ ํ์ดํ๋ผ์ธ(Unity Universal Render Pipeline, URP)์์ ์๋ค๋งํฑ ์์ค์ ํ๊ฒฝ ๋ถ์๊ธฐ๋ฅผ ์ฐ์ถํ ๋ **์คํฌ๋ฆฐ ์คํ์ด์ค ๋ ์ด๋ง์นญ ๋ณผ๋ฅ๋ฉํธ๋ฆญ ํฌ๊ทธ(Screen Space Raymarching Volumetric Fog)**๋ ํ์์ ์ธ ๊ธฐ๋ฒ์ ๋๋ค. ํ์ง๋ง ์ด ๊ธฐ์ ์ ๋งค ํฝ์ ๋ง๋ค ์นด๋ฉ๋ผ์ ๊ด์ (Ray)์ ๋ฐ๋ผ 3D ๊ณต๊ฐ์ ์ ์ง์ํค๋ฉฐ ๋น์ ์ฐ๋(Scattering)๊ณผ ๊ฐ์(Extinction)๋ฅผ ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ GPU์ **์ฑ์ฐ๊ธฐ ๋น์จ(Fill Rate)** ๋ฐ **๋ฉ๋ชจ๋ฆฌ ๋์ญํญ(Memory Bandwidth)**์ ๊ทน์ฌํ ๋ถํ๋ฅผ ์ค๋๋ค.
ํนํ QHD, 4K์ ๊ฐ์ ๊ณ ํด์๋ ํ๊ฒฝ์ด๋ ๋ชจ๋ฐ์ผ, ์ฝ์ ํ๋ซํผ์์๋ ๋จ์ํ ๋ ์ด๋ง์นญ ์๊ณ ๋ฆฌ์ฆ๋ง์ผ๋ก ํ๊น ํ๋ ์ ๋ ์ดํธ(60 FPS/120 FPS)๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ฌ์ค์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋ณธ ํฌ์คํ ์์๋ URP ํ๊ฒฝ์์ ๋ฐ์ํ ๋ ์ด๋ง์นญ ํฌ๊ทธ์ GPU ๋ณ๋ชฉ ํ์์ ์ ํํ ์ง๋จํ๊ณ , ์ด๋ฅผ **๋ฐํด์๋ ๋ ๋ ํจ์ค(Half-Resolution Render Pass)**์ **์๊ณต๊ฐ ์ฌํฌ์(Temporal Reprojection)** ๊ธฐ์ ์ ๊ฒฐํฉํ์ฌ ์ฑ๋ฅ์ 300% ์ด์ ๊ฐ์ ํ๋ ์ค๋ฌด ํธ๋ฌ๋ธ์ํ ๊ณผ์ ์ ์ ํฉ๋๋ค.
1. ์์ธ ๋ถ์: ๋ ์ด๋ง์นญ ๋ณผ๋ฅ๋ฉํธ๋ฆญ ํฌ๊ทธ์ GPU Fill Rate ๋ณ๋ชฉ
๋ ์ด๋ง์นญ์ ์๋ ์๋ฆฌ์ ๊ณ์ฐ ๋ณต์ก๋ (Raymarching Computational Complexity)
๋ณผ๋ฅ๋ฉํธ๋ฆญ ํฌ๊ทธ๋ฅผ ๊ตฌํํ๋ ์คํฌ๋ฆฐ ์คํ์ด์ค ๋ ์ด๋ง์นญ(Screen Space Raymarching)์ ๊ฐ ํฝ์ ์ ํ๋ฉด ์ขํ(Screen Coordinates)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ ๊ณต๊ฐ์ 3D ๊ด์ ์ ์์ฑํฉ๋๋ค. ์ด ๊ด์ ์ ๋ทฐ ํ๋ฌ์คํ (View Frustum)์ ๊ทผํ๋ฉด(Near Plane)๋ถํฐ ๊น์ด ๋ฒํผ(Depth Buffer)์ ๊ธฐ๋ก๋ ์ ํ ๊น์ด(Linear Depth) ์ง์ ๊น์ง ํ์ํ๋ฉฐ ์ค์ ๋ **์คํ ์(Step Count)**๋งํผ ๋ฐ๋ณต ๊ณ์ฐ์ ์ํํฉ๋๋ค.
- ํฝ์ ๋น ์ ฐ์ด๋ ์ฐ์ฐ๋: ์๋ฅผ ๋ค์ด $3840 \times 2160$ ํด์๋์์ 64 ์คํ ์ผ๋ก ๋ ์ด๋ง์นญ์ ์งํํ ๊ฒฝ์ฐ, ๋จ ํ ํ๋ ์์ ์ฝ 5์ต 3,000๋ง ๋ฒ ์ด์์ ์๋ฒ ๋/์์ธ ๋ ธ์ด์ฆ ํ ์ค์ฒ ๋ฃจํ์ ๋ฐ ๊ด์ ํฌ์ ์ฐ์ฐ์ด ๋ฐ์ํฉ๋๋ค.
- ํ ์ค์ฒ ์ํ๋ง ๋ถํ: 3D ๋ ธ์ด์ฆ ํ ์ค์ฒ(Perlin-Worley Noise) ๋ฐ ๋ฐฉํฅ์ฑ ๊ด์(Directional Light)์ ์๋์ฐ ๋งต(Shadow Map)์ ๋งค ์คํ ๋ง๋ค ์ํ๋งํ๋ฏ๋ก L1/L2 ์บ์ ๋ฏธ์ค(Cache Miss) ํ๋ฅ ์ด ์น์์ต๋๋ค.
Fill Rate ๋ณ๋ชฉ ํ์์ ์ง๋จ (Diagnosing Fill Rate Bottlenecks)
์ ๋ํฐ ๋ ๋ ๋ํ๋จผํธ ๋ฐ **ํ๋ ์ ๋๋ฒ๊ฑฐ(Frame Debugging Tools)**, **NVIDIA Nsight Graphics**๋ฅผ ํ์ฉํด ํ๋กํ์ผ๋ง์ ์งํํ์ ๋, ALU ์ฝ์ด ์ ์ ์จ๋ณด๋ค **ALU/Tex Ratio** ์ธก๋ฉด์์ ํฝ์ ๋ฐฑ์๋(ROP) ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ ์ ํ์ผ๋ก ์ธํ Stall ํ์์ด ์ฃผ์ ์์ธ์์ด ํ์ธ๋์์ต๋๋ค. ๋จ์ ํฝ์ ์ ฐ์ด๋์ ์ฐ์ฐ ๋น์ฉ์ด ์คํฌ๋ฆฐ ์ ์ฒด ๋ฉด์ ๊ณผ ์ง๊ฒฐ๋๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฉด ์ ์ฒด๋ฅผ ๋ฎ๋ ํฌ๊ทธ ํน์ฑ์ **GPU Fill Rate**๊ฐ ๊ณ ๊ฐ๋๋ ์ ํ์ ์ธ ์ฑ๋ฅ ๋ณ๋ชฉ์ด ๋ํ๋ฉ๋๋ค.
2. ํด๊ฒฐ์ฑ 1: ๋ฐํด์๋ ๋ ๋ ํจ์ค (Half-Resolution Render Pass) ๊ตฌํ
Fill Rate ๋ถํ๋ฅผ ๋จ๋ฒ์ ์ฐ์ฐ๋ ๊ธฐ์ค $1/4$ ($50\% \times 50\%$)๋ก ์ค์ด๊ธฐ ์ํ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ์ ๊ทผ๋ฒ์ ๋ ์ด๋ง์นญ ์์ฒด๋ฅผ ๊ฐ๋ก/์ธ๋ก ํฌ๊ธฐ๊ฐ ์ ๋ฐ์ธ **๋ฐํด์๋ ๋ ๋ ํ๊น(Half-Resolution Render Target)**์์ ์ํํ ๋ค, ์ต์ข ํ๋ ์ ๋ฒํผ์ ํฉ์ฑ(Composite)ํ๋ ๊ฒ์ ๋๋ค.
URP Scriptable Render Pass ์ค๊ณ
URP์ ScriptableRendererFeature๋ฅผ ํ์ฅํ์ฌ ํฌ๊ทธ ์ ์ฉ Render Pass๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ด ํจ์ค๋ ๋ธ๋ฆฟ(Blit) ์์
์ ๋ ๋ ํ๊น์ ํฌ๊ธฐ๋ฅผ RenderTextureDescriptor์ ํด์๋๋ฅผ ์ ๋ฐ์ผ๋ก ์ถ์ํ์ฌ ํ ๋นํฉ๋๋ค.
// Half-Resolution RT descriptor configuration in URP Pass RenderTextureDescriptor fogDesc = renderingData.cameraData.cameraTargetDescriptor; fogDesc.width /= 2; fogDesc.height /= 2; fogDesc.colorFormat = RenderTextureFormat.ARGBHalf; // HDR ์ฐ๋ ๊ฐ์ ๋ณด์กดํ๊ธฐ ์ํด FP16 ์ฌ์ฉ fogDesc.depthBufferBits = 0; // ๊น์ด ๋ฒํผ๋ ์ ํ ๊น์ด ํ ์ค์ฒ๋ฅผ ์ง์ ์ํ๋ง cmd.GetTemporaryRT(m_HalfResFogRT.id, fogDesc, FilterMode.Bilinear);
์ฃ์ง ๋ธ๋ฆฌ๋ฉ(Edge Bleeding) ๋ฌธ์ ์ ๊น์ด ๊ธฐ๋ฐ ์๋ฐฉํฅ ์ ์ํ๋ง (Depth-Aware Bilateral Upsampling)
๋จ์ํ ์ ํ ๋ณด๊ฐ(Bilinear Filtering)์ผ๋ก ๋ฐํด์๋ ํฌ๊ทธ ํ ์ค์ฒ๋ฅผ ํ ํด์๋ ํ๋ฉด์ ์ ์ค์ผ์ผ๋งํ๋ฉด, ์ ๊ฒฝ ์ค๋ธ์ ํธ์ ๋ชจ์๋ฆฌ(Edge) ๋ถ๋ถ์์ ํฌ๊ทธ ์์์ด ๋ฌผ์ฒด ์์ชฝ์ผ๋ก ํ๋ฌ ๋ค์ด๊ฐ๋ **์ฃ์ง ๋ธ๋ฆฌ๋ฉ(Edge Bleeding)** ํน์ ์ํฐํฉํธ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊น์ด์ ๋ถ์ฐ์์ฑ(Depth Discontinuity)์ด ์กด์ฌํ๋ ๊ฒฝ๊ณ ์์ญ์์ ํฌ๊ทธ๊ฐ ์๋ชป ํฉ์ฑ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด **๊น์ด ๊ธฐ๋ฐ ์๋ฐฉํฅ ์ ์ํ๋ง(Depth-Aware Bilateral Upsampling)** ํํฐ๋ฅผ ์ ์ฉํฉ๋๋ค. ํฝ์ ํฉ์ฑ ์, ํ ํด์๋์ ๊น์ด ๊ฐ๊ณผ ๋ฐํด์๋ ์ฃผ๋ณ 4๊ฐ ํฝ์ ์ ๊น์ด ๊ฐ์ ๋น๊ตํ์ฌ ๊น์ด ์ฐจ์ด๊ฐ ๊ฐ์ฅ ์ ์ ์ํ์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํฉ๋๋ค.
- ๊ฐ์ค์น ๊ณ์ฐ ๊ณต์: $W_i = \exp\left( -\frac{\Delta Depth}{\sigma_{depth}} - \frac{\Delta Spatial}{\sigma_{spatial}} \right)$
- ์ฃ์ง ๋ณด์กด: ๊น์ด ์ฐจ์ด๊ฐ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ ์ํ์ ์ํฅ๋ ฅ์ 0์ ๊ฐ๊น๊ฒ ์ค์์ผ๋ก์จ ๋ฌผ์ฒด ๊ฒฝ๊ณ๋ฉด์ด ๊นจ๋ํ๊ฒ ์ ์ง๋ฉ๋๋ค.
3. ํด๊ฒฐ์ฑ 2: Temporal Reprojection (์๊ณต๊ฐ ์ฌํฌ์) ์ต์ ํ
๋ฐํด์๋ ๋ ๋๋ง๋ง์ผ๋ก๋ ๋ ์ด๋ง์นญ ์คํ ์๋ฅผ ๊ทน๋จ์ ์ผ๋ก ์ค์์ ๋(์: 64์คํ $\rightarrow$ 16์คํ ) ๋ฐ์ํ๋ **๋ฐด๋ฉ ์ํฐํฉํธ(Banding Artifact)** ๋ฐ **๋ ธ์ด์ฆ(Noise)** ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ์ด์ ํ๋ ์์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ํ์ฌ ํ๋ ์์ผ๋ก ์ฌํ์ฉํ๋ **์๊ณต๊ฐ ์ฌํฌ์(Temporal Reprojection)** ๊ธฐ๋ฒ์ ๋์ ํฉ๋๋ค.
๋ธ๋ฃจ ๋ ธ์ด์ฆ ์งํฐ๋ง(Blue Noise Jittering)๊ณผ ํ๋ ์๊ฐ ์ฌํฌ์
๋งค ํ๋ ์ ๋ ์ด๋ง์นญ ์์ ์์น์ **๋ธ๋ฃจ ๋ ธ์ด์ฆ(Blue Noise)** ๊ธฐ๋ฐ์ ์งํฐ(Jitter) ์คํ์ ์ ์ ์ฉํฉ๋๋ค. ํฝ์ ๋ณ ๋ ์ด๋ง์นญ ์คํ ์ 16๋จ๊ณ๋ก ์ ์ง๋ง, ํ๋ ์๋ง๋ค ์คํ์ ์ด ๋ฌ๋ผ์ง๋ฏ๋ก ์๊ฐ์ถ ์์์ ๋์ (Accumulation)ํ๋ฉด ๋ง์น 64~128 ์คํ ์่ธ์ ๊ฒ๊ณผ ๊ฐ์ ๊ณ ํ์ง์ ์๋งํ๊ณ ๋ถ๋๋ฌ์ด ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋ชจ์ ๋ฒกํฐ(Motion Vectors)๋ฅผ ํตํ ์ด์ ํ๋ ์ ์ขํ ์ถ์
์นด๋ฉ๋ผ๋ ์ค๋ธ์ ํธ๊ฐ ์ด๋ํ ๋ ์ด์ ํ๋ ์์ ์ ์ ํ ์์น์์ ํ ์ค์ฒ๋ฅผ ์ฌ์ํ๋งํ๊ธฐ ์ํด URP์ **๋ชจ์ ๋ฒกํฐ ๋ฒํผ(_MotionVectorTexture)**๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ํ์ฌ ํฝ์ ์ UV ์ขํ์์ ์นด๋ฉ๋ผ/์ค๋ธ์ ํธ ๋ชจ์ ๋ฒกํฐ๋ฅผ ์ฐจ๊ฐํ์ฌ ์ด์ ํ๋ ์ UV($UV_{prev}$)๋ฅผ ๊ตฌํฉ๋๋ค.
- $UV_{prev}$๊ฐ $[0, 1]$ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์ ํจํ์ง ์์ ํ์คํ ๋ฆฌ(History Invalid)๋ก ํ์ ํฉ๋๋ค.
- ์ด์ ํ๋ ์์ ํฌ๊ทธ ํ์คํ ๋ฆฌ ๋ฒํผ(History Buffer)์์ ๊ฐ์ ์ฝ์ด์ ํ์ฌ ํ๋ ์ ๋ ์ด๋ง์นญ ๊ฒฐ๊ณผ์ ์ง์ ์ด๋ ํ๊ท (EMA)์ผ๋ก ๋ธ๋ ๋ฉํฉ๋๋ค.
๊ณ ์คํธ ํ์(Ghosting Artifacts) ๋ฐ History Clamping ํธ๋ฌ๋ธ์ํ
์์ง์์ด ๋น ๋ฅธ ์ค๋ธ์ ํธ ๋คํธ์ด๋ ๋์ ๊ด์์ ์์ผ ๋ณํ ์, ์ด์ ํ๋ ์์ ํฌ๊ทธ ์์์ด ์์กดํ๋ **๊ณ ์คํธ ํ์(Ghosting)**์ด ๋ฐ์ํฉ๋๋ค. ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด **์ปฌ๋ฌ ๊ณต๊ฐ ํด๋จํ(Color Space AABB Clamping)** ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค.
ํ์ฌ ํ๋ ์์ ๋ฐํด์๋ ํฌ๊ทธ ์ฃผ๋ณ $3 \times 3$ ์์ญ์ ํฝ์ ๋ค์ ์ต์/์ต๋ ์ปฌ๋ฌ ๋ฒ์๋ฅผ ๊ณ์ฐํ ๋ค, ์ด์ ํ๋ ์์์ ๊ฐ์ ธ์จ ํ์คํ ๋ฆฌ ์ปฌ๋ฌ๊ฐ ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๋๋ก ๊ฐ์ ๋ก ๊ฐ์ (Clamp)์ํต๋๋ค.
// HLSL: Color AABB Clamping for Temporal Anti-Ghosting
float3 colorMin = 99999.0;
float3 colorMax = -99999.0;
[unroll]
for (int x = -1; x <= 1; ++x)
{
[unroll]
for (int y = -1; x <= 1; ++y)
{
float3 neighbor = SampleFogTexture(uv + float2(x, y) * _TexelSize.xy).rgb;
colorMin = min(colorMin, neighbor);
colorMax = max(colorMax, neighbor);
}
}
// History sample clamp
float3 historyColor = SampleHistoryBuffer(prevUV).rgb;
historyColor = clamp(historyColor, colorMin, colorMax);
// Temporal blend (Alpha: 0.05 ~ 0.1)
float3 finalFog = lerp(historyColor, currentFog, 0.08);
4. ์ค๋ฌด ํธ๋ฌ๋ธ์ํ ๋ฐ ์ฃ์ง ์ผ์ด์ค ์ฒ๋ฆฌ ๋ ์จ
์ค์ ์์ฉ ํ๋ก์ ํธ ์ต์ ํ ๊ณผ์ ์์ ๋ง์ฃผ์น ํต์ฌ ์ฃ์ง ์ผ์ด์ค์ ํด๊ฒฐ ํจ์น ๋ด์ฉ์ ๋๋ค.
| ๋ฐ์ ๋ฌธ์ (Issue) | ์์ธ ๋ถ์ (Root Cause) | ํด๊ฒฐ ๋ฐฉ์ (Solution) |
|---|---|---|
| ํํฐํด ํฉ์ฑ ์์ ๊ผฌ์ | ๋ฐํด์๋ ํฌ๊ทธ๊ฐ ๋ฐํฌ๋ช ํํฐํด(Transparent Queue)๋ณด๋ค ๋์ค์ ๊ทธ๋ ค์ ธ ํํฐํด์ ๋ฎ์ด๋ฒ๋ฆผ | URP Pass ์คํ ์์ ์ RenderPassEvent.BeforeRenderingTransparents๋ก ๋ณ๊ฒฝํ๊ณ , ํํฐํด ์
ฐ์ด๋ ๋ด์์ ํฌ๊ทธ ํ
์ค์ฒ ํฌ์ ์ฒ๋ฆฌ |
| ์นด๋ฉ๋ผ ํ ๋ ํฌํธ ์ ํ๋ฉด ๊นจ์ง | ์นด๋ฉ๋ผ ๊ธ์ด๋ ์ ์๋ชป๋ ๋ชจ์ ๋ฒกํฐ๋ก ์ธํ History ๋ฒํผ ์ฌํฌ์ ์ค์๋ | ์นด๋ฉ๋ผ ์ด๋ ๊ฑฐ๋ฆฌ๊ฐ ์ค๋ ์ํ๋๋ฅผ ๋์ผ๋ฉด C# ์คํฌ๋ฆฝํธ์์ ResetTemporalHistory()๋ฅผ ํธ์ถํด ํ์คํ ๋ฆฌ ๋ฒํผ ๊ฐ์ ์ด๊ธฐํ |
| FP16 ์ ๋ฐ๋ ๋ถ์กฑ ์ค๋ฒํ๋ก์ฐ | ๊ฐํ ๋๋ผ์ดํธ(Direct Light) ๊ฐ๋ ์์น๋ก ์ธํด HDR ํฌ๊ทธ ํฉ์ฑ ์ NaN/Inf ๋ฐ์ | HLSL ๋ด๋ถ ์ฐ๋ ๊ฐ ๊ณ์ฐ ์ saturate() ๋ฐ ์์ ๋
ธ์ด์ฆ ๋ฒ์ ํด๋จํ ์ถ๊ฐ, FP32 ๋ณํ ์์ธ ์ฒ๋ฆฌ ์ ์ฉ |
5. ์ต์ ํ ๊ฒฐ๊ณผ ๋ฐ ์ฑ๋ฅ ๋น๊ต ๋ถ์ (Performance Benchmarks)
RTX 3060 ๋ฐ ๋ชจ๋ฐ์ผ ํ๊น(Mali-G78) ๋จ๋ง๊ธฐ์์ ์ต์ ํ ๊ธฐ๋ฒ์ ์ ๋์ ์ผ๋ก ์ธก์ ํ ๊ฒฐ๊ณผ์ ๋๋ค. ํ๋ฉด ํด์๋ 4K (3840x2160) ํ๊ฒฝ ๊ธฐ์ค์ผ๋ก ๊ฒ์ฆ์ ์งํํ์ต๋๋ค.
- ๊ธฐ์กด ๋ฐฉ์ (Full-Res, 64 Ray Steps): GPU Rendering Time 14.2ms (์ฝ 70 FPS ์ ํ ์์ธ)
- 1์ฐจ ์ต์ ํ (Half-Res Render Pass + Bilateral Filter): GPU Rendering Time 4.1ms (์ฝ 71% ๋จ์ถ)
- 2์ฐจ ์ต์ ํ (Half-Res + Temporal Reprojection, 16 Ray Steps): GPU Rendering Time 1.8ms (์ฝ 87% ์ฑ๋ฅ ํฅ์, 200+ FPS ์์ ์ ํ๋ณด)
๋ฐํด์๋ ํจ์ค๋ก ์ฐ์ฐ ๋ฉด์ ์ $75\%$ ์ ๊ฐํ๊ณ , Temporal Reprojection์ ํตํด ์คํ ์๋ฅผ $64 \rightarrow 16$์ผ๋ก $75\%$ ์ถ๊ฐ ์ถ์ํจ์ผ๋ก์จ ์๊ฐ์ ํ์ง์ ์์ค์ ์ต์ํํ๋ฉด์ GPU Fill Rate ๋์ญํญ ํ๊ณ๋ฅผ ์๋ฒฝํ ๊ทน๋ณตํ ์ ์์์ต๋๋ค.
6. ๊ฒฐ๋ก ๋ฐ ์์ฝ
์ ๋ํฐ URP ํ๊ฒฝ์์ ๋ฌด๊ฑฐ์ด ๋ณผ๋ฅ๋ฉํธ๋ฆญ ๋ ๋๋ง์ ์๋๊ฐํ ๋ ๊ฒช๋ ๊ณ ์ง์ ์ธ GPU Fill Rate ๋ณ๋ชฉ์ ๋จ์ํ ์คํ ์๋ฅผ ์ค์ด๋ ๋ฐฉ์์ผ๋ก๋ ๊ณ ํ์ง ๋น์ฃผ์ผ์ ์ ์งํ ์ ์์ต๋๋ค. Half-Resolution Render Pass๋ฅผ ํตํ ๊ณต๊ฐ ์ถ์์ Temporal Reprojection์ ํ์ฉํ ์๊ฐ์ถ ๋ถํ ์ฐ์ฐ์ ์ํธ ๋ณด์์ ์ผ๋ก ์ ์ฉํ๋ ๊ธฐ๋ฒ์ด ์ต์ ์ ํด๋ฒ์ ๋๋ค.
๊ทธ๋ํฝ ํ์ดํ๋ผ์ธ ์ต์ ํ ์ ๋ค์ ํต์ฌ ์์น์ ๊ธฐ์ตํ๊ณ ํ๋ก์ ํธ์ ๋ฐ์ํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
- ํฌ๊ทธ, ๋ณผ๋ฅ๋ฉํธ๋ฆญ ํด๋ผ์ฐ๋, SSR ๋ฑ ์คํฌ๋ฆฐ ์คํ์ด์ค ๊ธฐ๋ฐ ๋ ์ด๋ง์นญ ๊ธฐ์ ์ ์ ์ ์ ์ผ๋ก **๋ฐํด์๋ ํจ์ค(Half-Res Pass)**๋ก ๋ถ๋ฆฌํ๋ค.
- ์ ์ค์ผ์ผ๋ง ๊ณผ์ ์์์ ๊ฒฝ๊ณ๋ฉด ๊นจ์ง์ **Depth-Aware Bilateral Filter**๋ก ์ ์ดํ๋ค.
- ๋ถ์กฑํ ๋ ์ด ์ํ์ **Blue Noise Jittering** ๋ฐ **Temporal Reprojection (Color Clamping)**์ผ๋ก ๋ณต์ํด ๊ณ ์คํธ ํ์ ์๋ ๊ณ ํ์ง ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ค.