커스텀 프리미티브 데이터 (Custom Primitive Data, CPD) 워크플로를 사용하면 머티리얼을 이용하여 블루프린트와 코드로 액세스할 수 있는 인덱스 배열에 저장할 수 있습니다. 이 데이터를 사용하면 런타임 시 씬 프리미티브의 변경사항에 영향을 줄 수 있습니다.
이는 머티리얼 인스턴스 다이내믹(Material Instance Dynamics, MID) 함수와 비슷하게 기능하며, 스칼라와 벡터 파라미터를 통해 머티리얼 그래프의 일부를 런타임에서 동적으로 제어할 수 있는 방법을 제공합니다. 차이점으로는, 커스텀 프리미티브 데이터는 머티리얼 인스턴스가 아닌 프리미티브 자체에 데이터를 저장할 수 있다는 장점이 있습니다. 이를 통해 비슷하게 배치된 레벨 내 지오메트리(벽, 바닥 등의 복제된 지오메트리)의 드로 콜 수를 줄여줍니다.
사용 및 워크플로
아래의 단계에는 커스텀 프리미티브 데이터를 사용하여 씬 프리미티브와 상호작용하는 방법이 요약되어 있습니다.
- 스칼라 및 벡터 파라미터를 만들어 머티리얼 로직의 일부를 제어합니다. 동적으로 설정 및 제어할 각 파라미터에서 커스텀 프리미티브 데이터 사용(Use Custom Primitive Data) 을 활성화합니다.
- 디테일 패널에서 커스텀 프리미티브 데이터가 고유한 프리미티브 데이터 인덱스 를 활성화한 상태로 각 파라미터를 지정합니다. 블루프린트 또는 코드에서 이 인덱스를 참조합니다.
- 블루프린트에서 Set Custom Primitive Data 노드를 사용해 커스텀 데이터 배열에 저장된 값의 머티리얼 파라미터를 설정하고 제어합니다.
머티리얼 구성
머티리얼 인스턴스에서와 같은 방식으로 머티리얼의 어트리뷰트를 제어할 수 있도록 그래프에 스칼라 파라미터 및 벡터 파라미터 표현식을 추가합니다.
파라미터를 선택한 상태에서 디테일 패널의 커스텀 프리미티브 데이터 사용 프로퍼티를 찾아 활성화합니다.

활성화된 파라미터의 이름 아래에는 '커스텀 프리미티브 데이터'가 프리미티브 데이터 인덱스(Primitive Data Index) 에 할당된 값과 함께 표시됩니다. 이 값은 노드 자체에도 표시됩니다.

프리미티브 데이터 인덱스 값은 해당 파라미터가 저장된 할당 인덱스를 설정합니다. 이 인덱스는 블루프린트와 코드에서 파라미터를 참조하는 데 사용됩니다.
스칼라 (float) 파라미터에 인덱스를 할당하는 경우 해당 인덱스는 단일 값이 됩니다. 벡터 파라미터에서 동일한 작업을 하면 파라미터의 각 채널은 프리미티브 데이터 인덱스의 서로 다른 값에 할당됩니다. 위의 이미지에서 스칼라 파라미터는 인덱스 0에 할당된 반면, 벡터 파라미터는 인덱스 1, 2, 3, 4에 할당됩니다. 인덱스 값은 각각 RGBA 출력을 나타냅니다.
블루프린트 사용
다음 노드를 사용하면 블루프린트를 통해 커스텀 프리미티브 데이터를 사용하는 씬 프리미티브에 액세스할 수 있습니다.
- Set Custom Primitive Data Float
- Set Custom Primitive Data Vector
두 노드를 사용할 때는 파라미터 이름과 스트링이 일치하지 않아도 됩니다. 대신 두 노드는 지정된 프리미티브 데이터 인덱스 를 사용해 프리미티브당 배열에서 데이터를 설정하고 가져옵니다.

머티리얼에서 이 배열의 커스텀 데이터에 액세스하는 과정은 머티리얼 인스턴스에서 머티리얼 파라미터를 사용하는 것과 비슷합니다. 차이점은 파라미터 노드에서 머티리얼의 파라미터가 번호가 아닌 스트링 기준으로 일치해야 한다는 것입니다.
액터 디폴트 사용
디테일 패널에서 스태틱 메시 컴포넌트를 선택하고 커스텀 프리미티브 데이터 디폴트(Custom Primitive Data Defaults) 섹션을 펼치면 액터에 대한 커스텀 프리미티브 데이터 디폴트 값을 구성할 수 있습니다. 더하기(+) 아이콘을 사용하여 배열에 엘리먼트를 추가합니다. 배열에 머티리얼에서 명명된 커스텀 데이터 파라미터와 함께 프리미티브 데이터 인덱스 값으로 채워집니다.

