이 튜토리얼에서는 머티리얼과 머티리얼 인스턴스를 더 깊이 있게 다룹니다. 이 과정에서 예술적인 선택을 할 수 있게 돕고, 개발 속도를 높이며, 프로젝트의 오버헤드를 제어하는 데 도움이 되는 머티리얼 툴세트와 기법을 배우게 됩니다. 이후에는 게임 에셋에 머티리얼을 적용하고, 레벨 내 플레이어의 액션에 따라 블루프린트로 머티리얼을 제어하게 됩니다.
시작하기 전에
이 단원을 진행하려면 레벨 라이팅이 밝아야 합니다. 이전 튜토리얼에 따라 레벨의 라이팅을 낮춘 경우, 다음 세팅을 사용합니다.
디렉셔널 라이트 강도(Directional Light Intensity) | 6.0 |
최소 EV100(Min EV100) | False |
최대 EV100(Max EV100) | False |
머티리얼 및 머티리얼 인스턴스
머티리얼은 게임 내 에셋의 표면 프로퍼티를 정의합니다. 텍스처와 마찬가지로 머티리얼은 메시를 감싸는 포장지와 같으며, 표면의 외형과 라이트 소스에 대한 반응 방식을 변경합니다.
텍스처와 달리 머티리얼은 노드 기반 워크플로를 통해 변경사항이 유지되는 방식으로 커스터마이징할 수 있습니다. 예를 들어 머티리얼에는 돌이나 금속 같은 실제 재질의 어트리뷰트를 모방하는 사전 설정된 프로퍼티가 포함되어 있습니다. 아래 이미지에 나와 있는 머티리얼 사이의 차이점은 메탈릭과 러프니스 프로퍼티뿐입니다.
머티리얼은 텍스처와 로직을 결합하여 복잡한 재질을 레이어 단위로 생성할 수 있게 해줍니다. 이러한 조합을 잘 활용하면 프로젝트에서 월드를 제작하는 데 영향을 미치는 예술적인 선택을 할 수 있습니다. 이는 금속 게임 에셋에 스크래치를 추가하는 것처럼 단순할 수도 있고, 물이 모래 위를 흐르는 것처럼 복잡할 수도 있습니다.
예술적인 선택을 넘어, 머티리얼은 개발 프로세스를 간소화하는 데에도 활용할 수 있습니다. 예를 들어 머티리얼은 머티리얼 인스턴스라고 하는 자손 파일 타입을 생성합니다. 머티리얼 인스턴스는 부모 머티리얼의 프로퍼티를 상속하는 사본입니다. 인스턴스는 상속된 프로퍼티를 변경사항이 유지되는 방식으로 오버라이드하여 고유한 프로퍼티를 가질 수 있습니다.
개발 환경에서는 부모 머티리얼과 머티리얼 인스턴스를 활용하여 다음을 수행할 수 있습니다.
즉각적인 시각적 피드백: 인스턴스에 적용한 변경사항이 부모 머티리얼의 셰이더를 리컴파일하지 않아도 모든 뷰포트에 즉시 반영됩니다.
퍼포먼스 향상: 인스턴스는 부모와 동일한 셰이더 코드를 사용하므로, 컴파일해야 할 총 셰이더 수를 줄이고 런타임 동안 셰이더 전환을 감소시킬 수 있습니다.
워크플로 간소화: 인스턴스는 아티스트 팀에 필요한 프로퍼티만 노출하여 복잡성을 줄입니다.
블루프린트와의 인터랙션: 머티리얼과 해당 자손 인스턴스는 로직을 사용하므로, 블루프린트를 통해 머티리얼 프로퍼티를 외부에서 제어할 수 있습니다.
팁:
머티리얼은 메시로 제한되지 않습니다. UI, 포스트 프로세싱, 라이팅 등 다양한 용도로 사용할 수 있습니다.
머티리얼은 셰이더가 아니며, 노드 기반 표현식을 내부적으로 하이 레벨 셰이더 언어(High-Level Shader Language, HLSL)로 변환하여 에셋의 최종 외형을 계산하는 인터페이스입니다.
셰이더 전환은 언리얼 엔진이 렌더링 중인 에셋에 맞는 셰이더를 선택하는 과정을 의미합니다. 런타임에서 셰이더를 자주 전환하면 스터터링이 발생할 수 있습니다.
이 튜토리얼에서 사용할 툴과 인터페이스를 살펴보겠습니다.
머티리얼의 구조
머티리얼 툴세트를 더 잘 이해할 수 있도록 기존 머티리얼을 열어 보겠습니다. 콘텐츠 브라우저에서 다음 경로로 이동합니다.
All > 콘텐츠 > LevelPrototyping > Materials
Materials 폴더에서 M_FlatCol을 찾습니다.
이 머티리얼의 명명 규칙을 보면 M_ 접두사를 사용하고 있습니다. 이는 머티리얼을 다른 파일과 구분하기 위한 언리얼 엔진의 일반적인 명명 규칙입니다. 정확한 접두사는 자유롭게 정할 수 있지만, 개발 팀 전체의 명명 규칙을 정하면 수백 개의 에셋을 다룰 때 혼란을 방지할 수 있습니다.
M_FlatCol을 더블클릭합니다. 열리는 창은 머티리얼 에디터입니다. 이 튜토리얼에서 가장 중요한 에디터의 탭은 프리뷰(Preview 창, 머티리얼 그래프(Material Graph), 디테일(Details) 패널입니다.
| 번호 | 탭 이름 | 설명 |
|---|---|---|
1 | 프리뷰 창 | 편집 중인 머티리얼의 리얼타임 예시를 표시합니다. 라이팅, 뷰 모드, 프리뷰 메시를 변경할 수 있는 옵션을 제공합니다. |
2 | 머티리얼 그래프 | 머티리얼은 이 노드 기반 그래프에서 노드(표현식)를 조합하여 구성됩니다. 기본적으로 머티리얼에는 베이스 머티리얼 노드 또는 머티리얼 루트 노드라고 하는 노드가 그래프에 하나 포함되어 있습니다.
|
3 | 디테일 패널(Details Panel) | 선택된 머티리얼 표현식의 프로퍼티 창입니다. 아무 노드도 선택되지 않은 상태에서는 머티리얼의 베이스 프로퍼티가 표시됩니다. 머티리얼 도메인(Material Domain), 블렌드 모드(Blend Mode), 셰이딩 모델(Shading Model)과 같은 베이스 프로퍼티는 그래프의 머티리얼 루트 노드에 표시되는 프로퍼티에 영향을 미칩니다. |
다음 단계를 따라 머티리얼의 베이스 컬러를 변경해 보세요.
머티리얼 그래프에서 Base Color 노드를 더블클릭합니다.
컬러 피커에서 16진수 sRGB
FFBC00FF를 입력하고 확인(OK)을 클릭합니다.저장(Save), 파일(File) > 저장, 또는 Ctrl+S를 눌러 머티리얼을 저장합니다.
프로젝트에서 M_FlatCol을 사용하는 에셋이 있다면 레벨에서 변화가 나타날 수 있습니다.
콘텐츠 브라우저로 돌아가 MI_DefaultColorway를 찾습니다. 이는 M_FlatCol을 부모로 사용하는 머티리얼 인스턴스입니다.
이를 더블클릭하여 머티리얼 인스턴스 에디터를 엽니다.
머티리얼 에디터와 달리 머티리얼 인스턴스 에디터에서는 노드를 직접 수정하는 커스터마이징 작업은 수행할 수 없습니다. 디테일(Details) 패널의 부모(Parent) 헤딩 아래에 M_FlatCol이 표시되는 것을 확인할 수 있습니다. 부모 머티리얼은 자손에게 프로퍼티를 전달하므로 이 인스턴스의 베이스 컬러는 노란색이어야 합니다. 하지만 프리뷰 창을 확인해 보세요. 샘플 메시가 여전히 회색으로 표시됩니다.
이는 M_FlatCol의 베이스 컬러 프로퍼티가 노출되어 있으며(편집 가능), 현재 회색 값으로 오버라이드되어 있기 때문입니다. 인스턴스는 부모 머티리얼에서 노출된 프로퍼티를 오버라이드하여 고유한 프로퍼티를 가질 수 있습니다.
두 가지 실험을 진행해 보겠습니다.
오버라이드 제거하기
오버라이드를 적용하여 이 인스턴스의 베이스 컬러 변경
따라하려면 다음 단계를 따릅니다.
디테일 패널의 표면 프로퍼티에서 베이스 컬러(Base Color)를 체크 해제합니다. 이렇게 하면 오버라이드가 제거됩니다. 프리뷰 창에서 예시 메시가 회색에서 노란색으로 변경됩니다.
오버라이드를 다시 적용하려면 베이스 컬러를 체크합니다. 색 견본을 클릭하여 컬러 피커를 열고 새 컬러를 선택합니다.
머티리얼 인스턴스를 저장합니다.
이 인스턴스를 사용하는 레벨의 에셋은 새로운 베이스 컬러로 업데이트되지만, M_FlatCol을 직접 사용하는 에셋은 노란색으로 유지됩니다.
이는 머티리얼이 계층구조를 가지기 때문입니다.
부모 머티리얼은 자손 인스턴스에 변경사항을 전파할 수 있습니다.
인스턴스는 고유한 노출 프로퍼티를 가질 수 있습니다.
인스턴스는 자신의 자손 인스턴스에 변경사항을 전파할 수 있습니다.
인스턴스는 부모 머티리얼에 변경사항을 전파할 수 없습니다.
효율적인 부모 머티리얼은 모든 자손 인스턴스를 위한 유연한 기반 역할을 하며, 개발 파이프라인에서 컴파일, 셰이더 전환, 반복 작업을 줄여줍니다. 부모 머티리얼을 생성할 때는 팀에서 자주 액세스하고 반복적으로 조정하게 될 프로퍼티가 무엇인지 고려하는 것이 좋습니다.
이 섹션에서 변경한 머티리얼을 리셋하려면 M_Flat_Col의 베이스 컬러를 767676FF로 설정하고 MI_DefaultColorway의 베이스 컬러를 C0C0C0FF로 설정합니다.
머티리얼 에디터 UI에 대한 자세한 내용은 머티리얼 에디터 UI를 참고하세요.
부모 머티리얼 생성
이 섹션에서는 베이스 컬러(Base Color), 메탈릭(Metallic), 노멀(Normal), 러프니스(Roughness) 프로퍼티를 갖는 부모 머티리얼을 제작합니다. 텍스처, 표현식 또는 이 둘의 조합을 사용하여 이러한 프로퍼티를 제어합니다.
새 머티리얼을 생성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서 All > 콘텐츠 > AdventureGame > Artist > Materials 경로로 이동한 다음 추가(Add)를 클릭하고 목록에서 머티리얼(Material)을 선택합니다.
머티리얼 이름을
M_Surfaces로 짓습니다.M_Surfaces를 더블클릭하여 머티리얼 에디터를 엽니다.
다음으로는, 텍스처를 사용하여 머티리얼 내부 프로퍼티를 제어해 보겠습니다.
텍스처를 통한 프로퍼티 제어
텍스처 맵 또는 텍스처는 머티리얼 내부에서 레이어로 조합하고 커스터마이징하여 다양한 시각적 결과를 만들어내는 이미지 파일입니다.
텍스처는 복잡하거나 공간적으로 다양한 디테일을 가진 머티리얼에 유용합니다. 각 픽셀이 고유한 RGB 및 알파 정보를 저장하기 때문입니다. 예를 들어 긁힌 금속을 모방하는 머티리얼을 만들 때 스페큘러 맵은 알파 정보를 사용하여 라이트를 반사해야 하는 영역과 그렇지 않은 영역을 정확히 지정합니다.
이 섹션에서는 TextureSample 표현식을 사용하여 디퓨즈 맵과 노멀 맵을 머티리얼에 적용합니다.
디퓨즈 맵은 라이팅 정보 없이 기본 컬러와 시각적 프로퍼티만 포함합니다. 노멀 맵은 메시에 지오메트리를 추가하지 않고도 범프나 크랙 같은 표면 텍스처를 모방합니다.
텍스처 맵을 추가하려면 다음 단계를 따릅니다.
그래프를 우클릭하고 TextureSample을 검색하고 목록에서 선택합니다. 키보드 단축키 T+LMB를 사용할 수도 있습니다.
TextureSample 노드를 두 개 추가하고, 하나를 다른 하나 아래에 배치합니다.
상단의 TextureSample 노드를 선택합니다. 디테일 패널의 머티리얼 표현식 텍스처 베이스(Material Expression Texture Base)에서 비어 있는 텍스처(Texture) 드롭다운을 클릭하고
DefaultDiffuse를 검색합니다. 목록에서 디퓨즈 맵을 선택합니다.위쪽 TextureSample 노드를 선택한 상태에서 RGB 출력을 머티리얼 루트 노드(
M_Surfaces)의 베이스 컬러 입력에 연결합니다.하단의 TextureSample 노드를 선택합니다. 디테일 패널의 머티리얼 표현식 텍스처 베이스(Material Expression Texture Base)에서 텍스처(Texture) 드롭다운을 클릭하고
DefaultNormal을 검색합니다. 목록에서 노멀 맵을 선택합니다.아래쪽 TextureSample 노드를 선택한 상태에서 RGB 출력을 머티리얼 루트 노드의 노멀(Normal) 입력에 연결합니다.
머티리얼을 저장합니다.
이제 머티리얼 그래프가 다음과 같은 모습이 됩니다.
다음으로는, 표현식을 사용하여 프로퍼티를 제어해 보겠습니다.
Constant를 통한 프로퍼티 제어
이 섹션에서는 메탈릭 및 러프니스 프로퍼티를 Constant 표현식으로 제어하여 석재와 유사한 머티리얼을 생성합니다. Constant를 사용하여 프로퍼티를 제어하면 글로벌 범위에서 균등하게 조정할 수 있습니다.
Constant는 단일 플로트 값으로 프로퍼티를 제어합니다. 예를 들어 메탈릭의 플로트 값 범위는 0~1입니다. 0은 플라스틱 같은 비금속 표면을 모방하고, 1은 크롬 같은 금속 표면을 모방합니다.
언리얼 엔진에서 금속 표면의 리플렉션은 베이스 컬러로 컬러가 입혀지고, 비금속 표면의 리플렉션은 환경 라이트 소스에 의해 컬러가 입혀집니다.
Roughness 역시 0~1 범위의 플로트 값을 가집니다. 0은 매끄러운 표면을 모방하고, 1은 거친 표면을 모방합니다. 러프니스는 표면에서 라이트가 스캐터링되는 방식에 영향을 미칩니다. 매끄러운 표면은 보다 촘촘한 스페큘러 리플렉션(유광)을 보이고, 거친 표면은 디퓨즈드 리플렉션(무광)을 보입니다.
Constant로 이러한 프로퍼티를 제어하면 무광 플라스틱, 유광 플라스틱, 거친 금속, 매끄러운 크롬과 같은 재질을 모방할 수 있습니다.
석재 머티리얼을 생성하려면 다음 단계를 따릅니다.
머티리얼 그래프에서 우클릭한 후 목록에서 Constant를 선택합니다. 또는 키보드 단축키 1+LMB를 사용할 수 있습니다. Constant를 두 개 추가합니다.
첫 번째 Constant 핀에서 드래그하여 베이스 노드의 메탈릭 입력에 연결합니다. 두 번째 Constant를 Roughness 입력에 연결합니다.
메탈릭 Constant를 선택한 상태에서 값이
0인지 검증합니다.러프니스 Constant를 선택한 상태에서 값을
1로 설정합니다.머티리얼을 저장합니다.
이제 머티리얼 그래프가 다음과 같은 모습이 됩니다.
다음 섹션에서는 머티리얼에서 텍스처를 타일링하는 방법을 살펴봅니다.
텍스처 스케일 조절 및 타일링
디퓨즈와 노멀 맵이 바닥 타일처럼 보이는 것을 확인했을 것입니다. 이 섹션에서는 머티리얼 표현식을 사용하여 UV를 스케일 조절하고, 모든 방향으로 무한 반복 가능한 석재 바닥을 생성합니다. 이를 타일링이라고 합니다.
타일링은 오버헤드를 증가시키지 않으면서 대규모 메시를 커버하는 데 자주 사용됩니다. 텍스처를 스케일 다운하고 타일링하는 방식은 특정 메시마다 고유한 대규모 고해상도 텍스처를 사용하는 것보다 비용이 적게 듭니다.
리소스 할당은 게임 개발 시 내려지는 결정에 자주 영향을 미칩니다. 바닥과 같이 플레이어의 주목도가 낮은 영역에서 리소스를 절약하면 리얼타임 시네마틱에서 클로즈업되는 캐릭터, 아이템 또는 지오메트리에 고해상도의 고유하거나 직접 그린 텍스처를 사용할 수 있게 됩니다.
여기에서는 Texture Coordinate 표현식을 사용하여 디퓨즈와 노멀 맵의 타일링을 제어합니다. Multiply라는 새로운 표현식도 함께 사용합니다. Multiply 표현식은 두 개의 입력을 취해 하나의 출력으로 결합합니다.
타일링 텍스처를 만들려면 다음 단계를 따릅니다.
머티리얼 에디터의 프리뷰 창에서 메시를 프리미티브 평면으로 설정하여 머티리얼이 더 명확하게 보이도록 만듭니다.
텍스처를 더 잘 볼 수 있도록 프리뷰 라이팅을 조정해야 할 수 있습니다. 프리뷰 창에서 L 키와 LMB를 누른 채 드래그하여 라이트 소스를 이동합니다.
머티리얼 그래프에서 우클릭하고 목록에서 Texture Coordinate 노드를 추가합니다.
Texture Coordinate 노드의 출력에서 드래그하여 Multiply 노드를 검색하고 생성합니다.
Multiply 노드의 B 입력에서 드래그하여 Constant를 생성합니다.
Constant의 플로트 값을
1로 설정합니다.Multiply 노드의 출력에서 드래그하여 Diffuse 및 Normal Texture Sample 노드의 UV 입력에 연결합니다.
이제 타일링 머티리얼이 완료되었습니다. 이제 타일링을 대상으로 인티저로 스케일 업하고 분수로 스케일 다운하는 두 가지 실험을 해보겠습니다.
머티리얼 그래프에서 텍스처 좌표를 제어하는 Constant를 선택합니다.
값을
2로 설정합니다.
디퓨즈와 노멀 맵이 기본 스케일(1.0)에서 5x5 브릭 그리드라면, 값을 2로 스케일 조절하면 10x10 브릭 그리드가 됩니다. 자세히 보면 텍스처의 결함이 반복되는 부분을 확인할 수 있습니다.
이제 값을 0.5로 설정합니다. 텍스처가 제대로 타일링되지 않는 것을 확인 수 있습니다. 디퓨즈 맵이 6x6 그리드였다면, 0.5로 스케일을 조절해도 잘리지 않았을 것입니다. 맵을 생성할 때는 텍스처가 언리얼 엔진에서 어떻게 스케일 조절되는지 반드시 고려해야 합니다.
메시의 UV 좌표도 텍스처 타일링에 영향을 미칩니다. 스트레치된 UV는 원하지 않는 방식으로 텍스처를 왜곡할 수 있습니다. 이 내용은 이 튜토리얼의 후반부에서 더 자세히 배우게 되며, 다음 튜토리얼 시리즈에서는 해결 방법을 확인할 수 있습니다.
머티리얼 그래프 정리
여기서 잠시 정리에 대해 생각해 보겠습니다. 머티리얼 그래프가 복잡해질수록 노드를 정리하고 로직을 명확히 유지하는 것이 팀 협업은 물론이고 개발하는 동안 스스로의 이해를 돕는 데에도 유용합니다. 그래프를 정리하기 위해 코멘트 박스를 사용하여 시각적인 경계와 헤더를 생성할 수 있습니다.
코멘트 박스를 생성하려면 다음 단계를 따릅니다.
Texture Coordinate 및 Multiply 노드를 선택합니다. Q 키를 눌러 노드를 가로로 정렬합니다.
Texture Coordinate, Multiply, Constant를 선택하고 C 키를 눌러 코멘트를 추가합니다.
코멘트 박스 제목을
UV Tiling으로 변경합니다.머티리얼을 저장합니다.
흰색 커넥터 스플라인을 정리하려면 더블클릭하여 중단점을 추가합니다. Q 키를 눌러 표현식 또는 중단점을 가로로 정렬합니다.
이제 머티리얼 그래프가 다음과 같은 모습이 됩니다.
Constant3Vector를 통한 프로퍼티 제어
이제 Constant에 익숙해졌으므로 Constant3Vector를 사용할 준비가 되었습니다. 벡터 변수처럼 Constant3Vector는 하나가 아닌 세 개의 플로트 값을 저장할 수 있습니다. 이는 XYZ 좌표나 RGB 정보를 조정할 때 유용합니다.
이 섹션에서는 Constant3Vector를 사용하여 RGB 컬러를 설정합니다. Multiply 노드를 사용하여 해당 컬러를 디퓨즈 맵과 결합하고, 변경사항이 유지되는 방식으로 색조를 변경합니다.
디퓨즈 맵의 색조를 변경하려면 다음 단계를 따릅니다.
머티리얼 그래프에서 Diffuse Texture Sample 노드의 RGB 출력에서 드래그하여 선택 메뉴에서 Multiply 노드를 생성합니다.
Multiply 노드의 출력에서 드래그하여 머티리얼 루트 노드의 베이스 컬러 입력에 연결합니다.
Multiply 노드의 B 출력에서 드래그하여 Constant3Vector 노드를 생성합니다.
Constant3Vector 노드의 컬러 박스를 더블클릭하여 컬러 피커를 열고 컬러를 선택하거나 16진수 sRGB 값
CDDAFFFF를 입력합니다.Constant3Vector와 Multiply 노드를 선택하고 C 키를 눌러
Diffuse Hue라는 코멘트 박스를 생성합니다.머티리얼을 저장합니다.
이제 머티리얼 그래프가 다음과 같은 모습이 됩니다.
이제 부모 머티리얼이 완성되었습니다. 다음 섹션에서는 머티리얼 계층구조와 변경사항을 인스턴스로 전파하는 방법을 더 자세히 살펴봅니다.
스태틱 값과 파라미터
지금까지는 스태틱 값만 사용하여 작업해 왔습니다. 스태틱 값은 컴파일 타임에 설정되며 런타임에서는 변경할 수 없습니다. 다음 섹션에서는 스태틱 값을 파라미터로 변환하는 방법을 배웁니다. 파라미터는 블루프린트를 통해 런타임에서 수정할 수 있습니다.
전파 계층구조를 기억하고 계실 것입니다. 다른 프로퍼티와 마찬가지로, 파라미터는 부모에서 자손으로 전파됩니다.
다른 프로퍼티와 달리 파라미터는 자손 머티리얼 인스턴스에서 오버라이드할 수 있습니다. MI_DefaultColorway의 베이스 컬러를 변경할 때 이미 파라미터를 사용해 보았습니다.
이를 노출하는(exposing) 또는 노출된(exposed) 파라미터라고도 합니다.
스태틱 값을 파라미터로 변환
부모 머티리얼은 모든 자손 인스턴스를 위한 유연한 기반을 제공합니다. 프로퍼티를 노출할 때는 해당 머티리얼이 다양한 에셋에서 어떻게 사용될지를 고려하는 것이 좋습니다. 이 경우 M_Surfaces를 사용하여 세 가지 게임 에셋의 표면을 처리합니다.
세트 드레싱
바닥
바닥의 젖은/마른 상태 표현(다음 튜토리얼)
세트 드레싱(set dressing) 또는 세트 데코레이션(set decoration(은 영화 용어로, 플레이어가 인터랙션할 수 없는 레벨 내 스태틱 에셋을 가리킵니다.
이러한 용도를 염두에 두고, 다음을 제어하는 Constant를 변환해야 합니다.
UV 타일링
디퓨즈 맵
디퓨즈 색조
노멀 맵
Roughness
표현식을 파라미터로 변환하려면 다음 단계를 따릅니다.
M_Surfaces의 머티리얼 그래프에서 UV Tiling에 있는 Constant를 선택합니다.노드를 우클릭하고 파라미터로 변환(Convert to Parameter)을 선택합니다.
파라미터에는 변경하는 값과 관련성이 있고 식별 가능한 이름을 지으세요. 이 경우 파라미터 이름은
UV Tiling입니다.러프니스 프로퍼티에 어태치된 Constant를 선택하여 우클릭하고 파라미터로 변환을 선택합니다.
새 파라미터 이름을
Roughness로 짓습니다.디퓨즈 색조를 제어하는 Constant3Vector를 선택하고 벡터 파라미터로 변환한 다음 이름을
Diffuse Hue로 변경합니다.디퓨즈 TextureSample을 선택하고 파라미터로 변환한 다음 이름을
Diffuse로 변경합니다.노멀 TextureSample을 선택하고 파라미터로 변환한 다음 이름을
Normal로 변경합니다.머티리얼을 저장합니다.
이제 머티리얼 그래프가 다음과 같은 모습이 됩니다.
다음으로는, 게임 에셋의 표면을 처리하기 위해 머티리얼 인스턴스를 생성해 보겠습니다.
머티리얼 인스턴스 생성
이 섹션에서 표면을 처리할 각 에셋(바닥과 세트 드레싱)마다 머티리얼 인스턴스를 하나씩 생성해 보겠습니다.
머티리얼 인스턴스를 생성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서
M_Surface를 우클릭하고 머티리얼 인스턴스 생성(Create Material Instance)을 선택합니다.이름을
MI_Surfaces_Floor로 짓습니다.두 번째 머티리얼 인스턴스를 생성하고 이름을
MI_Surfaces_Tile로 짓습니다.MI_Surfaces_Floor를 더블클릭하여 머티리얼 인스턴스 에디터를 엽니다.
M_Surfaces에서 노출한 파라미터가 이제 이 자손 인스턴스의 디테일 패널에 그룹화되어 표시되는 것을 확인할 수 있습니다.
다음으로는, 레벨의 메시에 이 인스턴스를 적용하고 노출한 프로퍼티를 조정해 보겠습니다.
머티리얼 인스턴스 오버라이드
이 섹션에서는 Lvl_Adventure의 Hallway 2에 있는 바닥 메시에 MI_Surfaces_Floor를 적용합니다.
바닥에 이 인스턴스를 적용하려면 다음 단계를 따릅니다.
아웃라이너에서 Hallway2 폴더를 찾고 이름에
Floor가 포함된 아이템을 모두 선택합니다.디테일 패널의 머티리얼 카테고리에서 엘리먼트 0 옆에 있는
MI_ProcGrid를MI_Surfaces_Floor로 대체합니다.
잠시 바닥을 자세히 살펴보세요. 바닥 메시 전체에서 반복되는 텍스처가 보입니다. 프로젝트에 따라 눈에 띄는 반복되는 항목은 바람직하지 않을 수 있습니다.
텍스처 블렌딩, 디스턴스 블렌딩, 텍스처 바밍(bombing), 데칼 등 타일링 문제를 감추는 방법은 다양합니다. 이 튜토리얼에서는 텍스처 해상도가 충분하므로 스케일 업해도 괜찮습니다.
인스턴스에서 UV를 스케일 업하려면 다음 단계를 따릅니다.
MI_Surface_Floor의 디테일 패널에서 글로벌 스칼라 파라미터 값(Global Scalar Parameter Values) 아래 UV Tiling을 체크하고 값을0.2로 설정합니다.머티리얼 인스턴스를 저장합니다.
UV를 스케일 업하면 바닥의 타일 반복이 눈에 덜 띄고, 플레이어 캐릭터와 비교했을 때 타일 크기가 적절해지며, 플레이어 시점에서도 텍스처가 선명하게 유지되고, 레벨의 넓은 영역의 표면을 처리할 수 있습니다. 고해상도 텍스처에 불필요한 리소스를 사용하지 않고도 이 같은 결과를 얻을 수 있었습니다.
머티리얼 인스턴스 재사용
석재로 만들어진 다른 에셋의 표면을 빠르게 처리해야 한다고 가정해 보겠습니다. 프로퍼티를 오버라이드하면 부모 머티리얼을 재사용하여 비용을 거의 들이지 않고도 고유한 에셋을 생성할 수 있습니다. 이 경우에는 세트 데코레이션으로 석재 바닥 머티리얼을 쌓아 올린 구조물을 제작합니다.
바닥 타일 메시를 생성하려면 다음 단계를 따릅니다.
언리얼 에디터 툴바에서 추가 > 셰이프 > 큐브를 클릭합니다. 아웃라이너에서 이름을
Tile로 변경합니다.Tile을 선택한 상태에서 디테일 패널에서 스케일(Scale)을
0.5,0.5,0.05로 변경합니다.언리얼 에디터 툴바에서 추가(Add) > 셰이프(Shapes) > 큐브(Cube)를 클릭하고 이름을
Slab으로 짓습니다.Slab을 선택한 상태에서 디테일 패널에서 스케일을
1.5,1.0,0.05로 변경합니다.Tile을 선택한 상태에서 Alt 키를 누른 채 뷰포트에서 드래그하여 스태틱 메시를 복제합니다. Slab에도 동일하게 적용합니다. 이러한 에셋을 원하는 대로 배치합니다.
타일이 바닥과 대비되어 은은하게 눈에 띄도록 하려면 다음 단계를 따릅니다.
M_Surfaces_Tile을 더블클릭하여 엽니다. 디테일 패널에서 UV Tiling을 체크한 후 값을0.2로 설정하여 바닥 메시와 동일하게 맞춥니다.글로벌 벡터 파라미터 값(Global Vector Parameter Values) 아래에서 Diffuse Hue를 체크하고 16진수 sRGB 값을
A5AEC9FF로 설정합니다.인스턴스를 저장합니다.
아웃라이너에서 Tile의 모든 인스턴스를 선택합니다. 디테일 패널의 머티리얼(Materials) > 엘리먼트 0(Element 0)에서
MI_Surfaces_Tile을 추가합니다.Slab의 모든 인스턴스를 선택하고
MI_Surfaces_Tile을 적용합니다.
자세히 보면 문제가 있는 것을 확인할 수 있을 것입니다. Tile의 해상도는 바닥 메시와 비슷하지만, Slab의 스케일을 조절하면 UV도 메시와 함께 균등하게 또는 비균등하게 스케일 조절됩니다. 이로 인해 석재 머티리얼이 스트레치되어 왜곡된 것처럼 보입니다. 이 현상은 특히 메시의 측면에서 더 두드러집니다.
프로젝트에 따라서는 다양한 에셋 전반에서 머티리얼 해상도가 왜곡되거나 스트레치된 것처럼 보이지 않고 일관된 스케일로 보이도록 하는 것이 바람직할 수 있습니다.
개발 환경에서는 메시 지오메트리 조정, UV 매핑 수정 또는 트라이플레이너 프로젝션(메시의 XYZ 축을 따라 머티리얼을 균일하게 적용하는 방식)을 사용하여 이 문제를 해결할 수 있습니다.
이 예시에서는 M_Surfaces에서 상속받은 텍스처 맵을 오버라이드하여 세트 드레싱에 새로운 룩을 만듭니다.
MI_Surfaces_Tile의 디테일 패널에서 UV Tiling 옆의 값을1로 설정합니다.Diffuse를 체크하고
Gray를 검색합니다.Normal을 체크하고
T_Base_Tile_Normal을 검색합니다.Diffuse Hue 옆에 16진수 sRGB 값
D0CECBFF를 입력합니다.인스턴스를 저장합니다.
이제 세트 드레싱과 바닥이 완료되었습니다.
실제 개발 환경에서는 세트 드레싱을 보다 효율적으로 제작하는 방식을 사용할 가능성이 높습니다. 예를 들어 지오메트리를 절약하기 위해 느슨하게 놓인 바닥 타일을 바닥 메시의 일부로 포함할 수도 있습니다.
이제 유연한 부모 머티리얼과 두 개의 고유한 머티리얼 인스턴스를 생성했습니다. 또한 이 과정에서 다음과 같은 내용도 배웠습니다.
리소스 할당 관리: 리소스를 신중하게 할당하면 중요한 게임 에셋에 더 많은 리소스를 투입할 수 있습니다.
에디터 내 에셋 정리: 정리 방식과 명명 규칙은 팀에서 수백 개의 에셋을 다룰 때 발생할 수 있는 혼란을 방지합니다.
모듈형 워크플로 구축: 변경사항이 유지되고 모듈형으로 구성된 워크플로는 반복적이거나 시간이 많이 드는 작업을 줄여주며, 개발 일정이 촉박할 때 특히 중요합니다.
예술적인 선택과 기술적 제약의 균형: 게임 개발은 기술적인 한계를 창의적으로 넘어서고, 예술적인 룩 앤 필을 최소한으로 희생하는 절충안을 찾는 과정인 경우가 많습니다.
다음 순서
다음 튜토리얼에서는 트라이플레이너 프로젝션, 스태틱 스위치로 전파 계층구조를 끊는 방법, 그리고 레벨 내 플레이어의 액션에 따라 블루프린트로 머티리얼을 제어하는 방법을 배웁니다.