
이 글은 Unity 프로젝트 최적화 팁을 설명하는 시리즈의 두 번째 기사입니다. 더 적은 자원으로 더 높은 프레임 속도로 실행하기 위한 가이드로 사용하세요. 이 최선의 방법을 시도한 후에는 시리즈의 다른 페이지도 확인하세요:
Unity 6 개발자 및 아티스트를 위한 최신 최적화 가이드를 확인하세요:
Unity의 그래픽 도구를 사용하면 모바일에서 고급 콘솔 및 데스크탑에 이르기까지 다양한 플랫폼에서 모든 스타일의 최적화된 그래픽을 만들 수 있습니다. 이 과정은 일반적으로 아티스틱 방향과 렌더 파이프라인에 따라 달라지므로 시작하기 전에 사용 가능한 렌더 파이프라인을 검토하는 것이 좋습니다.
장면 조명 최적화는 정확한 과학이 아니라 반복적인 과정입니다. 이 과정은 시행착오를 포함하며, 일반적으로 예술적 방향과 렌더 파이프라인에 따라 달라집니다.
장면에 조명을 시작하기 전에 사용 가능한 렌더 파이프라인 중 하나를 선택해야 합니다. 렌더 파이프라인은 장면의 내용을 화면에 표시하기 위해 일련의 작업을 수행합니다.
Unity는 다양한 기능과 성능 특성을 가진 세 가지 미리 구축된 렌더 파이프라인을 제공하며, 또는 자신만의 파이프라인을 만들 수 있습니다.
1. 유니버설 렌더 파이프라인 (URP)는 미리 구축된 스크립터블 렌더 파이프라인 (SRP)입니다. URP는 모바일에서 고급 콘솔 및 PC에 이르기까지 다양한 플랫폼에서 최적화된 그래픽을 생성하기 위한 아티스트 친화적인 워크플로를 제공합니다. URP는 내장 렌더 파이프라인의 후속 제품으로, 이전 파이프라인에서는 사용할 수 없는 그래픽 및 렌더링 기능을 제공합니다. 성능을 유지하기 위해 조명 및 음영의 계산 비용을 줄이기 위한 절충을 합니다. 모바일 및 VR을 포함한 가장 많은 대상 플랫폼에 도달하려면 URP를 선택하세요.
e-book 유니버설 렌더 파이프라인에 대한 소개 고급 Unity 제작자를 위한 유니버설 렌더 파이프라인 (Unity 6판).에서 URP의 기능에 대한 전체 개요를 확인하세요.
2. 고해상도 렌더 파이프라인 (HDRP)는 최첨단 고충실도 그래픽을 위해 설계된 또 다른 미리 구축된 SRP입니다. HDRP는 PC, Xbox 및 PlayStation과 같은 고급 하드웨어를 대상으로 합니다. 가장 높은 수준의 사실감을 가진 포토리얼리스틱 그래픽을 생성하기 위한 권장 렌더 파이프라인으로, 고급 조명, 반사 및 그림자를 제공합니다. HDRP는 물리 기반 조명 및 재료를 사용하며 개선된 디버깅 도구를 지원합니다.
e-book 고해상도 렌더 파이프라인의 조명 및 환경.에서 HDRP의 기능에 대한 전체 개요를 확인하세요.
3. 내장 렌더 파이프라인은 Unity의 구형 일반 목적 렌더 파이프라인으로, 사용자 정의가 제한적입니다. 이 파이프라인은 Unity 6.x 주기 동안 계속 지원됩니다.

