Version: 2022.3
언어: 한국어
셰이더 배리언트 컬렉션
런타임 시 셰이더 교체

Unity에서 셰이더를 로드하고 사용하는 방법

Unity는 빌드된 애플리케이션에서 다음과 같은 방식으로 컴파일된 셰이더를 로드합니다.

  1. Unity는 씬 또는 런타임 리소스를 로드할 때 씬 또는 리소스에 대해 컴파일된 모든 셰이더 배리언트를 CPU 메모리로 로드합니다.
  2. 기본적으로 Unity는 모든 셰이더 배리언트를 CPU 메모리의 다른 영역으로 압축 해제합니다.[다른 플랫폼에서 셰이더가 사용하는 메모리 양을 제어]할 수 있습니다(#dynamicloading).
  3. 셰이더 배리언트를 사용하여 지오메트리를 렌더링해야 하는 경우 Unity는 해당 셰이더 배리언트와 해당 데이터를 그래픽스 API 및 그래픽스 드라이버에 전달합니다.
  4. 그래픽스 드라이버는 GPU 전용 버전의 셰이더 배리언트를 생성하여 GPU에 업로드합니다.

이 접근 방식을 사용하면 Unity와 그래픽스 드라이버가 Unity에서 모든 셰이더 배리언트를 필요로 하기 전에 이를 GPU에서 처리하고 저장하는 것을 피할 수 있습니다.그러나 그래픽스 드라이버가 처음으로 GPU 전용 셰이더 배리언트를 생성할 때 눈에 띄는 지연이 발생할 수 있습니다.

Unity는 각 GPU 전용 셰이더 배리언트를 캐시하여 셰이더 배리언트가 다시 필요할 때 또 다른 지연을 방지합니다.

셰이더 배리언트를 참조하는 오브젝트가 더 이상 존재하지 않으면 Unity는 CPU 및 GPU 메모리에서 해당 셰이더 배리언트를 완전히 제거합니다.

Unity에서 로드하는 셰이더

Unity는 플랫폼의 그래픽스 API, 하드웨어 및 그래픽스 티어와 호환되는 컴파일된 셰이더만 로드합니다.

사용자 또는 Unity가 빌드된 애플리케이션에서 셰이더 배리언트를 스트리핑하여 Unity에서 필요한 셰이더 배리언트를 찾을 수 없는 경우, Unity는 유사한 셰이더 배리언트를 선택하려고 시도합니다.Unity에서 유사한 셰이더 배리언트를 찾을 수 없는 경우 Unity는 자홍색 오류 셰이더를 사용합니다.

엄격한 셰이더 배리언트 매칭을 활성화하면 Unity가 유사한 셰이더 배리언트를 선택하지 않게 할 수 있습니다.

Unity에서 서브셰이더를 선택하는 방법

셰이더 배리언트에 여러 개의 서브셰이더가 포함된 경우 Unity는 다음 모든 항목과 호환되는 단일 서브셰이더를 선택하여 사용하려고 시도합니다.

Unity는 다음 요소 중에서 호환 가능한 첫 번째 서브셰이더를 다음 순서로 검색합니다.

  1. 셰이더에 표시되는 순서의 서브셰이더
  2. 모든 폴백 셰이더 오브젝트 내의 서브셰이더(셰이더 오브젝트에 표시되는 순서.

호환되는 서브셰이더를 찾을 수 없는 경우 Unity는 자홍색 오류 셰이더를 사용합니다.

ShaderLab 태그를 사용하여 어떤 서브셰이더가 어떤 하드웨어와 호환되는지 설정할 수 있습니다.ShaderLab: 서브셰이더에 태그 할당을 참조하십시오.

셰이더 배리언트 예열

성능이 많이 소요되는 경우, Unity는 확연한 지연을 방지하기 위해 최초로 필요하기 전에 셰이더 배리언트의 GPU 표현을 생성하도록 그래픽스 드라이버에 요청할 수 있습니다.이를 예열이라고 합니다.

다음 방법으로 예열할 수 있습니다.

Graphics Settings 창의 Preloaded shaders 섹션에서 셰이더 배리언트 컬렉션을 추가할 수도 있습니다.Unity는 빌드된 애플리케이션이 시작될 때 ShaderVariantCollection.WarmUp API를 사용하여 셰이더 배리언트 컬렉션을 로드하고 예열합니다.

DirectX 12, Metal 또는 Vulkan에서 예열

DirectX 12, Metal 또는 Vulkan용으로 빌드하는 경우 그래픽스 드라이버는 정확한 버텍스 데이터 레이아웃과 렌더링 상태를 알고 있는 경우에만 셰이더 배리언트의 정확한 GPU 표현을 생성할 수 있습니다.예열된 GPU 표현이 부정확한 경우 정확한 표현을 생성해야 할 때는 Unity가 여전히 지연될 수 있습니다.

정확한 배리언트를 생성하고 지연을 방지하려면 머티리얼을 화면 밖에서 렌더링하여 예열해야 합니다.

또한 다음 방법도 가능합니다.

  • Experimental.Rendering.ShaderWarmup을 사용하여 셰이더 오브젝트 또는 셰이더 배리언트 컬렉션을 예열하되, 버텍스 데이터 레이아웃을 제공하고 렌더링 상태를 정확하게 설정할 수 있는 경우에만 이렇게 하십시오.
  • ShaderVariantCollection.Warmup 또는 Shader.WarmupAllShaders를 사용합니다. 사용자가 버텍스 데이터 레이아웃이나 렌더링 상태를 제공할 수 없기 때문에 이것은 부정확한 예열된 GPU 표현을 생성할 수도 있습니다.

셰이더가 사용하는 메모리 양 제어

빌드된 애플리케이션에서 Unity는 압축된 셰이더 배리언트 데이터의 여러 ’청크’를 저장합니다.각 청크에는 여러 셰이더 배리언트가 포함되어 있습니다.Unity는 런타임에 씬을 로드할 때 해당 씬의 모든 청크를 CPU 메모리에 로드하고 압축을 해제합니다.

메모리가 제한된 플랫폼에서 메모리 사용량을 줄이기 위해 청크의 크기와 Unity가 메모리에 보관하는 압축 해제된 청크의 수를 제한할 수 있습니다.

이렇게 하려면 플레이어 설정에서 Other Settings > Shader Variant Loading을 선택하고 다음 설정을 조정합니다.

  • Default chunk size (MB) 를 사용하여 Unity가 빌드된 애플리케이션에 저장하는 압축된 청크의 최대 크기를 설정합니다.
  • Default chunk count 를 사용하여 Unity가 메모리에 보관하는 압축 해제된 청크 수를 제한합니다.기본값은 0으로 제한이 없습니다.

자세한 내용은 PlayerSettings.SetDefaultShaderChunkCount를 참조하십시오.

Override 를 사용하여 각 플랫폼의 값을 개별적으로 오버라이드할 수 있습니다.자세한 내용은 PlayerSettings.SetShaderChunkCountForPlatform을 참조하십시오.

또한 Shader.maximumChunksOverride를 사용하여 런타임에 Default chunk count 를 오버라이드할 수도 있습니다.

셰이더 로딩용 프로파일러 마커

다음 프로파일러 마커를 사용하여 프로파일러에서 셰이더 로딩을 확인할 수 있습니다.

  • 직렬화된 데이터에서 셰이더 오브젝트를 로딩하는 Unity의 경우 Shader.ParseThreadedShader.ParseMainThread
  • 셰이더 배리언트의 GPU 전용 버전을 생성하는 Unity의 경우 Shader.CreateGPUProgram
셰이더 배리언트 컬렉션
런타임 시 셰이더 교체
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961