Com2uS는 Vulkan을 사용하여 그래픽을 개선합니다.

Com2uS Chronicles의 게임 제목 로고 스크린샷

Com2uS의 Summoners War: Chronicles 미국(WW)KR에서는 Android 렌더링에 Vulkan을 독점적으로 사용하며 성능이 최대 30% 향상되었습니다.

Vulkan은 기기 그래픽 하드웨어와 게임 간의 추상화를 최소화하도록 설계된 최신 크로스 플랫폼 3D 그래픽 API입니다. Vulkan은 OpenGL ES에 비해 CPU 오버헤드가 낮으며 Vulkan은 더 광범위한 기능을 제공합니다.

그림 1. 게임 내 스크린샷
그림 2. 게임 내 동영상

렌더링 기능

Com2uS는 다음과 같은 서머너즈 워: 크로니클용 고급 렌더링 기능을 개발했습니다.

  • 뷰 절두체에서 사전 렌더링 라이트 컬링 및 최대 16개의 활성 광원을 동시에 사용하는 맞춤 지연 렌더링 시스템
  • 여러 메시, 머티리얼, 텍스처를 한 번에 그리는 간접 렌더링 인스턴싱 메서드 (Clay이라고 함)
  • 사전 렌더링 작업을 위한 컴퓨팅 셰이더의 광범위한 사용
  • 카메라 이동, 그래픽 옵션, 런타임 성능에 따라 능동적 그림자 렌더링 및 후처리 효과를 동적으로 조정할 수 있는 기능

이동식 하드웨어 조정

서머너즈 워: Chronicles는 Android 기기, 개인 컴퓨터, 전용 게임 콘솔에 동일한 렌더기를 사용합니다. 모바일 하드웨어에서 최적의 성능을 달성하기 위해 Com2uS는 그리기 깊이와 밀도를 포함한 렌더링 설정을 조정했습니다. Android 11 (API 수준 30) 이하에서 실행되는 특정 기기를 수용하기 위해 Com2uS는 일부 셰이더의 대체 버전을 만들고 줄어든 인스턴스 수를 사용했습니다. 서머너즈 워: Chronicles도 Android의 적응형 성능 기능을 사용하여 기기 열 조건에 따라 그래픽 옵션을 동적으로 조정합니다.

Vulkan 전용 근거

Com2uS는 다음과 같은 이유로 서머너즈 워: 크로니클 전용으로 Vulkan을 사용했습니다.

  • 최소 기기 요구사항으로 인해 Vulkan 지원이 없는 구형의 덜 강력한 기기는 제외되었습니다.
  • Unity 엔진 내장 렌더링 파이프라인 (BiRP) 맞춤설정에는 게임의 Vulkan 백엔드에서만 사용할 수 있는 필수 기능이 있습니다.
  • 컴퓨팅 셰이더 출력 및 셰이더 저장소 버퍼 객체 (SSBO)를 활용하여 렌더링 기능을 구현하는 작업은 Vulkan에서 실행할 수 있지만 OpenGL ES에서는 실행할 수 없습니다.

컴퓨팅 워크로드

Summoners War: Chronicles는 상당한 컴퓨팅 셰이더 작업을 수행하여 렌더링용 데이터를 생성합니다. 컴퓨팅 셰이더는 다음과 같은 용도로 사용됩니다.

  • 객체 추려내기
  • 충돌 검사
  • 애니메이션 작업
  • 간접 렌더링 데이터 생성

결과 컴퓨팅 데이터는 Unity 엔진 RWBuffer 객체에 작성됩니다. 최적의 성능을 위해 Summoners War: Chronicles는 모든 컴퓨팅 작업을 단일 디스패치로 실행하므로 여러 RWBuffer를 동시에 사용해야 합니다. Unity BiRP OpenGL ES 백엔드는 한 번에 하나의 RWBuffer만 사용하고자 하므로 이 접근 방식은 Vulkan을 통해서만 가능했습니다.

렌더링을 위해 생성되는 데이터 세트는 균일 버퍼 객체 (UBO)의 기기 크기 제한보다 큰 경우가 많습니다. Summoners War: Chronicles는 용량 제한이 더 큰 셰이더 저장소 버퍼 객체 (SSBO)를 대신 사용합니다. 하지만 SSBO를 꼭짓점 단계 작업에 결합하려면 읽기 전용 SSBO를 지원해야 합니다. OpenGL ES는 읽기-쓰기 SSBO만 지원하고 Vulkan은 SSBO를 읽기 전용으로 표시할 수 있습니다.

Clay를 사용한 간접 인스턴스 렌더링

Summoners War: Chronicles에서 Com2uS는 여러 머티리얼, 메시, 텍스처를 단일 그리기 호출로 일괄 처리하는 방법을 개발했습니다. Com2uS에서는 이 시스템을 Clay라고 합니다. Clay는 그리기 호출을 크게 줄인 결과 게임 성능을 30% 향상했습니다.

클레이는 컬링 및 충돌 단계에서 호환되는 가시적 렌더링 가능한 객체의 목록을 빌드하는 것으로 시작됩니다. 그런 다음 Clay는 식별된 각 객체의 렌더링 정보를 SSBO로 생성합니다. 이 프로세스는 Unity 렌더러 DrawMeshInstancedIndirect 함수를 사용하여 간접 인스턴스화된 렌더링을 사용할 수 있는 컴퓨팅 셰이더를 통해 실행됩니다. 간접 렌더링을 사용하면 인스턴스 정보와 인스턴스 수 매개변수가 GPU에서 직접 생성됩니다. 객체를 그릴 때 Clay는 기존의 객체 메시를 결합하는 대신 그림과 같이 원뿔 메시를 결합합니다.

그림 3. 콘 메시

그런 다음 클레이는 컴퓨팅 셰이더에서 생성된 꼭짓점 변환 데이터의 바인딩된 SSBO를 사용하여 꼭짓점 셰이더의 콘 메시를 변환합니다. SSBO를 꼭짓점 단계에 바인딩하려면 Vulkan을 사용해야 합니다. 클레이는 변환된 원뿔 여러 개를 사용하여 단일 객체를 렌더링할 수 있습니다. 객체의 복잡성에 따라 원뿔의 수가 결정됩니다

그림 4. 콘 메시를 트리로 변환하는 방식

객체의 머티리얼 데이터는 컴퓨팅 셰이더에서 생성된 다른 버퍼에서 일괄 처리됩니다. 버퍼가 프래그먼트 셰이더에 결합됩니다. 그리려는 객체의 텍스처는 텍스처 배열로 구성됩니다. 객체 텍스처의 배열 색인은 객체의 머티리얼 데이터에 포함되어 있습니다. 이상적인 상황에서는 Clay가 최대 7회의 그리기 호출로 렌더링할 수 있습니다.

  • 정적 객체
  • 애니메이션 객체
  • 그림자 (4회 반복)
  • 반사

Unity와 Vulkan

서머너즈 워: Chronicles는 Unity 게임 엔진과 Vulkan 그래픽 API의 강력한 조합을 통해 개발자가 고급 콘솔 품질 그래픽을 Android 기기에 도입할 수 있음을 보여줍니다.