SEO- Title:언리얼 엔진의 커스텀 디포머 그래프 생성 방법 description:런타임 시 캐릭터의 메시 디포메이션을 위해 커스텀 디포머 그래프 에셋을 생성하는 방법을 설명합니다. SEO-Description:언리얼 엔진에서 런타임 시 스켈레탈 메시 캐릭터에 트위스트 메시 디포메이션을 적용하기 위해 블루프린트 로직과 HLSL 프로그래밍을 사용하여 커스텀 디포머 그래프 에셋을 생성하고 편집하는 방법을 설명합니다. Type: Tutorial Parent:animating-characters-and-objects\SkeletalMeshAnimation\AnimHowTo Engine-Concept:Animating Characters and Objects Skill-Family:Essential Training Track:GameDev Track:Film/TV Tags:Animation Tags:Skeletal Mesh Tags:Deformers Tags:Beta Access: Topic-image:TopicImage.png Topic-Icon:TopicIcon.png Social-Image:SocialMedia.png Hero-Image:BannerImage.png Order: Prereq: Related:animating-characters-and-objects\SkeletalMeshAnimation\AssetsFeatures\deformer-graph Related:working-with-content\SkeletalMeshes Related:animating-characters-and-objects\SkeletalMeshAnimation\AssetsFeatures\MorphTarget Related:making-interactive-experiences\Physics\cloth-simulation Related:animating-characters-and-objects\SkeletalMeshAnimation\AnimHowTo\machine-learning-deformer Version: 5.1 Course: Redirect:
디포머 그래프를 사용하여 언리얼 엔진 내에서 커스텀 메시 디포메이션을 생성할 수 있습니다. 커스텀 디포머 그래프 에셋을 생성한 다음에는 고유한 블루프린트 노드 세트와 함께 디포머 그래프 에디터를 사용하여 모프 타깃과 클로스 시뮬레이션과 같은 기존 메시 디포메이션 시스템을 편집하거나 선형 스키닝된 메시(Linear Skinned Mesh) 를 위한 새로운 메시 디포메이션 시스템을 생성할 수 있습니다.
이 문서에서는 런타임 시 스켈레탈 메시 캐릭터에 트위스트 메시 디포메이션을 적용하기 위해 커스텀 디포머 그래프를 생성하는 방법에 대한 워크플로의 예시를 제공합니다.
전제조건
- 디포머 그래프 플러그인을 활성화해야 합니다. 메뉴 바(Menu Bar) 로 이동하여 편집(Edit) > 플러그인(Plugins) 에서 디포머 그래프 를 애니메이션(Animation) 섹션에서 찾거나 검색창(Search Bar) 을 사용합니다. 플러그인을 활성화 하고 에디터를 재시작 합니다.

커스텀 디포머 그래프 생성
스켈레탈 메시 캐릭터(Skeletal Mesh Character) 의 디테일(Details) 패널에서, 메시 디포머(Mesh Deformer) 프로퍼티를 활성화 한 다음, 드롭다운 메뉴에서 디포머 그래프(Deformer Graph) 옵션을 선택하여 새 디포머 그래프 에셋을 생성합니다.

에셋을 생성한 다음에는 메시 디포머 프로퍼티에서 해당 에셋을 더블클릭하여 디포머 그래프 에디터 를 엽니다. 디포머 그래프의 디테일 패널에서 메시(Mesh) 프로퍼티의 드롭다운 메뉴를 사용하여 수정할 메뉴를 선택합니다.

팔레트(Pallet) 패널에서 스켈레탈 메시 컴포넌트 바인딩(Skeletal Mesh Component Binding) 을 디포머 그래프의 업데이트 그래프(Update Graph) 로 드래그 앤 드롭하여 메시의 데이터를 읽습니다.

다음으로, 메시의 위치 데이터를 다시 작성하기 위해 Write Skinned Mesh 노드를 업데이트 그래프 에 추가하고 스켈레탈 메시 컴포넌트 바인딩을 연결합니다.

Execute Skinned Mesh 를 추가하고 스켈레탈 메시 컴포넌트 바인딩 에 연결하여 메시 디포메이션의 도메인을 설정합니다. 노드를 선택하고 도메인(Domain) 프로퍼티를 버텍스(Vertex) 옵션으로 변경합니다.

다음으로, Scene Data 노드를 추가하고 스켈레탈 메시 컴포넌트 바인딩 에 연결하여 메시가 차지하는 씬에 대한 정보를 추출합니다. 이 워크플로는 시간(Time) 데이터를 사용하여 런타임 시 메시 디포메이션을 구동합니다.

