이번 에는 머티리얼을 효과적으로 관리하는 방법에 대해 살펴보겠다. 지난 글에 만든 머티리얼과 내용은 동일하지만, 다른 색상과 눈빛(!)을 가진 재질을 만들고 싶다면 예전에 한 방식대로 Ctrl+W키를 눌러 복제하고 여기서 색상, 텍스쳐 노드의 정보를 변경하면 1차적으로 해결은 가능하다. 하지만 기존에 만든 머티리얼을 기능을 추가해 더 복잡하게 업그레이드 했다면, 복제된 머티리얼도 일일히 변경해야 하는 번거로운 작업이 발생하게 된다.
이러한 노가다(?)를 미연에 방지하기 위해 언리얼 엔진에서는 머티리얼 인스턴스라는 시스템을 제공한다. 머티리얼 인스턴스는 기본 머티리얼에 사용했던 색상, 숫자, 텍스쳐 노드를 파라미터 노드로 대체해, 관리를 2원화 하는 방식이다. 머티리얼 원본 제작자는 기본 머티리얼의 설계에 집중하고, 이를 사용하는 작업자는 원본 제작자가 지정한 파라미터 값만 변경하면 내부 머티리얼이 어떻게 연결되 제작되는지 몰라도 다양한 효과를 표현할 수 있게 된다. 사전에 설명이 길었는데 직접 머티리얼 인스턴스를 제작해보자.
먼저 지난 번에 작업한 M_ToyCow 머티리얼을 열고 배경 색상에 사용했던 노드를 선택하자. 노드를 오른쪽 클릭하면 상단에 파라미터로 변환이라는 메뉴가 보인다. 이를 선택한다.
[그림] 파라미터로 변환 메뉴
파라미터로 변환 메뉴를 누르면 큼지막하게 노드로 변경되는데, 이 노드가 앞으로 작업자들이 값을 변경할 수 있는 노드가 된다. 작업자들이 알아볼 수 있도록 이름을 배경색상으로 바꾸고 그룹을 몸통이라는 이름으로 지정하자. 그룹을 지정할 때에는 그냥 이름을 드롭다운 창에서 바로 입력하면 자동으로 생성된다. ( 언리얼 엔진에서는 파일에 해당하는 리소스 이름을 제외한 내부 로직에서 한글을 마음대로 사용할 수 있다. 편한대로 영문 혹은 한글을 병행해 사용하면 된다. 경험상 한글은 파일 이름을 지정할 때에만 주의하시면 된다. )
[그림] 파라미터의 설정
이렇게 머티리얼에 파라미터 노드를 추가하면 머티리얼 인스턴스에서는 이 파라미터를 사용해 다양한 머티리얼로 변화시킬 수 있다. 콘텐츠 브라우저로 가서 제작한 M_ToyCow 머티리얼을 우클릭하고 머티리얼 인스턴스 생성 버튼을 누르고 M_ToyCow_Inst1으로 저장한다.
[그림] 머티리얼 인스턴스의 생성 메뉴
메뉴를 눌러 생성된 M_ToyCow_Inst1 머티리얼 인스턴스를 더블 클릭하면 복잡한 노드의 구성 없이 우리가 지정한 파라미터 값만 작업자가 체크해서 수정할 수 있도록 별도의 인터페이스가 제공된다.
[그림] 머티리얼 인스턴스 설정 화면
비활성화되어 있는 기본 색상 파라미터를 체크하고 다른 색상으로 설정하면 다른 느낌을 주는 머티리얼을 쉽게 제작할 수 있다. SM_ToyCow 스태틱메시를 배치해 스태틱 메시 액터를 하나 더 추가하고, 새롭게 생성된 머티리얼 인스턴스를 배치하자.
[그림] 머티리얼 인스턴스를 새로운 스태틱 메시 액터에 적용한 결과
같은 방식으로 입 주위의 색상과 줄무늬 텍스쳐, 안광의 색상 및 크기도 파라미터화 시켜 머티리얼 인스턴스를 조절해보자. 파라미터화 시킨 원본 머티리얼 구성은 다음과 같다. 참고로 곱셈노드에는 '1'키를 눌러 스칼라노드를 추가로 연결한 후 이를 파라미터화 해야 한다. 그룹은 한번 수동으로 설정하면 다음 부터는 드롭다운에서 선택이 가능하다.
[그림] 파라미터화한 원본 머티리얼 설계
머티리얼 인스턴스 시스템의 장점은 설계자와 작업자가 완벽하게 분리되어 있기 때문에 기존에 제작한 머티리얼 인스턴스는 원본 머티리얼의 변화를 자동적으로 반영해준다. M_ToyCow_Inst1 머티리얼을 열면 아래와 같이 자동으로 파라미터들이 변화된 것을 확인할 수 있다. 이 값들을 변경해 보다 다양한 장난감 소를 표현해보자.
[그림] 자동으로 변경된 머티리얼 인스턴스 설정
[텍스쳐의 설정]
이번 글의 주제인 머티리얼 인스턴스와는 큰 관련이 없지만, 머티리얼의 완성도가 있게 마무리하기 위해 텍스쳐 설정에 대해서도 작성하고자 한다. 텍스쳐의 용도는 T_ToyCow_C와 같이 데이터 용도로 사용하는 텍스쳐와 풀 나무같이 색상 표현을 위해 사용하는 텍스쳐의 두 가지로 나뉘게 된다. 대부분의 게임 엔진에서 용도에 따라 텍스쳐를 구분하는 것이 중요한데, 이유는 감마 보정(Gamma Correction)이라는 설정때문이다. 머티리얼 에디터에서 색상을 계산할 때는 RGB채널값이 각각 0부터 1까지 균등하다는 설정에 기반하고 있다. 하지만 인간의 눈은 컴퓨터처럼 각 채널 별 값에 따라 균등하게 반응하지 않는다. 실제로 인간의 눈은 녹색에 대해서 좀 더 민감하게 반응하는데, 게다가 대표적인 색상 출력기기인 모니터의 경우 발광한다는 속성으로 인해 비선형적으로 처리하도록 설계되어 있다. 예를 들자면 아래 그림의 파란색 라인이 이상적인 색상 정보라면, 모니터는 위에서 언급한 다양한 이유로 빨간색 커브를 사용해 색을 출력하도록 설계되어 있다. 그래서 파란색 라인을 따르는 정보로 색상을 저장해 바로 모니터에 내보내면 실제 모니터에서는 첫 번째 꽃처럼 어둡게 표현이 된다. 이 문제를 해결하는 좋은 방법은 이미지를 저장할 때 두 번째 꽃과 같이 아예 노란색 라인을 따르는 비선형으로 색상값을 변환해 저장해버리는 것이다. 이렇게 되면 이 이미지는 자동으로 모니터가 사용하는 빨간 라인 수치와 상쇄되어 우리가 딱히 아무짓을 안해도 세 번째 꽃과 같은 올바른 결과가 모니터에 표시된다.
[그림] 감마 보정(Gamma Correction)의 개념
이렇게 비선형적으로 색상을 저장하는 방법은 색상을 다루는 카메라 및 프로그램 제작사 마다 여러가지가 있는데 언리얼 엔진에서 비주얼한 이미지를 저장할 때는 sRGB라는 모델을 사용한다. 따라서 언리얼 엔진에서 비주얼한 텍스쳐 설정에는 항상 sRGB 옵션이 켜져 있다.
[그림] 비주얼한 텍스쳐 설정에 항상 켜져 있는 sRGB 옵션
하지만 앞서 사용한 T_ToyCow_C이미지의 경우 비주얼한 용도와는 전혀 상관 없이 Lerp 함수를 계산하는데에만 사용이 된다. 이러한 경우에는 굳이 sRGB를 사용해 데이터를 왜곡 시킬 필요가 전혀 없다. 이를 위해 언리얼이 제공하는 옵션이 Mask 설정이다. 텍스쳐 메뉴에서 이를 변경하면 자동으로 sRGB 옵션이 변경되는 것을 볼 수 있다.
[그림] 텍스쳐의 설정 변경
하지만 머티리얼에서 처음 텍스쳐 노드를 사용할 때 sRGB로 변환된 비주얼한 텍스쳐를 쓴다고 했기 때문에, 텍스쳐 설정을 변경하고 머티리얼 에디터로 돌아가면 텍스쳐 노드에 에러가 나있음을 확인할 수 있다. 이는 텍스쳐 타입이 Color로 지정되어 있기 때문에 그렇다. 텍스쳐 노드를 선택하고 용도를 Mask로 변경하면 해당 에러를 수정할 수 있으며, 이제는 보다 데이터의 왜곡 없이 정확하게 영역을 구분할 수 있도록 머티리얼이 업그레이드되었다.
[그림] 텍스쳐 노드의 타입 변경
컴퓨터 그래픽에서는 데이터로 사용하는 이미지 중 대표적인 것에 노멀맵(Normal Map)이있다. 이는 텍스쳐에 매핑된는 각 픽셀 영역에서 노멀(Normal)이라 불리는 면이 향하는 방향 정보를 텍스쳐 데이터에 담긴 데이터로 변환해 실제로 평평한 지형이 울퉁불퉁하게 빛과 반응하도록 처리하는 대표적인 기법이다. 컴퓨터 그래픽 처리의 핵심을 담당하는 그래픽 카드 GPU는 매우 빠르게 텍스쳐를 처리할 수 있기 때문에 이렇게 이미지에 데이터를 담아 보내도록 고안한 것이다. 아래 이미지는 노멀맵을 사용할 때와 안할 때의 차이를 보여주는 예시다.
[그림] 노멀맵의 사용 전후 비교. 아래가 노멀맵을 사용한 결과
이제 장난감소 머티리얼에 T_ToyCow_N 텍스쳐를 추가해 머티리얼을 최종 완성하다. 노멀맵은 언리얼 엔진이 ( 100%는 완벽하지 않지만 ) 자동으로 파악해 노멀맵으로 설정하며, 이 텍스쳐는 노멀 출력핀에 연결하면 된다. 그리고 위의 설명을 이해했다면 당연한 이야기겠지만, 노멀맵이라는 것은 비주얼이 아니라 데이터이므로 모든 노멀맵 텍스쳐 설정에 sRGB 옵션은 항상 꺼져 있다.
[그림] 노멀맵을 연결한 결과. 미리보기 결과가 울퉁불퉁하게 변한 것을 볼 수 있다.
참고자료의 출처: http://cafe.naver.com/unrealenginekr/13056
댓글 없음:
댓글 쓰기