번호가 매겨진 각 배열 요소는 상응하는 값을 가진 커스텀 프리미티브 데이터 인덱스를 참조합니다. 배열 요소의 인덱스가 존재하지 않으면 무시됩니다. 이 방법을 사용한 디폴트 설정은 블루프린트를 어태치하지 않고 값을 직접 조정하거나 값을 제어하기 위해 머티리얼 인스턴스를 만들 때 유용합니다.
구성 예시
아래 예시에서는 여러 파라미터(스칼라와 벡터 모두 포함)를 가진 단순한 머티리얼을 살펴봅니다. 그리고 벡터 파라미터에서 랜덤으로 색상을 선택하고 씬 내 메시의 이미시브와 오브젝트 스케일을 설정합니다. 저장된 커스텀 데이터의 이러한 3개 파라미터는 블루프린트를 사용하여 구동합니다.
머티리얼 구성 예시
머티리얼 구성을 보면 이 머티리얼 그래프의 3개 파라미터에 커스텀 프리미티브 데이터 사용 이 활성화되어 있습니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
베이스 컬러(Base Color) 및 이미시브(Emissive) 강도는 두 개의 파라미터, 즉 ‘컬러 파라미터(Color Param)’라는 벡터 4 파라미터와 ‘이미시브 파워(Emissive Power)’라는 스칼라 파라미터에 의해 구동됩니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
그래프의 두 번째 부분에서는 레벨에 할당한 메시의 스케일을 고르게 조정하기 위해 로직을 사용합니다. ‘Scale_XYZ’라는 스칼라 파라미터는 할당된 오브젝트의 스케일 조절 수준을 제어합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
블루프린트 구성 예시
머티리얼 인스턴스 다이내믹과 같은 파라미터의 커스텀 데이터를 통해 런타임에서 블루프린트나 코드를 사용하여 변경사항을 적용할 수 있습니다. 아래의 그래프는 이러한 머티리얼 파라미터의 값을 설정하고 업데이트하여 게임플레이 도중 색, 이미시브, 초기 스케일을 랜덤화합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
Event BeginPlay에서 Set Custom Primitive Data 노드는 색, 스케일, 이미시브 파라미터의 초기 값을 설정하는 데 사용됩니다. 데이터 인덱스 프로퍼티는 해당 노드에서 대상을 지정한 머티리얼 파라미터를 결정합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
예를 들어 이미시브 파워 파라미터는 인덱스 4에 할당되어, 이 값은 데이터 인덱스 4 를 대상으로 지정한 블루프린트 노드에서 설정됩니다.

