커스텀 렌더 패스를 이용한 그리기
이 페이지에는 베타 버전에 관한 설명이 포함되어 있습니다.
Cubism 5 SDK for Unity R5 beta 3에서는 Universal Render Pipeline(이하, URP)에 대응함에 따라 모든 Cubism 모델의 그리기 처리가 커스텀 렌더 패스상에서 이루어지게 됩니다.
커스텀 렌더 패스 개요
Cubism SDK for Unity의 커스텀 렌더 패스는 Cubism URP Render Pass라는 이름으로 RenderGraph에 등록됩니다.
RenderPassEvent는 RenderPassEvent.BeforeRenderingTransparents로 설정되어 있어 투과 오브젝트의 렌더링 전에 처리가 이루어집니다.
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
const string renderCustomPass = "Cubism URP Render Pass";
~~~~~~
}
public override void Create()
{
_mScriptablePass = new CubismRenderPass
{
// Configures where the render pass should be injected.
renderPassEvent = RenderPassEvent.BeforeRenderingTransparents
};
}
RenderPassEvent는 프로젝트별로 사용하기 쉬운 것을 설정하십시오.
커스텀 렌더 패스로 수행하는 처리와 부하
커스텀 렌더 패스에서는 모델의 렌더링을 실시하기 위한 처리가 정리되어 있습니다.
커스텀 렌더 패스로 확보하는 주요 리소스
Cubism 5 SDK for Unity R5 beta 3부터 새롭게 사용되는, 특히 성능에 영향을 주는 리소스는 다음과 같습니다.
- 모델이 그려지는 텍스쳐
- 고급 블렌드 모드를 사용할 때 임시 그리기 대상으로 사용되는 텍스쳐
- 마스크를 그리는 텍스쳐
이는 텍스쳐 핸들로서 확보되어 Cubism 모델을 그리는 카메라의 렌더 타겟 정보를 바탕으로 텍스쳐가 생성됩니다.
처리 흐름
커스텀 렌더 패스에서 각 프레임의 그리기 처리는 아래와 같은 흐름으로 진행합니다.
- 그리기에 필요한 리소스 확보 및 데이터 취득
- 그리기 순서 계산
- 각 모델 그리기
- 그리기 결과를 카메라의 렌더 타겟에 반영
1. 그리기에 필요한 리소스 확보 및 데이터 취득
그리기에 필요한 리소스로서 아래와 같은 텍스쳐의 사용을 선언합니다.
- 활성화된 색상 텍스쳐
- 활성화된 깊이 텍스쳐
- 모델이 그려지는 텍스쳐
- 고급 블렌드 모드를 사용할 때 임시 그리기 대상으로 사용되는 텍스쳐
- 마스크를 그리는 텍스쳐
그리기 처리에 필요한 다음 데이터를 CubismRenderPass.PassData로 저장합니다.
- 그리기에 사용되는 모든 모델의 CubismRenderController
- Grouped Sorting Index와 Grouped Sorting Index별로 결합된 CubismRenderController의 배열
- URP에서 전달되는 카메라 데이터
- URP에서 전달되는 리소스 데이터
- 마스크를 그리는 텍스쳐 핸들
- 활성화된 색상 텍스쳐 핸들
- 활성화된 깊이 텍스쳐 핸들
- 모델이 그려지는 텍스쳐 핸들
- 고급 블렌드 모드를 사용할 때 임시 그리기 대상으로 사용되는 텍스쳐 핸들
2. 그리기 순서 계산
그리기 순서 정렬용 인덱스나 SortByDepth 이용 시 카메라로부터의 거리가 이전 프레임과 다른 경우 등에 그리기 순서를 업데이트합니다.
업데이트되었을 경우 마지막에 그리기 처리가 이루어지는 Drawable이 어느 것인지도 확인해 플래그를 설정하고 있습니다.
3. 각 모델 그리기
먼저 모델이 그려지는 텍스쳐로 그리기 대상을 전환합니다.
그 후 모델의 각 그리기 오브젝트의 그리기 처리 전에, 각 그리기 오브젝트가 그리기 처리를 실시하는지 확인하는 처리를 실시합니다.
어느 오브젝트를 그릴지 확정되면 그리기 순서에 따라 필요한 그리기 처리를 호출합니다.
또한 그리기 오브젝트의 그리기 처리 호출 전후에 그리기 인터럽트 기능으로 처리 호출을 수행합니다.
자세한 내용은 「그리기 인터럽트 기능」을 확인하십시오.
4. 그리기 결과를 카메라의 렌더 타겟에 반영
기본 설정은 Grouped Sorting Index(이하, 그룹)별로 카메라의 렌더 타겟에 반영합니다.
Grouped Sorting Index 기능에 대해서는 「Grouped Sorting Index 정보」를 확인하십시오.
Grouped Sorting Index(이하, 그룹)마다 카메라의 렌더 타겟에 반영하는 기능은 같은 그룹 이외의 그리기 오브젝트(모델)에 대해 블렌드 모드가 영향을 주지 않기 위해 수행됩니다.
이 설정을 비활성화하면 동일한 그룹인지 여부에 관계없이 그려진 그리기 오브젝트(모델)에 블렌드 모드가 영향을 미치는 대신 그룹 수가 많을 경우 성능이 향상됩니다.
자세한 내용은 「부하 관련」을 참조하십시오.
또한 설정에 관계없이 동일한 그룹 내에 그려지는 그리기 오브젝트에는 다른 모델의 그리기 오브젝트인지 여부에 관계없이 블렌드 모드가 영향을 줍니다.
Grouped Sorting Index 정보
모델을 그룹별로 나누어 그리기 처리를 하는 Cubism SDK for Unity의 독자적인 기능입니다. 각 모델은 CubismRenderController.GroupedSortingIndex별로 그리기 순서를 제어합니다.
CubismRenderController.GroupedSortingIndex가 다른 모델끼리는 CubismRenderController.SortingOrder 및 좌표를 변경해도 그리기 순서가 변경되지 않습니다.
Cubism 5 SDK for Unity R4_1 이전에는 CubismRenderController.SortingOrder 및 좌표만으로 그리기 순서를 제어하고 있어 특히 SortingByOrder 시에 모델끼리 교차시키지 않기 위해 CubismRenderController.SortingOrder의 값을 크게 벌어진 값으로 할 필요가 있었습니다.
이는 모델 전체의 그리기 순서인 CubismRenderController.SortingOrder가 모델의 각 Drawable의 SortingOrder인 CubismRenderer.SortingOrder에 더해지는 형태로 그리기 순서가 변경되었기 때문입니다.
Cubism 5 SDK for Unity R5 beta 3에서는 Grouped Sorting Index를 통해 CubismRenderController.SortingOrder와 독립적으로 모델 간의 전후 관계를 설정할 수 있습니다.
부하 관련
커스텀 렌더 패스로 퍼포먼스에 영향이 있는 항목은 아래와 같습니다.
Grouped Sorting Index
기본 설정(유효)은 카메라의 렌더 타겟에 그리기 결과를 반영하기 위해 Grouped Sorting Index마다 DrawMesh를 실행합니다.
이 영향으로 Grouped Sorting Index의 고유한 수만큼 드로우 콜이 증가합니다.
이 설정을 전환하려면 플래그 CubismRenderControllerGroup.IsCopiedToCameraTexture를 조작합니다.
기본값은 true입니다.
이 설정을 비활성화하면 Grouped Sorting Index별 DrawMesh에 의한 반영을 건너뛰고 모든 모델의 그리기가 완료된 후 카메라의 렌더 타겟에 한 번만 반영됩니다.
그려진 그리기 오브젝트에 대해 블렌드 모드가 영향을 미치는 대신 설정이 유효한 경우와 비교하여 그려지는 Grouped Sorting Index의 고유한 수가 많을수록 성능이 향상됩니다.
장면 뷰
Unity Editor상에서는 장면 뷰의 그리기 특성의 사정에 의해 추가로 처리를 실시하는 부분이 있습니다.
따라서 Unity Editor에서는 그리기 부하가 약간 높아집니다.