머티리얼에 프리미티브별 커스텀 데이터 저장하기

블루프린트를 통해 액세스할 수 있도록 프리미티브별 커스텀 데이터를 저장하는 커스텀 프리미티브 데이터 워크플로의 개요입니다.

Choose your operating system:

Windows

macOS

Linux

커스텀 프리미티브 데이터(Custom Primitive Data, CPD) 워크플로를 사용할 때 머티리얼을 이용해 블루프린트와 코드로 액세스할 수 있는 인덱스 배열에 커스텀 데이터를 저장하여 씬 프리미티브의 변경 사항에 영향을 미칠 수 있습니다. 이 워크플로는 머티리얼 인스턴스 다이내믹과 비슷하게 기능하며, 스칼라와 벡터 파라미터를 통해 머티리얼 그래프의 일부를 런타임에서 동적으로 제어할 수 있는 수단을 제공합니다. 차이점으로는, CPD는 머티리얼 인스턴스가 아닌 프리미티브 자체에 데이터를 저장하여 비슷하게 배치된 레벨 내 지오메트리(벽, 바닥 등의 복제된 지오메트리)의 드로 콜 수를 줄여준다는 장점이 있습니다.

사용 및 워크플로

씬 프리미티브에서 커스텀 프리미티브 데이터가 작동하는 방식입니다.

  1. 스칼라 및 벡터 파라미터를 설정해 머티리얼 로직의 일부를 제어합니다. 동적으로 설정 및 제어하고 싶은 각 파라미터에서 커스텀 프리미티브 데이터 사용(Use Custom Primitive Data) 을 활성화합니다.

  2. 이 옵션이 설정된 각 파라미터에 블루프린트나 코드에서 참조할 수 있는 고유의 프리미티브 데이터 인덱스(Primitive Data Index) 를 부여합니다.

  3. 블루프린트에서 Set Custom Primitive Data 노드를 사용해 커스텀 데이터 배열에 저장된 값의 머티리얼 파라미터를 설정하고 제어합니다.

머티리얼 사용

머티리얼 인스턴스에서 제어할 수 있는 머티리얼의 부분을 활용하는 것과 같은 방식으로 스칼라 파라미터벡터 파라미터 표현식을 사용해 머티리얼 그래프 일부를 제어합니다. 파라미터를 선택한 상태로 디테일(Details) 패널에서 해당하는 표현식의 커스텀 프리미티브 데이터 사용(Use Custom Primitive Data) 을 활성화합니다.

ParameterComparisons.png

왼쪽: 디폴트 스칼라 및 벡터 파라미터 표현식, 오른쪽: 커스텀 프리미티브 데이터가 활성화된 스칼라 및 벡터 파라미터.

활성화된 파라미터의 이름 아래에는 지정된 배열 인덱스와 함께 ‘커스텀 프리미티브 데이터(Custom Primitive Data)'가 표시됩니다.

CPD_NodeDisplay.png

프리미티브 데이터 인덱스(Primitive Data Index) 값은 해당 파라미터가 저장된 지정 인덱스를 설정합니다. 이 인덱스는 블루프린트와 코드에서의 레퍼런스에 사용됩니다.

스칼라(float) 파라미터에 인덱스를 설정하는 경우 해당 인덱스만 사용됩니다. 벡터 파라미터에 인덱스를 설정하는 경우 4개의 출력에 각각 float 값이 설정됩니다. 예를 들어, 벡터 파라미터에서 프리미티브 데이터 인덱스를 0으로 설정하면 각각 RGBA 출력을 나타내는 인덱스 0, 1, 2, 3에 float 값이 할당됩니다.

블루프린트 사용

아래 노드를 사용하면 블루프린트를 통해 커스텀 프리미티브 데이터를 사용하는 씬 프리미티브에 액세스할 수 있습니다.

  • Set Custom Primitive Data Float

  • Set Custom Primitive Data Vector

두 노드를 사용할 때는 파라미터 이름과 스트링이 일치하지 않아도 됩니다. 대신 두 노드는 지정된 프리미티브 데이터 인덱스 를 사용해 프리미티브별 배열에서 데이터를 설정하고 가져옵니다.

CPD_BP_Workflow.png

머티리얼에서 배열의 커스텀 데이터에 액세스하는 과정은 머티리얼 인스턴스에서 머티리얼 파라미터를 사용하는 것과 비슷합니다. 차이점은 파라미터 노드에서 머티리얼의 파라미터가 번호가 아닌 스트링 기준으로 일치해야 한다는 것입니다.

액터 디폴트 사용

디테일(Details) 패널에서 씬 프리미티브의 커스텀 프리미티브 데이터 디폴트값을 설정하면 커스텀 프리미티브 데이터 배열에 배열 요소를 추가할 수 있습니다.

CDP_Defaults.png