스켈레탈 메시의 버텍스 위치를 읽으려면 Skinned Mesh 노드를 추가하고 스켈레탈 메시 컴포넌트 바인딩 에 연결합니다. 이 노드는 캐릭터 메시 버텍스에 대한 위치(Position), 탄젠트 X(Tangent X), 탄젠트 Y(Tangent Y) 좌표를 제공합니다.

이제 Custom Compute Kernel 을 업데이트 그래프 에 추가합니다. Custom Compute Kernel은 고급 셰이더 언어 (High-Level Shader Language, HLSL) 프로그래밍을 사용하여 실제 메시 디포메이션 계산을 수행합니다.

구동 HLSL 프로그래밍을 작성하기 전이나 해당 노드를 그래프의 다른 노드에 연결하기 전에 HLSL 프로그램에서 메시 디포메이션을 수행하기 위해 사용하는 입력 및 출력 핀을 생성해야 합니다. Custom Compute Kernel 의 디테일 패널에서 다양한 Read 노드를 사용하여 스켈레탈 메시 컴포넌트 바인딩에서 추출한 정보를 활용하기 위해 다음 입력 핀을 추가합니다.

핀 | 데이터 타입 | 도메인 | 설명 |
---|---|---|---|
Num Threads |
Int Vector 3 | 파라미터 | Num Threads 핀은 Execute Skinned Mesh 노드의 출력 핀에서 메시 디포메이션의 도메인 을 받아들일 수 있습니다. |
Twist |
Float | 파라미터 | 이 입력 핀은 상수 또는 변수 값을 사용하여 메시 디포메이션의 최대 트위스트 정도를 결정합니다. |
Start |
Float | 파라미터 | 이 입력 핀은 상수 또는 변수 값을 사용하여 언리얼 엔진 유닛 (cm) 으로 메시의 Z축에서 트위스트의 시작 위치를 결정합니다. |
End |
Float | 파라미터 | 이 입력 핀은 상수 또는 변수 값을 사용하여 언리얼 엔진 유닛 (cm) 으로 메시의 Z 축에서 트위스트의 끝 위치를 결정합니다. |
Time |
Float | 파라미터 | 이 변수 입력 핀은 런타임 시 메시에서 게임 시간을 확보합니다. |
위치 |
Vector 3 | 버텍스 x1 | 이 입력 핀은 런타임 시 각 메시 축의 위치를 읽습니다. |
Tangent X |
Vector 4 | 버텍스 x1 | 이 입력 핀은 X축의 탄젠트 값을 읽습니다. |
Tangent Y |
Vector 4 | 버텍스 x1 | 이 입력 핀은 Z축의 탄젠트 값을 읽습니다. |
Execute Skinned Mesh 노드의 Num Threads 출력 핀 을 Custom Compute Kernel 노드의 스레드 수 입력 핀 에 연결합니다. 그런 다음, Custom Compute Kernel의 디테일 패널에서 실행 도메인(Execution Domain) 프로퍼티를 버텍스 세팅으로 설정합니다.

다음으로, Custom Compute Kernel의 디테일 패널에서 다음 출력 핀을 추가하여 스켈레탈 메시에 다시 작성하기 위해 Write Skinned Mesh 노드에 대한 디포메이션된 메시 데이터를 출력합니다.

핀 | 데이터 타입 | 도메인 | 설명 |
---|---|---|---|
Out Position |
Vector 3 | 버텍스 x1 | 메시 버텍스의 새로 디포메이션된 축 위치를 출력합니다. |
OutTangentX |
Vector 4 | 버텍스 x1 | X 축의 수정된 탄젠트 값을 출력합니다. |
OutTangentZ |
Vector 4 | 버텍스 x1 | Z 축의 수정된 탄젠트 값을 출력합니다. |
에셋을 저장(Save) 하고 컴파일(Compile) 합니다.

그런 다음, 셰이더 텍스트 에디터(Shader Text Editor) 패널에서 Custom Compute Kernel 의 선언(읽기 전용)(Declarations(Read-Only)) 탭이 모든 입력 및 출력 핀을 HLSL 선언으로 등록하는지 확인합니다.