포워드 렌더링에서 그래픽 카드가 기하학을 투사하고 이를 정점으로 나눕니다. 이 정점들은 더 나아가 조각 또는 픽셀로 나뉘어 화면에 렌더링되어 최종 이미지를 생성합니다.
파이프라인은 각 오브젝트를 하나씩 그래픽 API에 전달합니다. 포워드 렌더링은 각 광원에 대한 비용이 발생합니다. 장면에 광원이 많을수록 렌더링 시간이 길어집니다.
내장 파이프라인의 포워드 렌더러는 각 오브젝트에 대해 별도의 패스에서 각 광원을 그립니다. 같은 게임 오브젝트에 여러 개의 광원이 닿는 경우, 이는 중복 그리기를 유발할 수 있으며, 겹치는 영역은 동일한 픽셀을 여러 번 그려야 합니다. 중복 그리기를 줄이기 위해 실시간 광원의 수를 최소화하세요.
URP는 각 광원에 대해 하나의 패스를 렌더링하는 대신 오브젝트별로 광원을 컬링합니다. 이로 인해 조명이 하나의 단일 패스에서 계산될 수 있어, 내장 렌더 파이프라인의 포워드 렌더러에 비해 드로우 호출 수가 줄어듭니다.
포워드 +
포워드+ 렌더링은 오브젝트별이 아닌 공간적으로 광원을 컬링하여 표준 포워드 렌더링을 개선합니다. 이렇게 하면 프레임을 렌더링하는 데 사용할 수 있는 전체 광원 수가 증가합니다. 디퍼드 렌더링에서 Native RenderPass API를 지원하여 G-버퍼와 조명 패스를 단일 렌더 패스로 결합할 수 있습니다.

디퍼드 셰이딩에서는 조명이 오브젝트별로 계산되지 않습니다.
지연 음영은 조명 계산을 나중 단계로 연기합니다. 지연 음영은 두 번의 패스를 사용합니다.
첫 번째 패스인 G-버퍼 기하학 패스에서 Unity는 게임 오브젝트를 렌더링합니다. 이 패스는 여러 유형의 기하학적 속성을 검색하고 이를 텍스처 세트에 저장합니다. G-버퍼 텍스처에는 다음이 포함될 수 있습니다:
두 번째 패스인 조명 패스에서 Unity는 G-버퍼를 기반으로 장면의 조명을 렌더링합니다. 각 픽셀을 반복하고 개별 객체 대신 버퍼를 기반으로 조명 정보를 계산한다고 상상해 보십시오. 따라서 지연 음영에서 그림자를 드리우지 않는 조명을 더 추가해도 전방 렌더링과 같은 성능 저하가 발생하지 않습니다.
렌더링 경로를 선택하는 것은 본질적으로 최적화는 아니지만, 프로젝트를 최적화하는 방법에 영향을 줄 수 있습니다. 이 섹션의 다른 기술 및 워크플로우는 선택한 렌더 파이프라인 및 렌더링 경로에 따라 다를 수 있습니다.