번호가 매겨진 각 배열 요소는 상응하는 값을 가진 커스텀 프리미티브 데이터 인덱스를 참조합니다. 배열 요소의 인덱스가 존재하지 않으면 무시됩니다. 이 방법을 사용한 디폴트 설정은 블루프린트를 어태치하지 않고 값을 직접 조정하거나 값을 제어하기 위해 머티리얼 인스턴스를 만들 때 유용합니다.

구성 예시 및 비교

아래 예시에서는 여러 파라미터(스칼라와 벡터 모두 포함)를 가진 간단한 머티리얼을 살펴봅니다. 그리고 그래프의 머티리얼 로직을 통해 벡터 파라미터에서 랜덤으로 색상을 선택하고 씬 내 메시의 이미시브와 오브젝트 스케일을 설정합니다. 저장된 커스텀 데이터의 파라미터는 블루프린트를 사용해 조정합니다.

머티리얼 구성 예시

머티리얼 구성을 보면 머티리얼 그래프의 선택된 파라미터에 대해 커스텀 프리미티브 데이터 사용(Use Custom Primitive Data) 이 활성화되어 있습니다.

이미지를 클릭하면 최대 크기로 볼 수 있습니다.

베이스 컬러(Base Color)이미시브(Emissive) 강도는 두 개의 파라미터, 즉 ‘컬러 파라미터(Color Parameter)'인 벡터 4 파라미터와 ‘이미시브 파워(Emissive Power)'인 스칼라 파라미터에 의해 만들어집니다.

이미지를 클릭하면 최대 크기로 볼 수 있습니다.

그래프의 두 번째 부분에서는 레벨에 할당한 메시의 스케일을 고르게 조정하기 위해 로직을 사용합니다. ‘Scale_XYZ'라는 스칼라 파라미터는 할당된 오브젝트의 스케일 조절 수준을 제어합니다.

이미지를 클릭하면 최대 크기로 볼 수 있습니다.

블루프린트 구성 예시

MID와 같은 파라미터의 커스텀 데이터를 사용하면 런타임에서 블루프린트나 코드를 사용해 변경사항을 적용할 수 있습니다. 아래 그래프는 이러한 머티리얼 파라미터에 값을 설정하고 저장하여 랜덤한 색, 이미시브, 게임 세션 시작 시 초기 스케일을 설정합니다.

이미지를 클릭하면 최대 크기로 볼 수 있습니다.

블루프린트의 Event BeginPlay에서 2개의 CPD 파라미터가 Set Custom Primitive Data 노드를 사용해 색상 및 스케일 값을 초기 설정합니다.

이미지를 클릭하면 최대 크기로 볼 수 있습니다.

두 Set 노드의 데이터 인덱스(Data Index) 는 머티리얼의 동일한 프리미티브 데이터 인덱스 를 사용해 머티리얼 파라미터를 초기 설정합니다.

CDP_BPNodes_To_Material.png

Event Tick에서 Set 노드는 CPD 파라미터의 프리미티브 데이터 인덱스를 참조해 Delay 노드가 틱마다 설정하는 랜덤한 시간을 바탕으로 새로운 색상과 이미시브 강도를 설정합니다. 색상은 XYZ에 대한 float 값의 랜덤 범위에 의해 설정됩니다. XYZ는 머티리얼의 벡터 파라미터 표현식에서 RGB 값으로 바뀝니다. 이미시브 강도 또한 float 값의 지정 범위를 사용해 설정됩니다.

이미지를 클릭하면 최대 크기로 볼 수 있습니다.

Event Tick을 구성하고 사용할 때는 주의가 필요합니다. 이 예시에서는 빠른 테스트와 디버깅에 유용하지만, Event Tick이 항상 런타임에서 계속 사용하기 좋지는 않습니다.

예시 결과

이 예시에서는 결과적으로 머티리얼 파라미터를 사용해 블루프린트로 제어하여 메시의 컬러, 이미시브, 스케일을 설정하는 여러 CPD 파라미터를 포함한 머티리얼이 만들어졌습니다.

이 페이지에서는 머티리얼 인스턴스 다이내믹과 CPD의 구성 및 사용이 비슷하다고 설명합니다. 이제 제대로 이해할 수 있도록 실제로 각 워크플로에 필요한 머티리얼과 블루프린트 구성을 비교하겠습니다.

머티리얼 구성을 위해서는 CPD를 사용하는 파라미터에 커스텀 프리미티브 데이터 사용(Use Custom Primitive Data) 이 활성화되어 있고 이후 블루프린트에서 참조할 프리미티브 데이터 인덱스(Primitive Data Index) 가 설정되어 있으면 됩니다. MID의 경우, 나중에 블루프린트에서 필요한 것은 파라미터 이름이 전부입니다.

Example_Parameters.png

Example_ParametersCPD.png

MID 머티리얼 파라미터

커스텀 프리미티브 머티리얼 파라미터

이제 필요한 블루프린트 구성을 비교해 보겠습니다.

  • 머티리얼 인스턴스 다이내믹 워크플로

    이미지를 클릭하면 최대 크기로 볼 수 있습니다.

    머티리얼을 사용한 인스턴싱에 관한 자세한 정보는 인스턴스드 머티리얼을 참조하세요.

  • 커스텀 프리미티브 데이터 워크플로

    이미지를 클릭하면 최대 크기로 볼 수 있습니다.

