Version: 2023.1
언어: 한국어
드로우 콜 최적화
GPU 인스턴싱을 지원하는 셰이더 생성

GPU 인스턴싱

GPU 인스턴싱은 단일 드로우 콜에서 동일한 재질의 메시 사본을 여러 개 렌더링하는 드로우 콜 최적화 방법입니다. 각 메시 사본을 인스턴스라고 합니다. 씬 내에 여러 번 나타나는 나무나 덤불과 같은 것을 드로우하는 데 유용합니다.

GPU 인스턴싱은 동일한 드로우 콜에서 동일한 메시를 렌더링합니다.배리에이션을 추가하고 반복된 형상을 줄이기 위해 각 인스턴스는 Color 또는 Scale과 같은 프로퍼티를 다르게 가질 수 있습니다.여러 인스턴스를 렌더링하는 드로우 콜은 프레임 디버거Render Mesh (instanced)로 나타납니다.

요구 사항 및 호환성

이 섹션은 GPU 인스턴싱의 플랫폼, 렌더 파이프라인, SRP 배처 호환성을 포함하고 있습니다.

플랫폼 호환성

GPU 인스턴싱은 WebGL 1.0을 제외한 모든 플랫폼에서 사용할 수 있습니다.

렌더 파이프라인 호환성

기능 빌트인 렌더 파이프라인 유니버설 렌더 파이프라인(URP) 고해상도 렌더 파이프라인(HDRP) 커스텀 스크립터블 렌더 파이프라인(SRP)
GPU 인스턴싱 지원 지원(1) 지원(1) 지원(1)

참고:

  1. 셰이더가 SRP 배처와 호환되지 않는 경우에만 해당됩니다.

SRP 배처

GPU 인스턴싱은 SRP 배처와 호환되지 않습니다. SRP 배처는 GPU 인스턴싱보다 우선합니다. 게임 오브젝트가 SRP 배처와 호환되는 경우 Unity는 GPU 인스턴싱이 아닌 SRP 배처를 사용하여 렌더링합니다. 최적화 방법 우선 순위에 대한 자세한 내용은 최적화 우선 순위를 참조하십시오.

프로젝트에서 SRP 배처를 사용하고 게임 오브젝트에 GPU 인스턴싱을 사용하려는 경우 다음 중 하나를 수행할 수 있습니다.

  • Graphics.RenderMeshInstanced를 사용합니다.이 API는 게임 오브젝트 사용을 우회하고 지정된 파라미터를 사용하여 화면에 메시를 직접 그립니다.
  • SRP 배처 호환성을 수동으로 제거합니다. 수동으로 제거하는 방법에 대한 자세한 내용은 의도적으로 호환성 제거를 참조하십시오.

GPU 인스턴싱 사용

Unity는 동일한 메시와 머티리얼을 공유하는 게임 오브젝트에 GPU 인스턴싱을 사용합니다. 메시와 머티리얼을 인스턴스화하려면 다음 단계를 따르십시오.

  • 머티리얼의 셰이더는 GPU 인스턴싱을 지원해야 합니다.Unity의 스탠다드 셰이더는 모든 표면 셰이더와 마찬가지로 GPU 인스턴싱을 지원합니다.다른 셰이더에 GPU 인스턴싱 지원을 추가하려면 GPU 인스턴싱을 지원하는 셰이더 생성을 참조하십시오.
  • 메시는 동작에 따라 그룹화한 다음 소스 중 하나여야 합니다.
    • MeshRenderer 컴포넌트 또는 Graphics.RenderMesh 호출.
      동작:Unity는 이러한 메시를 목록에 추가한 다음 어떤 메시를 인스턴스화할 수 있는지 확인합니다.
      Unity는 SRP 배처와 호환되는 게임 오브젝트에 연결된 SkinnedMeshRenderers 또는 MeshRenderer 컴포넌트에 대한 GPU 인스턴싱을 지원하지 않습니다.자세한 내용은 SRP 배처 호환성을 참조하십시오.
    • Graphics.RenderMeshInstanced 또는 Graphics.RenderMeshIndirect 호출.이러한 메서드는 동일한 셰이더를 사용하여 동일한 메시를 여러 번 렌더링합니다.이러한 메서드를 호출할 때마다 별도의 드로우 콜이 발생합니다.Unity는 이러한 드로우 콜을 병합하지 않습니다.