HDRP와 URP 모두 Shader Graph을 지원하며, 이는 셰이더 생성을 위한 시각적 인터페이스입니다. 이것은 일부 사용자가 이전에 도달할 수 없었던 복잡한 음영 효과를 생성할 수 있게 합니다. 시각적 그래프 시스템의 150개 이상의 노드를 사용하여 더 많은 셰이더를 생성하십시오. API를 사용하여 자신만의 사용자 정의 노드를 만들 수도 있습니다.
각 Shader Graph는 그래프의 출력을 결정하는 호환 가능한 마스터 노드로 시작합니다. 시각적 인터페이스를 사용하여 노드와 연산자를 추가하고 셰이더 논리를 구성합니다.
이 Shader Graph는 렌더 파이프라인의 백엔드로 전달됩니다. 최종 결과는 HLSL 또는 Cg로 작성된 것과 기능적으로 유사한 ShaderLab 셰이더입니다.
Shader Graph 최적화는 전통적인 HLSL/Cg 셰이더에 적용되는 많은 동일한 규칙을 따릅니다. Shader Graph가 처리하는 작업이 많을수록 애플리케이션의 성능에 더 많은 영향을 미칩니다.
CPU에 제한이 있는 경우, 셰이더를 최적화해도 프레임 속도가 개선되지 않지만 모바일 플랫폼의 배터리 수명은 개선될 수 있습니다.
GPU에 제한이 있는 경우, Shader Graph의 성능을 개선하기 위한 다음 지침을 따르십시오:
- 노드를 축소하십시오: 사용하지 않는 노드를 제거하십시오. 변경이 필요하지 않는 한 기본값을 변경하거나 노드를 연결하지 마십시오. Shader Graph는 사용하지 않는 기능을 자동으로 컴파일합니다. 가능한 경우 값을 텍스처에 베이킹하십시오. 예를 들어, 텍스처를 밝게 하기 위해 노드를 사용하는 대신, 추가 밝기를 텍스처 자산 자체에 적용하십시오.
- 더 작은 데이터 형식 사용: 가능한 경우 더 작은 데이터 구조로 전환하십시오. 프로젝트에 영향을 미치지 않는다면 Vector3 대신 Vector2를 사용하는 것을 고려하십시오. 상황이 허용된다면 정밀도를 줄일 수도 있습니다(예: float 대신 half).
- 수학 연산 줄이기: 셰이더 연산은 초당 여러 번 실행되므로 가능한 경우 모든 수학 연산자를 최적화하십시오. 결과를 논리적 분기로 만드는 대신 혼합해 보세요. 상수 값을 사용하고 벡터를 적용하기 전에 스칼라 값을 결합하세요. 마지막으로, 인스펙터에 나타날 필요가 없는 속성은 인라인 노드로 변환하세요. 이 모든 점진적인 속도 향상은 프레임 예산에 도움이 될 수 있습니다.
- 미리보기 분기: 그래프가 커질수록 컴파일 속도가 느려질 수 있습니다. 현재 미리보기를 원하는 작업만 포함하는 별도의 작은 분기로 워크플로를 단순화한 다음, 원하는 결과를 얻을 때까지 이 작은 분기에서 더 빠르게 반복하세요.
분기가 마스터 노드에 연결되어 있지 않으면 그래프에 미리보기 분기를 안전하게 남겨둘 수 있습니다. Unity는 컴파일 중 최종 출력에 영향을 미치지 않는 노드를 제거합니다.
- 수동 최적화: 경험이 풍부한 그래픽 프로그래머라도 스크립트 기반 셰이더를 위한 보일러플레이트 코드를 작성하기 위해 셰이더 그래프를 사용할 수 있습니다. 셰이더 그래프 자산을 선택한 다음, 컨텍스트 메뉴에서 셰이더 복사를 선택하세요.
새로운 HLSL/Cg 셰이더를 만들고 복사한 셰이더 그래프를 붙여넣으세요. 이것은 일방향 작업이지만, 수동 최적화를 통해 추가 성능을 끌어낼 수 있습니다.

그래픽 설정의 항상 포함된 셰이더 목록에서 사용하지 않는 모든 셰이더를 제거하세요 (편집 > 프로젝트 설정 > 그래픽). 애플리케이션의 수명 동안 필요할 셰이더를 여기에 추가하세요.