워크플로는 비슷하지만 블루프린트에서 몇 가지 단계를 추가로 거쳐야 합니다. MID 워크플로에서는 Create Dynamic Material Instance 노드와 원하는 파라미터를 위해 머티리얼에서 스트링이 같은 파라미터 이름 을 참조하는 일부 Set Parameter Value 노드가 필요합니다.

레벨의 두 구성을 런타임에서 비교하면 시각적으로는 동일합니다. 하지만 CPD는 아래 섹션에서 다루는 메시 드로잉 리팩터(drawing refactor)를 사용해 퍼포먼스 대비 비용을 줄여줍니다.

왼쪽: 커스텀 프리미티브 데이터 워크플로, 오른쪽: 머티리얼 인스턴스 다이내믹 워크플로

퍼포먼스

CPD 워크플로는 커스텀 데이터로 구성한 머티리얼을 사용하면 레벨의 비슷한 지오메트리에 대해 드로 콜을 크게 줄여주는 장점이 있습니다. 드로 콜은 자동으로 씬 프리미티브를 동적으로 인스턴싱하는 메시 드로잉 리팩터로 줄입니다.

다이내믹 인스턴싱이 레벨에서 얼마나 잘 작동하는지 확인하려면 콘솔(`) 창을 열고 명령어 **stat scenerendering** 을 입력합니다. 이 명령은 현재 씬 뷰의 일반적인 렌더링 통계를 보여줍니다. 렌더링 과정에서 전반적으로 속도가 느린 퍼포먼스 영역을 파악하고 씬의 메시 드로 콜 수와 라이트를 세기에 좋은 방법입니다.

CPD_StatSceneRendering.png

디폴트 레벨 씬 렌더링 통계

레벨 뷰포트에서 작업하는 동안 G 키를 눌러서 게임 뷰 모드를 토글하거나 에디터에서 플레이(PIE) 또는 시뮬레이션 모드를 선택하면 더 정확한 결과를 얻을 수 있습니다. 이러한 옵션을 사용하지 않을 때는 다른 드로 콜이 디렉셔널 라이트 아이콘과 같은 에디터 전용 지오메트리로 나타납니다.

이 예시 씬에서는 바닥 메시, 배경의 스카이 스피어, 머티리얼의 커스텀 데이터를 사용한 여러 복제 메시로 시작합니다.

CPD_StatSceneRenderin2a.png

scenerendering 통계는 현재 뷰에 기록된 드로 콜의 수(총 14개)를 보여줍니다.

CPD_StatSceneRenderin2.png

엔진은 드로 콜을 메시 드로 콜 정책(Mesh Drawing Policy)과 동적으로 자동 결합하기 때문에 현재 씬에서 드로 콜이 얼마나 잘 작동하는지 보려면 다이내믹 인스턴싱을 비활성화하는 것이 좋습니다. 비활성화 명령은 아래와 같습니다.

r.MeshDrawCommand.DynamicInstancing 0

메시 드로 콜 수가 몇 프리미티브만에 증가한 점에 주목하세요.

CPD_StatSceneRenderin3.png

더 극적인 차이를 볼 수 있도록 CPD를 사용하는 메시를 더 복제해 보겠습니다. 여기서는 다양한 크기의 구체 25개를 만듭니다.

CPD_StatSceneRenderin4.png

  • 다이내믹 인스턴싱을 비활성화하면 94개의 메시 드로 콜 이 나타납니다. MID는 CPD처럼 인스턴싱되지 않기 때문에 비슷한 결과가 나타납니다.

    CPD_StatSceneRenderin4b.png

  • 이제 다이내믹 인스턴싱을 다시 활성화하면 46개의 메시 드로 콜 이 나타납니다.

    CPD_StatSceneRenderin4a.png

머티리얼에 커스텀 데이터를 저장하고 레벨에서 비슷한 지오메트리를 사용하면 머티리얼 인스턴스 다이내믹과 같은 대안적인 방법을 사용하는 것보다도 확실하게 드로 콜 수의 차이를 확인할 수 있습니다.

추가 참고사항

  • Float 한계 32

    • 향후 출시 버전에서는 이 기능을 환경설정 가능한 프로젝트 세팅으로 만들 계획입니다.

  • 사용자 정의 디폴트와 커스텀 프리미티브 데이터 파라미터 값의 오버라이드를 지원합니다.

    • 현재 커스텀 프리미티브 데이터 파라미터를 구성했을 때 디폴트값은 항상 0입니다. 에디터에서 작업하는 동안 초기값 설정이 필요하다면 머티리얼이 할당된 메시의 블루프린트에서 컨스트럭션 스크립트를 사용해 설정할 수 있습니다.

언리얼 엔진의 이전 버전을 위해 작성된 페이지입니다. 현재 언리얼 엔진 5 버전을 위해 업데이트되지 않았습니다.