머티리얼에 GPU 인스턴싱을 사용하려면 인스펙터에서 Enable GPU Instancing 옵션을 선택합니다.

머티리얼 인스펙터에 표시된 Enable GPU instancing 옵션
머티리얼 인스펙터에 표시된 Enable GPU instancing 옵션

조명

GPU 인스턴싱은 Unity의 베이크된 전역 조명 시스템을 지원합니다. Unity 스탠다드 셰이더와 표면 셰이더는 기본적으로 GPU 인스턴싱과 Unity의 베이크된 전역 조명 시스템을 지원합니다.

각 GPU 인스턴스는 다음 소스 중 하나에서 전역 조명을 지원합니다.

  • 임의 개수의 광원 프로브
  • 하나의 라이트맵
    참고: 인스턴스는 라이트맵에서 여러 아틀라스 영역을 사용할 수 있습니다.
  • 하나의 Light Probe Proxy Volume(LPPV) 컴포넌트
    참고: 모든 인스턴스가 포함된 공간 볼륨을 위해 LPPV를 베이크해야 합니다.

GPU 인스턴싱은 다음과 함께 자동으로 작동합니다.

  • 동적 메시 렌더러는 라이트 프로브의 영향을 받습니다.
  • 정적 메시 렌더러는 동일한 라이트맵 텍스처로 베이크합니다. 메시 렌더러는 정적 에디터 플래그Contribute GI를 포함하는 경우 이 컨텍스트에서 정적입니다.

Graphics.RenderMeshInstanced에 대한 라이트 프로브 렌더링을 활성화하려면 프로브 데이터가 포함된 MaterialPropertyBlock을 제공하십시오.자세한 내용과 코드 예시는 LightProbes.CalculateInterpolatedLightAndOcclusionProbes를 참조하십시오.

또는 LPPV 컴포넌트 레퍼런스와 LightProbeUsage.UseProxyVolumeGraphics.DrawMeshInstanced에 전달해도 됩니다.그러면 모든 인스턴스가 라이트 프로브 데이터의 L0 및 L1 대역 볼륨을 샘플링합니다.L2 데이터와 오클루전 데이터를 보완하려면 MaterialPropertyBlock을 사용합니다.자세한 내용은 라이트 프로브:기술 정보를 참조하십시오.

퍼포먼스 영향

버텍스 수가 적은 메시는 GPU 인스턴싱을 사용하여 효율적으로 처리할 수 없습니다. GPU가 GPU 리소스를 완전히 사용하는 방식으로 작업을 배포할 수 없기 때문입니다. 이러한 비효율적인 처리는 퍼포먼스에 부정적인 영향을 미칠 수 있습니다. 비효율성이 시작되는 임계값은 GPU에 따라 다르지만 일반적으로 256개 미만의 버텍스를 가진 메시에는 GPU 인스턴싱을 사용하지 않습니다.

버텍스 수가 적은 메시를 여러 번 렌더링하려는 경우 모든 메시 정보가 포함된 단일 버퍼를 생성하여 메시를 드로우하는 것이 가장 좋습니다.


  • 2017–10–24 페이지 수정됨

  • 인스턴스화 활성화 체크박스 설명, DrawMeshInstancedIndirect, #pragma multi-compile은 5.6 버전에서 추가됨

  • 2017.3에서 GPU 인스턴싱을 위한 셰이더 웜업 추가됨 NewIn20173

  • 2018.1에서 GPU 인스턴싱에 전역 조명(GI) 지원 추가됨 NewIn20181

드로우 콜 최적화
GPU 인스턴싱을 지원하는 셰이더 생성