셰이더 변형은 플랫폼별 기능에 유용할 수 있지만 빌드 시간과 파일 크기를 증가시킵니다.
대상 플랫폼에 대해 셰이더를 다르게 컴파일하기 위해 셰이더 컴파일 프래그마 지시문을 사용할 수 있습니다. 그런 다음 셰이더 키워드(또는 셰이더 그래프 키워드 노드)를 사용하여 특정 기능이 활성화되거나 비활성화된 셰이더 변형을 생성합니다.
필요하지 않은 경우 빌드에 셰이더 변형이 포함되지 않도록 할 수 있습니다.
셰이더 타이밍 및 크기를 위해 Editor.log을 분석합니다. “컴파일된 셰이더” 및 “압축된 셰이더”로 시작하는 줄을 찾습니다. 예제 로그에서 TEST 셰이더는 다음과 같이 표시될 수 있습니다:
컴파일된 셰이더 'TEST Standard (Specular setup)'가 31.23초에 완료됨
d3d9 (총 내부 프로그램 수: 482, 고유: 474)
d3d11 (총 내부 프로그램 수: 482, 고유: 466)
metal (총 내부 프로그램 수: 482, 고유: 480)
glcore (총 내부 프로그램 수: 482, 고유: 454)
압축된 셰이더 'TEST Standard (Specular setup)'가 d3d9에서 1.04MB에서 0.14MB로 압축됨
압축된 셰이더 'TEST Standard (Specular setup)'가 d3d11에서 1.39MB에서 0.12MB로 압축됨
압축된 셰이더 'TEST Standard (Specular setup)'가 metal에서 2.56MB에서 0.20MB로 압축됨
압축된 셰이더 'TEST Standard (Specular setup)'가 glcore에서 2.04MB에서 0.15MB로 압축됨
이 셰이더에 대한 몇 가지 정보를 제공합니다:
- 이 셰이더는 #pragma multi_compile 및 shader_feature로 인해 482개의 변형으로 확장됩니다.
- Unity는 게임 데이터에 포함된 셰이더를 압축된 크기의 합계에 가깝게 압축합니다: 0.14+0.12+0.20+0.15 = 0.61MB.
- 런타임에서 Unity는 압축된 데이터를 메모리(0.61MB)에 유지하며, 현재 사용 중인 그래픽 API의 데이터는 압축 해제됩니다. 예를 들어, 현재 API가 Metal인 경우 이는 2.56MB에 해당합니다.
빌드 후, 프로젝트 감사기는 Editor.log를 파싱하여 프로젝트에 컴파일된 모든 셰이더, 셰이더 키워드 및 셰이더 변형의 목록을 표시할 수 있습니다. 게임이 실행된 후 플레이어.log를 분석할 수도 있습니다. 이것은 애플리케이션이 실제로 컴파일하고 런타임에 사용한 변형을 보여줍니다.
이 정보를 사용하여 스크립트 가능한 셰이더 스트리핑 시스템을 구축하고 변형 수를 줄이십시오. 이것은 빌드 시간, 빌드 크기 및 런타임 메모리 사용량을 개선할 수 있습니다.
이 프로세스를 자세히 보려면 스트리핑 스크립트 가능한 셰이더 변형 블로그 게시물을 읽으십시오.
안티 앨리어싱은 이미지를 부드럽게 하고, 톱니 모양의 가장자리를 줄이며, 스페큘러 앨리어싱을 최소화하는 데 도움을 줍니다.
Built-in 렌더 파이프라인과 함께 포워드 렌더링을 사용하는 경우, 다중 샘플 안티 앨리어싱 (MSAA)은 품질 설정에서 사용할 수 있습니다. MSAA는 고품질 안티 앨리어싱을 생성하지만 비용이 많이 들 수 있습니다. 드롭다운 메뉴에서 MSAA 샘플 수 (없음, 2X, 4X, 8X)는 렌더러가 효과를 평가하는 데 사용하는 샘플 수를 정의합니다.
URP 또는 HDRP와 함께 포워드 렌더링을 사용하는 경우, 렌더 파이프라인 자산에서 MSAA를 활성화할 수 있습니다.
대안으로, 후처리 효과로 안티 앨리어싱을 추가할 수 있습니다. 이것은 안티 앨리어싱 아래의 카메라 구성 요소에 나타납니다:
- 빠른 근사 안티 앨리어싱 (FXAA)는 픽셀 수준에서 가장자리를 부드럽게 합니다. 이것은 가장 적은 자원을 소모하는 안티 앨리어싱이며 최종 이미지를 약간 흐리게 합니다.
- 서브픽셀 형태학적 안티 앨리어싱 (SMAA)는 이미지의 경계를 기반으로 픽셀을 혼합합니다. 이것은 FXAA보다 훨씬 선명한 결과를 제공하며 평면, 만화 스타일 또는 깔끔한 아트 스타일에 적합합니다.
HDRP에서는 카메라의 후처리 안티 앨리어싱 설정과 함께 FXAA 및 SMAA를 사용할 수도 있습니다. URP와 HDRP는 추가 옵션도 제공합니다:
- 시간적 안티 앨리어싱 (TAA) 은 히스토리 버퍼의 프레임을 사용하여 가장자리를 부드럽게 합니다. 이것은 FXAA보다 더 효과적으로 작동하지만 작동하기 위해 모션 벡터가 필요합니다. TAA는 환경 오클루전과 볼륨 효과를 개선할 수 있습니다. 일반적으로 FXAA보다 품질이 높지만 더 많은 자원을 소모하고 가끔 유령 잔상 아티팩트를 생성할 수 있습니다.

