TECHARTNOMAD | TECHARTFLOWIO.COM

(출간예정) 모두의 셰이더 프로그래밍

[TIP] 유니티 6. 하나의 서브메시에 다중 머티리얼 적용하는 법.

jplee 2025. 2. 12. 01:34

유니티 6 는 이 전 버전에 비해 GPU Driven 친화적으로 진화하고 있다.

기본적인 설정은 GPU 상주드로어등이 꺼져 있겠지만 HIZB 등을 사용하거나 좀 더 고도화 된 유니티 6 렌더패스와 GPU 최적화를 활용하기 위해서는 켜 주는 것이 보통일 것이다.

다만 이 전에 우리가 자주 사용했던 단일 서브메시에 2개 이상의 멀티머티리얼을 적용 할 경우 렌더링 처리 되지 않음으로 유니티에서 GPU Driven 관련 콤포넌트를 만들어 놓았다.

간단히 예로 들면...

주로 알파테스트와 알파블렌드 두 개의 페스를 머티리얼로 처리 하는 경우가 많은 상황에서 이렇게 Hair 객체에 스크립트 콤포넌트를 추가 할 수 있다.

유니티에서 제공하고 있ㅎ는 Disallow GPU Driven Rendering 콤포넌트를 적용 해 주면 이 전 처럼 단일 서브메시에 멀티머티리얼을 다중 페스처럼 사용할 수 있도록 한다.

다만 GPU Driven 의 베네핏에서는 제외 될 테지만 말이다.


Disallow GPU Driven Rendering 코드 분석

  1. 속성 및 필드
    • m_AppliedRecursively: 렌더링 설정이 자식에게 재귀적으로 적용되었는지 여부를 나타내는 내부 boolean 상태.
    • m_applyToChildrenRecursively: 자식 오브젝트에 대해서도 설정을 적용할지 여부를 나타내는 변수로, applyToChildrenRecursively 프로퍼티를 통해 접근.
    • applyToChildrenRecursively: m_applyToChildrenRecursively에 대한 Getter/Setter.
  2. Unity 콜백 메서드
    • OnEnable(): 스크립트가 활성화될 때 호출되며, GPU 기반 렌더링을 비활성화.
      • 설정 상태에 따라 현재 오브젝트와 모든 자식 오브젝트에 비활성화 설정 적용.
    • OnDisable(): 스크립트가 비활성화될 때 호출되며, GPU 기반 렌더링을 다시 활성화.
    • OnValidate(): Unity 에디터에서 값이 변경될 때 호출되며, 설정이 즉시 반영되도록 OnDisable()OnEnable() 호출.
  3. GPU 기반 렌더링 설정 메서드
    • AllowGPUDrivenRendering(Transform transform, bool allow): 주어진 TransformMeshRenderer에 대해 GPU 기반 렌더링 설정을 적용.
    • AllowGPUDrivenRenderingRecursively(Transform transform, bool allow): 재귀적으로 부모와 모든 자식 오브젝트에 대해 GPU 기반 렌더링 설정을 적용.

코드 작동 설명

  • 클래스는 GPU 기반으로 작동하는 렌더링을 비활성화하거나 다시 활성화할 수 있는 메서드를 제공하며, 해당 설정이 부모뿐만 아니라 자식 오브젝트까지 영향을 미칠 가능성을 설정으로 제공.
  • OnEnableOnDisable 콜백을 통해 applyToChildrenRecursively 값에 따라 설정이 현재 오브젝트와 자식 오브젝트에 즉각 적용됨.
  • OnValidate로 인해 에디터에서 설정을 변경하면 즉시 해당 코드가 반영됨.

서머리

  • 이 클래스는 GPU 기반 렌더링 비활성화라는 특정 목적을 가진 MonoBehaviour 스크립트입니다.
  • 주요 기능은 컴포넌트가 활성화/비활성화될 때 GPU 기반 렌더링을 끄거나 켜는 것입니다.
  • 자식까지 설정을 재귀적으로 적용하는 기능이 포함되어 있으며, 재귀 적용 여부를 applyToChildrenRecursively라는 프로퍼티로 제어합니다.

활용 방안

  1. 게임 최적화
    • GPU 기반 렌더링은 고성능 GPU에서 유용하지만, 모든 렌더링 작업이 GPU 기반으로 동작하면 지나치게 많은 리소스를 사용하거나 특정 조건에서 성능 문제가 발생할 수 있습니다.
    • 이 클래스는 특정 렌더링 타겟(오브젝트 또는 계층 구조)에 대해 GPU 렌더링을 비활성화하여 CPU 중심 방식으로 전환할 수 있도록 합니다.
  2. 에디터 편의성
    • OnValidate 콜백을 통해 에디터에서 실시간으로 설정을 확인하거나 조정할 수 있습니다. 이는 디자이너나 아티스트가 렌더링 설정을 수정하는 데 있어 큰 편의성을 제공합니다.
  3. 특정 렌더링 환경의 요구 사항
    • 게임 엔진에서 GPU 기반 렌더링을 비활성화해야 하는 GPU 호환성 문제나 특정 기기의 제한사항에 대응하기 위해 사용할 수 있습니다.
    • 예를 들어, 모바일 장치나 저성능 GPU에서 문제를 방지하기 위해 특정 오브젝트에서 GPU 렌더링을 제한하는 방식으로 활용됩니다.
  4. 자동화된 설정 변경
    • 재귀적으로 자식 오브젝트에 적용할 수 있는 기능이 있으므로, 복잡한 계층 구조의 오브젝트에 대해 수동으로 설정을 반복 적용할 필요가 없습니다.

리미트

  • 이 클래스는 GPU 렌더링 설정만 변경하도록 설계되어 있으므로, 다른 렌더링 최적화 방법(예: LOD 적용, 비활성화 등)에는 사용할 수 없습니다.
  • 현재는 MeshRenderer 컴포넌트에만 의존하며, 다른 렌더러(예: SkinnedMeshRenderer 등)은 처리하지 않습니다.