본문 바로가기
이펙트 (FX)/이펙트 팁 : Unreal

[Unreal/Material] 언리얼 머티리얼에서 MPC를 최대 2개밖에 쓸 수 없는 이유 (Material Parameter Collection)

by Minkyu Lee 2025. 8. 5.

개요

머티리얼에서 MPC를 3개 이상 사용하면 아래와 같이 오류가 뜬다.

그 이유를 알아본다. (GPT 답변)

 

내용


왜 Material당 최대 2개의 Material Parameter Collection(MPC) 만 허용하는가?
✔️ 이건 단순한 설정의 문제가 아니라 Shader 시스템과 GPU 구조의 제한 때문입니다.


🎮 왜 3개 이상 못 쓰게 강제로 막아놨는가?

🧠 배경: Material Parameter Collection은 GPU 상에서 Uniform Buffer (UBO) 로 처리됩니다.

  • 각 MPC는 Shader 코드에서 Uniform Buffer로 선언됩니다.
  • 하지만 GPU Shader Model (특히 SM5, SM6 등)에 따라 Uniform Buffer의 개수에 제한이 있습니다.

🚫 이유 요약:

🛑 Shader Model의 제한 (특히 SM5, SM6)

  • DirectX, Vulkan 등의 Shader 시스템은 동시에 참조할 수 있는 Uniform Buffer 수에 엄격한 제한이 있습니다.
  • Epic은 이 제한을 피하기 위해, 엔진 레벨에서 머티리얼당 2개로 강제 제한을 걸어 둔 거예요.

💡 이건 단순히 설정을 바꿔서 풀 수 있는 제한이 아니라, 렌더링 파이프라인 전체의 안정성과 성능에 관련된 문제입니다.


🤔 Unreal 내부에서도 왜 2개까지만?

✔️ 에픽 게임즈는 실제 프로젝트에서:

  • MPC 사용을 최소화하고
  • Material Instance Dynamic (MID) 방식으로 대체하도록 권장합니다.

이 방식이 훨씬 더 유연하고, 퍼포먼스에도 좋습니다.


🎯 팁: MPC 안에 너무 많은 파라미터를 넣어도 안 좋다?

네, 맞습니다.

  • 하나의 MPC에 너무 많은 파라미터가 있으면 → Shader Compile 및 Runtime 성능 저하가 발생할 수 있습니다.
  • 그래서 보통 자주 바뀌는 값은 MID, 여러 머티리얼에서 공유해야 하는 값은 MPC 로 구분해서 쓰는 것이 좋습니다.

🔧 결론:

항목 설명

제한 개수 머티리얼당 2개의 MPC
왜 제한? GPU Shader Model의 UBO 제한 때문
풀 수 있나? ❌ 불가능 (엔진과 하드웨어 레벨의 제약)
해결법 MPC 통합 or MID 활용 or 머티리얼 분리

 

참고

 "MaterialParameterCollection 2개 제한은 GPU의 Constant Buffer / Root Signature 제한에서 기인한다"는 설명의 근거


📌 문서 링크
🔗 Direct3D 12 Hardware Support


🎯 관련된 문구와 해석:

🔍 문구 1:

"Maximum number of descriptor tables in a root signature: 2"

📖 해석:
Direct3D 12에서는 하나의 Root Signature (즉, GPU에게 전달되는 리소스의 정의) 안에 최대 2개의 Descriptor Table만 사용할 수 있습니다.

🔗 이 Descriptor Table이 바로 Material Parameter Collection이 사용하는 Constant Buffer의 형식입니다.


🔍 문구 2:

"Maximum size of all root signature parameters: 64 DWORDS (256 bytes)"

📖 해석:
Root Signature 내에 선언되는 모든 파라미터(예: Constant Buffers, Samplers 등)의 총 크기는 256바이트로 제한됩니다.

🔧 Unreal의 Material Parameter Collection은 각각 하나의 Constant Buffer로 컴파일 시 매핑됩니다.
따라서 3개 이상의 MPC를 참조하려고 하면, 이 제한에 걸리게 됩니다.


🔍 문구 3 (다른 문서 참고):

"HLSL supports up to 14 constant buffers for SM5.0 (depending on hardware)."

하지만 Unreal에서는 일관된 동작과 최적화를 위해,
머티리얼당 2개의 MPC 제한을 엔진 레벨에서 강제합니다.
이건 플랫폼 간 차이, 호환성 문제, 그리고 셰이더 컴파일 오류 방지 목적도 있습니다.


💡 왜 Unreal은 "2개"로 제한했나?

에픽 게임즈는 다음과 같은 이유로 2개로 제한했습니다:

🔸 Shader Uniform Layout을 최대한 단순화
🔸 모든 플랫폼에서 예측 가능한 성능과 호환성 확보
🔸 Root Signature, Descriptor Table, Register Binding 등을 관리하기 위한 엔진 내부 최적화 및 안정성 유지


📌 정리

항목 설명

관련 문구 "Maximum number of descriptor tables in a root signature: 2"
의미 하나의 셰이더(Material)는 두 개의 MPC(Constant Buffer)만 GPU에 바인딩 가능
Unreal Engine 적용 이유 플랫폼 통합성 + 셰이더 안전성 + Root Signature 한계

 

댓글