시공간 포스트 프로세싱(STP)은 모바일, 콘솔 및 PC와 같은 다양한 플랫폼에서 시각적 품질을 향상시키기 위해 설계되었습니다. STP는 HDRP 및 URP 렌더 파이프라인 모두에서 작동하는 시공간 안티 앨리어싱 업스케일러로, 기존 콘텐츠에 대한 변경 없이 고품질 콘텐츠 스케일링을 제공합니다. 이 솔루션은 GPU 성능을 최적화하여 더 빠른 렌더링 시간을 보장하고 시각적 품질을 유지하면서 높은 성능을 달성하기 쉽게 만듭니다.
URP에서 STP를 활성화하려면:
- 프로젝트 창에서 활성 URP 자산을 선택하십시오.
- 인스펙터에서 품질 > 업스케일링 필터로 이동하여 시공간 포스트 프로세싱을 선택하십시오.

조명을 생성하는 가장 빠른 옵션은 프레임당 계산할 필요가 없는 것입니다. 이를 위해 라이트매핑을 사용하여 정적 조명을 한 번만 "베이킹"하고 실시간으로 계산하지 마십시오.
정적 기하학에 전역 조명(GI)을 사용하여 극적인 조명을 추가하십시오. GI 기여로 객체를 표시하여 고품질 조명을 라이트맵 형태로 저장할 수 있습니다.
라이트맵 환경을 생성하는 과정은 Unity에서 장면에 조명을 배치하는 것보다 더 오래 걸리지만, 이것은:
- 더 빠르게 실행됩니다. 두 픽셀당 조명에 대해 2-3배 더 빠릅니다.
- 더 나은 모습입니다 – GI는 사실적인 직접 및 간접 조명을 계산할 수 있습니다. 라이트매퍼는 결과 맵을 부드럽게 하고 노이즈를 제거합니다.
구운 그림자와 조명은 실시간 조명 및 그림자의 성능 저하 없이 렌더링할 수 있습니다.
복잡한 장면은 긴 베이크 시간이 필요할 수 있습니다. 하드웨어가 프로그레시브 GPU 라이트맵퍼를 지원하는 경우, 이 옵션은 라이트맵 생성 속도를 극적으로 높일 수 있으며, 경우에 따라 최대 10배까지 빨라질 수 있습니다.
Unity에서 라이트매핑을 시작하려면 이 가이드를 따르세요.

반사 프로브 구성 요소는 현실적인 반사를 생성할 수 있지만, 이는 배치 측면에서 매우 비용이 많이 들 수 있습니다. 런타임 성능을 개선하기 위해 저해상도 큐브맵, 컬링 마스크 및 텍스처 압축을 사용하세요. 유형 사용: 구운 프레임별 업데이트를 피하기 위해.
유형 사용: URP에서는 실시간이 필요하며, 가능하면 매 프레임을 피하세요. 업데이트 속도를 줄이기 위해 새로 고침 모드 및 시간 분할 설정을 조정하세요. 스크립팅 옵션을 통해 새로 고침을 제어할 수 있으며, 사용자 정의 스크립트에서 프로브를 렌더링할 수 있습니다.
유형 사용: HDRP에서는 실시간이 필요하며, 온디맨드 모드를 사용하세요. 프로젝트 설정 > HDRP 기본 설정에서 프레임 설정을 수정할 수 있습니다. 성능 향상을 위해 실시간 반사 아래의 품질 및 기능을 줄이세요.
성능 향상을 위해 실시간 반사 아래의 품질 및 기능을 줄이세요.