Event Tick 에서 Set 노드는 각 커스텀 프리미티브 데이터 파라미터의 프리미티브 데이터 인덱스를 참조합니다. 새로운 색상과 이미시브 강도, 스케일은 Delay 노드에서 정의된 간격마다 설정됩니다. 색상은 3개의 랜덤 float 값을 벡터 4에 결합하여 설정됩니다. 이미시브 파워와 스케일은 Random Float in Range 노드로 랜덤화됩니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
Event Tick을 구성하고 사용할 때는 주의가 필요합니다. 이 예시에서는 빠른 테스트와 디버깅에 유용하지만, Event Tick이 항상 런타임에서 계속 사용하기 좋지는 않습니다.
예시 결과
이 예시에서는 결과적으로 블루프린트에서 제어하여 메시의 색, 이미시브 파워, 스케일을 설정하는 3개의 커스텀 프리미티브 데이터 파라미터가 포함된 머티리얼이 만들어졌습니다. 값은 런타임에서 설정된 다음 0.5 초마다 블루프린트에서 정의된 대로 랜덤하게 업데이트됩니다.
머티리얼 인스턴스 다이내믹 비교
커스텀 프리미티브 데이터를 구성하고 사용하는 방법은 머티리얼 인스턴스 다이내믹과 비슷합니다. 이 섹션에서는 공통점과 차이점을 잘 보여줄 수 있도록 각각에 필요한 머티리얼과 블루프린트 구성을 비교하겠습니다.
머티리얼 인스턴스 다이내믹을 생성할 때 나중에 블루프린트에서 필요한 것은 파라미터 이름이 전부입니다. 커스텀 프리미티브 데이터 워크플로에서는 각 파라미터에 커스텀 프리미티브 데이터 사용 옵션이 활성화되어 있어야 하며, 고유한 프리미티브 데이터 인덱스 값이 할당되어 있어야 나중에 블루프린트에서 참조됩니다.
![]() |
![]() |
---|---|
MID 머티리얼 파라미터 | 커스텀 프리미티브 머티리얼 파라미터 |
다음 이미지는 머티리얼 인스턴스 다이내믹과 커스텀 프리미티브 데이터의 블루프린트 구성을 비교합니다.
-
머티리얼 인스턴스 다이내믹 워크플로
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
머티리얼 인스턴싱에 대한 자세한 내용은 인스턴스드 머티리얼을 참조하세요.
-
커스텀 프리미티브 데이터 워크플로
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
워크플로는 비슷하지만 블루프린트에서 몇 가지 단계를 추가로 거쳐야 합니다. MID 워크플로에서는 Create Dynamic Material Instance 노드와 원하는 파라미터를 위해 머티리얼에서 스트링이 같은 파라미터 이름 을 참조하는 일부 Set Parameter Value 노드가 필요합니다.
런타임 시 레벨의 두 구성을 비교하면 시각적으로는 동일합니다. 하지만 커스텀 프리미티브 데이터는 아래 섹션에서 다룰 메시 드로잉 리팩터를 사용하여 퍼포먼스 비용을 절약한다는 장점이 있습니다.
영상 왼쪽에 있는 4개의 스피어 클러스터는 커스텀 프리미티브 데이터를 사용하는 반면, 오른쪽에 있는 4개의 스피어는 머티리얼 인스턴스 다이내믹을 사용합니다. 결과는 시각적으로 동일합니다.
퍼포먼스
커스텀 프리미티브 데이터 워크플로는 커스텀 데이터로 구성한 머티리얼을 사용할 때 레벨의 비슷한 지오메트리에 대해 드로 콜을 크게 줄여주는 장점이 있습니다. 드로 콜은 씬 프리미티브를 동적으로 자동 인스턴싱하는 메시 드로잉 리팩터로 줄입니다.
다이내믹 인스턴싱이 레벨에서 얼마나 잘 작동하는지 확인하려면 콘솔(`) 창을 열고 명령어 stat scenerendering
을 입력합니다.
이 명령은 현재 씬 뷰의 일반적인 렌더링 통계를 보여줍니다. 렌더링 과정에서 전반적으로 속도가 느린 퍼포먼스 영역을 파악하고 씬의 메시 드로 콜 수와 라이트를 세기에 좋은 출발점입니다.

디폴트 레벨 씬 렌더링 통계
레벨 뷰포트에서 작업하는 동안 G 를 눌러 게임 뷰 모드를 토글하거나 에디터에서 플레이(Play-In-Editor, PIE) 또는 시뮬레이션을 선택하면 보다 정확한 결과를 얻을 수 있습니다. 이러한 옵션을 사용하지 않을 때는 다른 드로 콜이 디렉셔널 라이트 아이콘과 같은 에디터 전용 지오메트리로 나타납니다.
이 예시 씬에서는 배경의 스카이 스피어 메시, 바닥 메시, 머티리얼의 커스텀 데이터를 사용한 여러 복제 메시로 시작합니다.

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

엔진은 드로 콜을 메시 드로 콜 정책(Mesh Drawing Policy)과 동적으로 자동 결합하기 때문에 현재 씬에서 드로 콜이 얼마나 잘 작동하는지 보려면 다이내믹 인스턴싱을 비활성화하는 것이 좋습니다. 비활성화 명령은 아래와 같습니다.
r.MeshDrawCommand.DynamicInstancing 0
메시 드로 콜
수가 몇 프리미티브만에 증가한 점에 주목하세요.

더 극적인 차이를 확인할 수 있도록 커스텀 프리미티브 데이터를 사용하는 메시를 더 복제해 보겠습니다. 여기서는 다양한 크기의 스피어 25개를 만듭니다.

-
다이내믹 인스턴싱을 비활성화하면 94개의 메시 드로 콜 이 나타납니다. 머티리얼 인스턴스 다이내믹을 사용하면 커스텀 프리미티브 데이터처럼 인스턴싱되지 않기 때문에 비슷한 결과가 나타납니다.
-
이제 다이내믹 인스턴싱을 다시 활성화하면 46개의 메시 드로 콜 이 나타납니다.
머티리얼에 커스텀 데이터를 저장하고 레벨에서 비슷한 지오메트리를 사용하면 머티리얼 인스턴스 다이내믹과 같은 대안적인 방법을 사용하는 것보다도 확실하게 드로 콜 수의 차이를 확인할 수 있습니다.
추가 참고 사항
- Float 한계 32
- 향후 출시 버전에서는 이 기능을 환경설정 가능한 프로젝트 세팅으로 만들 계획입니다.
- 사용자 정의 디폴트와 커스텀 프리미티브 데이터 파라미터 값의 오버라이드를 지원합니다.
- 현재 커스텀 프리미티브 데이터 파라미터를 구성했을 때 디폴트값은 항상 0입니다. 에디터에서 작업하는 동안 초기 값 설정이 필요하다면 머티리얼이 할당된 메시의 블루프린트에서 컨스트럭션 스크립트를 사용하여 설정할 수 있습니다.