본문 바로가기
툰렌더링 공부

언리얼 엔진 뜯어보기 #1

by IX. 2023. 3. 14.

3.14

시작은 셀프쉐도우였다. 난 그림을 그리는 방식대로 다리 윗부분에 드리워지는 치마의 그림자 혹은 얼굴을 반쯤 가리는 커다란 챙모자의 그림자를 그리고 싶었다.

유니티는 커스텀 노드로 이를 구현할 수 있다. 캐스트 셰도우의 원리는 라이팅의 벡터가 면에 닿으면 흰색으로 칠해지는 것이다. 편의상 그림자라 부르고 있지만 사실 밝은 부분을 하얗게 칠하는 것이다. 엔진은 매프레임 셰도우 맵에 이걸 그려서 건네주고 셰이더에선 이를 합성해 쓴다. 하지만 언리얼에선 이를 커스텀 노드를 통해 가져올 수가 없다. 엔진을 뜯어야 한다.

 

이 때문에 프로젝트 내부에선 협업 중인 마둠파님께 부탁해서 스타일라이즈-릿이란 이름의 셰이더모델을 전해받은 적이 있다. 

왼쪽이 Unlit기반, 오른쪽이 의뢰해 받은 Stylized Lit

이 자체로 훌륭한 셰이더지만, 이는 프로젝트에 맞게 포워드 셰이딩을 기초로 작성되어 있다. 추후 루멘을 활용한 프로젝트에 활용하기 위해선 디퍼드 셰이딩을 기준으로 작성되어야 한다. 뿐만 아니라 NPR은 일반적인 물리법칙과는 어긋나는 요소들이 상당히 많기 때문에 외부의 협업에 기댈 수만은 없다. 수정이 잦다. 스스로 해야 한다.

 

매트호프만의 블로그글은 내가 찾은 오래되고 유일한 관련글이었다. 

Matt Hoffman – Medium

 

Matt Hoffman – Medium

Read writing from Matt Hoffman on Medium. Every day, Matt Hoffman and thousands of other voices read, write, and share important stories on Medium.

medium.com

언리얼 5가 나온 시점에서도 공유되는 항목들이 많긴 하지만, 이것만으로는 뭔가 부족하다. 본문엔 열거형에 항목을 추가하는 것만으로도 셰이더 모델을 추가할 수 있다고 나와있지만 실제로는 그렇지 않았다.

 

일단 본문에 적힌대로 EngineTypes.h에 리스트를 추가해 주자.

TestLit으로 만들 생각이다.

이후 디버그 빌드를 해봤자... 목록엔 뜨지 않는다. 뭔가 더해주어야 한다.

 

3.16

일단 .h와 .cpp에 셰이딩모델과 관련된 정보들을 공부해가며 코드를 추가.

그리고 빌드.

엔진 전체를 빌드해야 해서 인내가 필요하다.
4시간이 지났다.

빌드는 끝났지만, 아직 셰이더 헤더와 파일이 없어서인지 목록엔 나오지 않는다.

내일은 이걸 만들어보기로 하자.

3.17

.h와 .cpp는 냅두고 usf와 ush에 코드를 추가했다. 오! 셰이더 재컴파일을 하는 것이 느낌이 좋다.

하지말 실패...! 다시 도전해보자.

 

3.20

엔진컴파일이 SSD에서 더 빠르다는 말을 듣고 이사 중.

저..저.. 파일명 보니 아무래도 임시파일 옮기는 거 같은데 쓰레기는 좀 버리고 가지.

3.21

툴을 배울 때 가장 골치아픈 것들은 예제는 되는데 내 껀 안될 때!

알고보면 아주 사소한 실수. 하지만 그걸 알기까지 숱한 시간을 버릴 수밖에는 없다.

 

오늘도 셰이더 컴파일과 싸우고 있다.며칠 째더라.

엔진을 SSD로 옮기고 새로운 집에서 다시 컴파일.

얼마나 단축됐을까!~

그리 빠르지 않았다고 합니다... 근데 왜 빌드양이 늘었지..?

또 실패. 이쯤 되면 엔진을 잘못연결한 게 아닌가?! 싶은 의문

 

3.22

성공적으로 빌드가 된 셰이딩모델의 열거형의 이름을 바꿔서 테스트를 해보았는데, 바뀌지 않았다. 그러고보니 중간에 엔진빌드가 실패했다는 메세지가 떴었는데 Yes를 누르니 넘어가길래 '아, 그냥 되나보다' 싶었지... 그런데 그게 함정이었던 것 같다. 

안되면 될 때까지!

 

3.23

팀 프로그래분의 도움을 받아 성공했다.마참내! 테스트 릿을 끼워넣었다.

원인은 앞서 말한 매트 호프만의 블로그에 기술된 최적화 코드였다.  언리얼 5와는 맞지 않았던 것이다.

결국 처음부터 순정으로 썼으면 될 걸, 괜히 좀 더 빠르게 하겠다고 어줍잖게 코드를 건드린 것이 원인이었던 것.

(생각해보니 끼워넣을 때부터 '이게 맞나?'싶을 정도로 주변 문법과 다르긴 했다.)

 

의문이 하나 생겼다. 그럼 처음 의도했던대로, 열거형을 추가하는 것만으로도 리스트에 셰이더 모델을 추가할 수 있지 않을까?

그리고 또 컴파일. 결과는 내일

...일 줄 알았는데 퇴근전에 어찌 끝남.

오.. 잘 된다!