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

셰이더 로딩

기본적으로 Unity의 런타임 셰이더 로딩 동작은 다음과 같습니다.

  1. Unity는 씬을 로드하거나 런타임 리소스 로딩을 사용하여 콘텐츠를 로드하는 경우, 모든 필수 셰이더 오브젝트를 CPU 메모리에 로드합니다.
  2. 처음으로 셰이더 배리언트를 사용하여 지오메트리를 렌더링해야 할 때 Unity는 해당 배리언트의 데이터를 그래픽스 드라이버에 전달합니다. 그래픽스 드라이버는 GPU에서 해당 배리언트의 표현을 생성하고, 플랫폼이 필요로 하는 추가 작업을 수행합니다.

이 동작의 이점은 셰이더 배리언트에 대해 사전 GPU 메모리 사용 또는 로드 타임이 없다는 것입니다. 반면, 단점은 배리언트가 최초로 사용될 때 그래픽스 드라이버가 GPU에서 셰이더 프로그램을 만들고 추가 작업을 수행해야 하므로 확연한 지연이 있을 수 있다는 것입니다.

셰이더 배리언트 예열

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

경고: 예열 수행 방식을 선택하기 전에 그래픽스 API 지원에 대한 참고를 확인하십시오. DX12, Vulkan, Metal과 같은 최첨단 그래픽스 API에서는 버텍스 형식을 지정할 수 있는 실험적인 ShaderWarmup API만 완벽하게 지원됩니다. 다른 방법을 사용하면 작업 및 GPU 메모리만 낭비되고 지연은 해결하지 못할 수 있습니다.

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

  • 실험적 ShaderWarmup API를 사용하여 특정한 셰이더 오브젝트나 셰이더 배리언트 컬렉션을 예열합니다. 그래픽스 API 지원에 대한 내용은 참고 1에서 확인하십시오.
  • 애플리케이션 시작 시 셰이더 배리언트 컬렉션을 Graphics Settings 창의 Preloaded shaders 섹션에 추가하여 예열합니다. 그래픽스 API 지원에 대한 내용은 참고 2를 참조하십시오.
  • ShaderVariantCollection.WarmUp API를 사용하여 셰이더 배리언트 컬렉션을 예열합니다. 그래픽스 API 지원에 대한 내용은 참고 2를 참조하십시오.
  • Shader.WarmupAllShaders API를 사용하여 현재 메모리에 있는 모든 셰이더 오브젝트의 모든 배리언트를 예열합니다. 그래픽스 API 지원에 대한 내용은 참고 2를 참조하십시오.

참고:

  1. 모든 그래픽스 API를 완벽하게 지원합니다.
  2. DX11 및 OpenGL를 완벽하게 지원합니다. DX12, Vulkan, Metal을 일부 지원합니다. 버텍스 레이아웃 및/또는 렌더 타겟 설정이 예열에 사용된 데이터와 다른 경우 그래픽스 드라이버가 작업을 수행해야 할 수 있습니다.

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

GPU로 보낼 셰이더 배리언트 데이터의 표현을 만드는 Unity용 프로파일러 마커는 Shader.Parse입니다. 셰이더 프로그램을 GPU에 업로드하고, 필요한 작업을 수행하기 위해 GPU를 기다리는 프로파일러 마커는 CreateGPUProgram입니다.

Unity 프로파일러를 사용하는 방법은 애플리케이션 프로파일링을 참조하십시오.

셰이더 배리언트 컬렉션
런타임 시 셰이더 교체