Unity 6은 복잡한 장면에서 동적이고 효율적인 조명을 허용하는 전역 조명 처리를 위한 정교한 솔루션인 적응형 프로브 볼륨(APV)을 도입합니다. APV는 성능과 시각적 품질을 모두 최적화할 수 있으며, 특히 모바일 및 저사양 장치에서 고급 플랫폼을 위한 고급 기능을 제공합니다.
APV는 동적이고 대규모 장면에서 전역 조명을 향상시키기 위한 다양한 기능을 제공합니다. URP는 저사양 장치에서 성능을 개선하기 위해 정점별 샘플링을 지원하며, VFX 입자는 프로브 볼륨에 구워진 간접 조명으로 혜택을 봅니다.
APV 데이터는 디스크에서 CPU 및 GPU로 스트리밍할 수 있으며, 대규모 환경을 위한 조명 정보를 최적화합니다. 개발자는 여러 조명 시나리오를 구워서 혼합할 수 있으며, 낮/밤 주기와 같은 실시간 전환을 허용합니다. 이 시스템은 하늘 차단을 지원하고, 더 효율적인 프로브 계산을 위해 Ray Intersector API와 통합되며, 빛 누출을 줄이고 반복 속도를 높이기 위해 Light Probe 샘플 밀도를 제어할 수 있습니다. 새로운 C# 베이킹 API는 라이트맵이나 반사 프로브와 독립적으로 APV를 구울 수 있게 해줍니다.
APV 사용을 시작하려면 GDC 2023에서의 효율적이고 영향력 있는 조명과 적응형 프로브 볼륨 강연을 확인하세요.

메시 렌더러와 조명별로 그림자 캐스팅을 비활성화할 수 있습니다. 가능한 경우 그림자를 비활성화하여 드로우 호출을 줄이세요.
캐릭터 아래에 간단한 메시나 쿼드에 적용된 흐릿한 텍스처를 사용하여 가짜 그림자를 만들 수도 있습니다. 그렇지 않으면 사용자 정의 셰이더로 blob 그림자를 만들 수 있습니다.
특히, 포인트 조명에 대해 그림자를 활성화하는 것을 피하세요. 그림자가 있는 각 포인트 조명은 조명당 여섯 개의 그림자 맵 패스를 필요로 합니다 - 스포트라이트의 경우 단일 그림자 맵 패스와 비교하세요. 동적 그림자가 절대적으로 필요한 경우 포인트 조명을 스포트라이트로 교체하는 것을 고려하세요. 동적 그림자를 피할 수 있다면 포인트 조명 대신 Light.cookie으로 큐브 맵을 사용하세요.

경우에 따라 여러 개의 추가 조명을 추가하기보다는 간단한 트릭을 적용할 수 있습니다. 예를 들어, 카메라로 직접 비추는 조명을 만들어 림 조명 효과를 주는 대신, 림 조명을 시뮬레이션하는 셰이더를 사용하세요 (HLSL에서의 구현을 보려면 Surface Shader 예제를 참조하세요).
많은 조명이 있는 복잡한 장면의 경우, 레이어를 사용하여 객체를 분리한 다음 각 조명의 영향을 특정 Culling Mask으로 제한하세요.

GPU Lightmapper는 Unity 6에서 프로덕션 준비가 완료되었습니다. GPU를 활용하여 조명 데이터 생성을 극적으로 가속화하며, 전통적인 CPU 라이트 매핑에 비해 훨씬 빠른 베이크 시간을 제공합니다. 코드베이스를 단순화하고 더 예측 가능한 결과를 제공하는 새로운 라이트 베이킹 백엔드를 도입합니다. 또한 최소 GPU 요구 사항이 2GB로 낮아졌으며, 런타임에서 라이트 프로브 위치를 이동할 수 있는 새로운 API도 포함되어 있어, 절차적으로 생성된 콘텐츠에 특히 유용하며, 다양한 품질 개선 사항도 포함되어 있습니다.


Unity 베스트 프랙티스 허브에서 고급 Unity 개발자와 제작자를 위한 더 많은 베스트 프랙티스와 팁을 찾을 수 있습니다. 산업 전문가, Unity 엔지니어 및 기술 아티스트가 만든 30개 이상의 가이드 중에서 선택하여 Unity의 도구 세트와 시스템을 효율적으로 개발하는 데 도움을 받을 수 있습니다.