주의! 본 정리 글은 '클래스 101'의 '언리얼 엔진 중급, 영화 퀄리티의 3D 메타버스를 창조해요.' 강의를 수강하고 정리한 글입니다. 해당 글은 아래 원칙 하에 작성되었습니다.
1. 강의에서 다룬 내용 기재를 최소화하고, 강의 흐름에 맞게 개인적으로 학습하는 과정을 기록한다.
2. 강의에서 제공하는 자료를 첨부하지 않는다.
3. 내용을 보충할 자료가 필요한 경우, 직접 제작한 자료를 사용한다.
(2023.06.01 추가)
클래스 101 문의 결과 저작권 문제없다는 답변받았습니다.
(2023.06.02 추가)
언리얼 엔진 중급, 영화 퀄리티의 3D 메타버스를 창조해요. | RYU Russell 러셀
언리얼 엔진 5 가 정식 출시되었습니다! 언리얼 엔진 5는 기존 언리얼 엔진 사용자들을 위해 언리얼 엔진 4와 호환되도록 제작되었으며, 언리얼 엔진 4 사용자라면 쉽게 즉시 언리얼 엔진 5를 사
class101.net
들어가며
지난 [게임 엔진/언리얼] - [RYU Russell, 언리얼 엔진 중급 클래스] 배운 내용 정리 (1) 글에 이은 2번째 정리 글이다.
정리는 지난번과 마찬가지로 단순하게 강의에서 '어떤 것을 가르쳤고, 어떻게 진행을 했느냐'에 초점을 맞추기보다는 어떤 것을 알게 되었는데, 무엇을 해서 어떻게 이해했는가'에 집중하여 진행할 예정이다.
오늘 정리할 내용은 'Chapter 3. 환경을 알차게 채우는 다양한 기법들'이다. 이번 글을 통해 아래와 같은 내용을 정리할 예정이다. 중간중간 추가할 내용도 있고, 뺄 내용도 있어서 '이런 내용들이 있구나' 정도로 이해하면 좋을 것 같다.
- Prop(사물)들을 환경에 어울리게 배치하는 방법 : PDO, Foliage mode
- Light Function을 통해 구름 그림자를 저렴하게 표현하는 방법 : Light Function Material
- 반투명 머티리얼로 안개를 표현하는 방법 : Translucent Blend Mode, Depth Fade, Shader Complexity
- Cine Camera로 화면 구성하는 방법 : Current Aperture 설정, Focus Distance 설정, 반투명 오브젝트 DOF 적용, 스크린샷
Prop들을 환경에 어울리게 배치하는 방법
Pixel Depth Offset
강의를 듣다가 흙 무더기 3D 에셋을 배치할 일이 생겼다. 이때 Pixel Depth Offset 블렌딩, 줄여서 PDO 블렌딩을 통해서 자연스럽게 어울리도록 만들 수 있다는 말씀을 하셨다.
PDO 블렌딩을 위해 아래와 같이 구성을 했는데 추가한 노드는 다음과 같다.
- SetMaterialAttibutes : 머티리얼의 속성 중에 하나를 선택하여 값을 바꿔줄 수 있다. 아래에서는 Pixel Depth Offset을 가져왔다.
- Dither Temporal AA : Dither Temporal AA의 'AA'는 Anti-Aliasing의 약자이다. Anti-Aliasing에 대한 설명은 Unity 공식 문서(언리얼 정리 문서에 유니티 공식 문서를 가져오는 나..)를 통해 알아보자. 간단히 설명하면 모델의 경계면을 더 부드럽게 표현하기 위한 기술인데, Dither Temporal AA 노드를 통해 이게 가능하다고 한다.
Dither Temporal AA 노드에 대해서 조금 더 알아보자. 러셀님이 이렇게 하면 경계면이 흐려져서 자연스럽게 어울릴 수 있다고 하셨는데 어떤 원리로 이렇게 되는 건지 궁금했다. 찾아보니까 Dither Temporal AA 노드는 반투명 머티리얼에서 효과적으로 사용된다고 하는데, 아래 영상을 보니까 픽셀을 몇 개씩 없애서 자연스럽게 섞이도록 보이게 하는 것 같다.
이 원리가 신기해서 이것저것 테스트해봤는데 결론은 안 나오고 이상한 삽질만 했다 ㅋㅋㅋ 삽질 내용은 생략하자. 애초에 전제부터 잘못 생각했던 것 같다 ㅋㅋ
아무튼 제대로 확인된 것만 적자면, 아래 테스트는 왼쪽에는 PDO Blending 값이 0일 때, 가운데는 100일 때, 오른쪽은 10000일 때이다. 오른쪽으로 갈수록 구멍 같은 게 더 많이 생기는 걸 확인할 수 있었다. 저 검은색으로 바뀌는 건 왜 저렇게 되는지 모르겠다..
아무튼 이런 원리로 경계면을 흐리게 만들어서 다른 오브젝트와 자연스럽게 연결하겠다는 이야기인데 실제로 적용해보면 다음과 같다. 확인해보면 오른쪽이 확실히 자연스러운 것을 알 수 있다. 이 것도 오른쪽이 검게 탔는데 이유를 알아봐야 될 것 같다. PDO Blending 값이 너무 커지면 검은색으로 지지직거리는 노이즈를 확인할 수 있는데 이거랑 연관 있는 것 같다.
PDO Blending 구성 환경은 아래와 같다.
Foliage Mode
강의에서는 쓰레기를 배치할 때 Foliage Mode를 통해 배치했는데, 쉽게 말하면 오브젝트들을 그리듯이 배치할 수 있는 모드라고 생각하면 된다. 자세한 내용은 언리얼 엔진 공식 문서의 '폴리지 모드'를 참고하자.
이를 통해 아래와 같이 잔디 오브젝트를 배치하는 등의 단순 배치 작업을 반복하지 않고 손쉽게 해낼 수 있다.
Light Function을 통해 구름 그림자를 저렴하게 표현하는 방법
Light Function Material
머티리얼은 Material Domain을 Light Function으로 바꿔서 빛에 머티리얼을 적용할 수 있다.
이를 통해 빛에 텍스쳐를 적용할 수 있는데 강의에서는 언리얼 로고를 쓰길래 나도 따라서 진행해봤다. 아래와 같이 노드를 구성했고, 테스트를 한 결과 잘 출력되는 걸 확인할 수 있었다.
이를 통해 하늘의 Directional Light에 Noise Texture를 넣어 구름 그림자와 같은 효과를 낼 수 있는데, 우선 아래와 같이 Panner 노드를 추가하여 머티리얼 안에서 텍스쳐가 시간의 흐름에 따라 움직이도록 수정한다.
여기에 아래와 같이 Scalar Parameter로 움직이는 속도를 조절할 수 있게 만들어주고, Append 노드로 합쳐서 연결한다.
추가로 텍스쳐 내에 좌표를 가리키는 Texture Coordinate 노드에 Tiling 값을 가리키는 Scalar Parameter를 Multiply 노드로 곱해줘서 Panner 노드의 Coordinate에 연결함으로써 Noise 텍스쳐의 타일링을 조절할 수 있다.
이렇게 만들어진 결과는 아래와 같다. 왼쪽은 Directional Light로 노을빛을 그냥 비추지만, 오른쪽은 노이즈가 낀 형태로 비추는 것을 확인할 수 있다.
그런데 오른쪽 이미지를 자세히 보면 노이즈가 길쭉하게 나오는 걸 확인할 수 있다. 이게 태양의 역할을 하는 Directional Light의 기울기가 낮아지면서 노이즈가 왜곡되는 것인데, 이를 아래와 같이 월드를 기준으로 맵핑되게 변경하여 구름의 그림자 역할을 하는 노이즈가 왜곡되는 문제를 해결할 수 있다.
이렇게 블루 프린트를 구성한 경우, 입력을 담당하는 노드들을 그룹 짓고 우선순위를 조절하여 보기 편하게 정리할 수 있다. 추후 Material Instance를 만들어서 수정할 수도 있으니 아래와 같이 정리하면 좋다.
반투명 머티리얼로 안개를 표현하는 방법
Translucent Blend Mode
머티리얼에서 Blend Mode를 Translucent로 설정하면 반투명 머티리얼을 만들 수 있다.
이때 위에서 배웠던 Panner 노드를 사용해서 안개의 흐름을 표현했고, SphereMask 노드를 사용해서 가장자리가 흐려 보이도록 설정했다. 노드들을 다양하게 쓰고 있는데 현재는 이렇게 하는 거라고 알려주시니까 할 수 있지만 혼자서는 입력이 어떤 형태여야 하고, 출력은 어떤 형태인지 모르니 추후 언리얼 노드들을 정리하고 글을 작성할 필요성이 느껴진다.
위의 입력 노드들은 우클릭 - Convert to Parmeter를 통해 Parameter로 만들어줬는데 이렇게 해야지 블루 프린트 외부에서 값을 조정할 수 있으며, 값의 변화를 뷰포트에서 바로 확인할 수 있다고 한다.
이렇게 만든 안개는 아래와 같다.
Depth Fade
이렇게 만든 안개는 높이를 낮춰서 다른 오브젝트랑 닿게 되면 선이 눈에 보여 부자연스럽다. 이를 위해 Depth Fade라는 노드를 추가하여 자연스럽게 설정할 수 있다. 자세한 내용은 언리얼 엔진 공식 문서의 'Depth 표현식'을 확인하자.
위의 이미지에서 우측 하단에 Depth Fade를 확인할 수 있는데 이를 이용하면 아래와 같이 경계면이 흐려져 자연스럽게 보이게 된다.
블루 프린트의 좌측 하단은 노이즈의 대비를 낮춘 텍스쳐를 가져와서 빈 곳을 채워 자연스럽게 보여주기 위한 부분이다. 강의에서 러셀님은 미리 보정한 텍스쳐를 가져오면 프로젝트 용량이 증가하기는 하지만 플레이 시 연산 비용이 줄어든다고 소개했다. 추후 게임의 용량은 상관없지만 플레이 성능을 최적화해야 하는 경우가 생기면 한 번 다시 살펴볼 가치가 있어 보인다.
이 블루프린트도 마찬가지로 Group으로 정리를 했고, 평면에 머티리얼을 넣는 경우 반대쪽에서 안 보이는 문제를 해결하기 위해 Two sided 설정을 활성화하는 등의 과정을 거쳐 안개를 완성했다.
Shader Complexity
언리얼에서는 만든 레벨을 뷰 모드에서 Shader Complexity로 셰이더 복잡도를 확인할 수 있다. 이는 씬의 각 픽셀 계산에 사용되는 연산 과정 수를 시각화하는 뷰 모드이다. 자세한 설명은 언리얼 엔진 공식 문서의 '뷰포트 모드'를 참고하자.
Translucent Material은 연산 비용이 비싸다고 하는데 Shader Complexity view mode로 한 번 확인해봤다.
겹쳐질수록 복잡해지는 걸 확인할 수 있었다. 러셀님도 Translucent Material, 즉 반투명 머티리얼은 되도록 겹치면 연산 복잡도가 커지니 가능하면 겹치는 일이 없도록 하라고 말씀하셨다. 이렇게 반투명 머티리얼로 안개를 표현하는 방법을 정리해봤다.
Cine Camera로 화면 구성하는 방법
Cine Camera 조정
Cine Camera는 다양한 값을 수정하여 카메라를 조정할 수 있다. Current Focal Length 값을 수정하여 시야각을 조절하거나, 피사계 심도(Depth of Field, 이하 DOF)를 수정하여 초점을 조절할 수 있고, 이때 Current Aperture 값을 0에 가깝게 수정하여 초점 외의 시야를 더 흐리게 만들 수도 있다. Current Aperture 값은 처음에 1.2 미만으로 내려가지 않는데 이는 Lens Setting의 Min F Stop이 1.2라서 그렇다. Min F Stop을 0으로 설정하면 더 낮춰줄 수 있다. 다만 0이 되면 DOF가 비활성화되기에 DOF를 사용하려면 0이 아닌 작은 값을 입력해야 한다.
Manual Focal Distance의 경우, 초점 거리를 나타내는데 값 우측의 스포이드를 누른 뒤 뷰 포트에서 원하는 물체를 선택해서 해당 물체에 초점을 맞출 수 있다. 만약 잘 안 맞춰지는 경우, 직접 조정해가며 초점을 맞출 수도 있다.
이 외에 Filmback을 설정하여 레벨에 다른 영화나 모바일과 같은 느낌을 줄 수 있다. Filmback은 쉽게 말하면 영상의 베젤 크기를 조정하는 부분이라고 생각하면 되는데 어떻게 설정하느냐에 따라 다른 느낌을 줄 수 있다.
이전 항목에서 만든 안개는 Translucent Material이기에 기본 설정이 DOF에 영향을 받지 않게 되어 있다. 그 이유는 일반적으로 Translucent Material이 이펙트나 UI에 많이 사용되기 때문이다. 따라서 Translucent Material의 Master Material로 들어가서 Translucency - Advanced - Translucency Pass를 After DOF에서 Before DOF로 변경하여 Translucent Material도 DOF가 적용되도록 변경할 수 있다.
이렇게 Translucent Material에 DOF를 적용하기 전 후의 이미지는 아래에서 확인할 수 있다.
또한 Sky System 블루 프린트에서 만들었던 PostPocess에서 내부 값을 조정하여 색 다른 연출을 할 수도 있다. 나는 지금이 가장 예쁜 것 같아서 별 다른 변화를 주지 않았다.
이렇게 만든 레벨은 High Resolution Screenshot을 통해 캡처할 수 있는데 러셀님은 이게 뷰포트 해상도를 따르기 때문에 원하는 해상도로 출력하기 어렵다고 말씀하셨다. 따라서 이에 대한 대안으로 키보드에서 ~을 누른 뒤 'Highresshot 해상도 크기'를 입력하면 원하는 해상도의 스크린샷을 찍을 수 있다고 한다.
해당 명령어로 캡처한 이미지는 아래와 같다.
후기
아직까지는 정리하는 게 조금 힘들다. 분명 도움은 되는데 다시 생각하고, 자료 찾아보고, 테스트해보고, 정리하면 시간이 많이 걸린다. 이번도 어떻게든 꾸역꾸역 쓰기는 했는데 글을 분리하는 등의 적당한 대안이 필요해 보인다.
이번은 전과 달리 Word가 아니라 노트에 직접 적으며 정리했는데 모니터가 2개밖에 없다 보니 이게 더 편리한 것 같다. 전에는 메인에 강의 영상, 다른 모니터에 Word랑 Unreal 번갈아가며 띄워서 힘들었는데 노트에다 정리하니 훨씬 깔끔하게 작업할 수 있었다. 그래도 모니터가 하나 더 있으면 좋을 것 같긴 하다. 조만간 모니터를 하나 더 사던가 해야지..
그리고 지금 일이 이것저것 많이 남아있다. 내가 생각한 휴학 생활은 이게 아닌데.. 여유로운 삶은 어디 갔을까.. 욕심부리지 말고 멘탈 관리랑 시간 관리하자.
아무튼 언리얼 후기 글에 잡설이 길었는데 이번 정리를 통해 블루 프린트 개념에 대해 조금 더 깊게 알 수 있었다. 위에서 언급한 대로 나중에 어떤 노드들이 있고 어떻게 동작하는지 정리해보면 좋을 것 같다.
다음은 블루 프린트를 활용한 환경 디자인이다. 이번에는 조금 천천히 정리할 예정이다!
'개발 > 언리얼' 카테고리의 다른 글
[Blueprint] 데미지 처리와 콜리전 채널 (0) | 2023.12.25 |
---|---|
[Blueprint] 기묘한 For Loop와 Delay의 관계 (0) | 2023.12.24 |
[RYU Russell, 언리얼 엔진 중급 클래스] 배운 내용 정리 (4) [完] (1) | 2022.08.16 |
[RYU Russell, 언리얼 엔진 중급 클래스] 배운 내용 정리 (3) (0) | 2022.08.03 |
[RYU Russell, 언리얼 엔진 중급 클래스] 배운 내용 정리 (1) (0) | 2022.07.08 |