선언(읽기 전용) 탭에는 다음과 같은 텍스트가 포함되어야 합니다.
선언(읽기 전용)
// 파라미터 및 리소스 읽기/쓰기 함수
int3 ReadNumThreads();
float ReadTwist();
float ReadStart();
float ReadEnd();
float ReadTime();
uint GetVertexCount();
float4 ReadTangentX(uint VertexIndex);
float4 ReadTangentZ(uint VertexIndex);
float3 ReadPosition(uint VertexIndex);
void WriteOutTangentX(uint VertexIndex, float4 Value);
void WriteOutTangentZ(uint VertexIndex, float4 Value);
void WriteOutPosition(uint VertexIndex, float3 Value);
// 리소스 인덱싱
uint Index; // SV_DispatchThreadID.x에서
다음으로, 셰이더 텍스트 에디터 패널의 셰이더 텍스트(Shader Text) 섹션에서 다음 HLSL 프로그램을 입력하여 스켈레탈 메시에 대한 버텍스 디포메이션을 수행합니다.
셰이더 텍스트 에디터
if (Index > ReadNumThreads().x) return;
float3 Position = ReadPosition(Index);
float4 LocalTangentX = ReadTangentX(Index);
float4 LocalTangentZ = ReadTangentZ(Index);
float Twist = ReadTwist();
float Start = ReadStart();
float End = ReadEnd();
float Time = sin(ReadTime());
float posz = min(max(Position.z, Start), End) / (End-Start);
float theta = posz * Twist * 0.0174533 * Time;
float sint = sin(theta);
float cost = cos(theta);
float3 TwistPosition;
TwistPosition.x = Position.x * cost - Position.y * sint;
TwistPosition.y = Position.x * sint + Position.y * cost;
TwistPosition.z = Position.z;
float3 TangentX;
TangentX.x = LocalTangentX.xyz.x * cost - LocalTangentX.xyz.y * sint;
TangentX.y = LocalTangentX.xyz.x * sint + LocalTangentX.xyz.y * cost;
TangentX.z = LocalTangentX.xyz.z;
float3 TangentZ;
TangentZ.x = LocalTangentZ.xyz.x * cost - LocalTangentZ.xyz.y * sint;
TangentZ.y = LocalTangentZ.xyz.x * sint + LocalTangentZ.xyz.y * cost;
TangentZ.z = LocalTangentZ.xyz.z;
float4 TwistTangentX = float4(normalize(TangentX), LocalTangentX.w);
float4 TwistTangentZ = float4(normalize(TangentZ), LocalTangentZ.w);
WriteOutPosition(Index, TwistPosition);
WriteOutTangentX(Index, TwistTangentX);
WriteOutTangentZ(Index, TwistTangentZ);
커스텀 HLSL 프로그램을 추가하여 메시 디포메이션을 계산한 다음에는 read 및 write 노드를 Custom Compute Kernel 의 관련 입력 및 출력 핀에 연결합니다.

마지막으로 세 개의 Float Constant 노드를 팔레트 패널에서 업데이트 그래프 로 드래그 앤 드롭하여 커스텀 함수에 대한 트위스트, 시작 및 끝 값을 설정합니다. 하나의 Float Constant 노드를 Custom Compute Kernel 노드의 사용할 수 있는 세 개의 입력 핀 각각에 연결합니다. 트위스트 입력 핀 에 연결된 Float Constant 노드의 값을 180.0 으로 설정하고, 시작 입력 핀 에 연결된 Float Constant 노드의 값을 0 으로, 끝 입력 핀 에 연결된 Float Constant 노드의 값을 100.0 으로 설정합니다.

이 값을 변경하여 함수의 입력이 어떻게 수정되는지 확인해 디포메이션을 동적으로 변경합니다. 상수 값 대신, 함수는 디포머 그래프 변수나 리소스 또는 애니메이션 커브를 사용하여 구동됩니다.
에셋을 저장 하고 컴파일 하면 이제 실시간으로 레벨은 물론 프리뷰 뷰포트(Preview Viewport) 패널에서도 메시 트위스팅을 확인할 수 있습니다.

메시를 선택하고 디테일 패널의 디포머(Deformers) 섹션으로 이동하여 레벨의 원하는 캐릭터에 커스텀 디포머 그래프를 추가할 수 있습니다. 디포머 그래프 프로퍼티를 활성화 하고 드롭다운 메뉴에서 커스텀 그래프를 선택하여 캐릭터에 커스텀 디포머 그래프를 할당할 수 있습니다.
디포머 그래프나 디포머 그래프 에디터 및 블루프린트 노드에 대한 자세한 내용은디포머 그래프 문서를 참조하세요.
커스텀 디포메이션 그래프 로직에 의해 제어되는 메시 디포메이션의 이 예시와 다른 응용 예시는 콘텐츠 예제에 있습니다.
디포머 그래프의 Custom Compute Kernels 구동에 사용되는 HLSL (고급 셰이더 언어) 프로그래밍에 대한 자세한 내용은 Microsoft 고급 셰이더 언어 레퍼런스 문서 및 프로그래밍 가이드를 참조하세요.
그래프 레퍼런스
여기에서 이미지 슬라이더를 사용하여 워크플로 예시에서 사용된 전체 디포머 그래프, Custom Compute Kernel 디테일 패널 및 셰이더 텍스트 에디터 패널을 참조할 수 있습니다.



레퍼런스 이미지