메테리얼
메테리얼은 씬에서 오브젝트의 표면 프로퍼티를 정의한다.(색, 반사, 러프니스, 투명도..)
구체적으로, 씬의 라이트와 어떻게 상호작용 해야 하는지 엔진에 정확히 알려주는 역할
렌더링 파이프라인에서 셰이더는 각 버텍스나 픽셀이 렌더링되는 방법을 정의하는 프로그램이다.
언리얼 엔진에서 셰이더는 HLSL(High Level Shading Launguage)로 작성된다. 이후 셰이더 코드는 어셈블리 언어로 변환되어 그래픽 카드로 이동하여 연산하게 된다.
언리얼에선 HLSL코드를 작성할 필요 없이, 메테리얼 에디터로 비주얼 스크립팅하여 메테리얼 에셋을 생성한다.
메테리얼 에디터에서 창 -> 셰이더 코드 -> HLSL 코드를 선택하여 HLSL 코드를 볼 수 있다.(읽기 전용)
커스텀 메테리얼 노드는 이 HLSL를 직접 작성함으로써 생성할 수 있다.
메인 메테리얼 노드를 선택하면 디테일 패널에 글로벌 메테리얼 프로퍼티 및 세팅이 표시된다.
다음 세가지 프로퍼티는 메테리얼의 토대를 형성하고 사용방법을 결정하므로, 메테리얼 제작 과정의 초기 단계에서 중요하다.
Material Domain
프로젝트에서 메테리얼의 용도를 정의한다.
Blend Mode
메테리얼이 픽셀과 블렌딩되는 방식을 정의한다. 예를 들어 불투명(Opaque)셰이더는 뒤 오브젝트를 완전히 가리지만, 반투명(Translucent)와 애디티브(Additive) 셰이더는 특정한 방식으로 배경과 블렌딩된다.
ShadingModel
메테리얼이 라이팅과 상호작용하는 방식을 정의한다. 메테리얼엔 보통 기본 라이팅 포함(Lit)셰이딩 모델을 사용하는 경우가 많지만, 언리얼 엔진에서 Hair, Cloth, Skin 등을 위한 구체적인 셰이딩 모델이 제공한다.
이 프로퍼티들은 메인 메테리얼 노드에서 어떤 입력이 활성화되는지 결정한다. 불투명(Opaque)은 Opacity입력이 비활성화되지만, 반투명(Translucent)를 선택하면 오파시티 입력이 활성화되고, 다른 활성화 입력 중 일부가 비활성화된다.
프로젝트에서 메테리얼의 용도를 정의한다.
메테리얼이 픽셀과 블렌딩되는 방식을 정의한다. 예를 들어 불투명(Opaque)셰이더는 뒤 오브젝트를 완전히 가리지만, 반투명(Translucent)와 애디티브(Additive) 셰이더는 특정한 방식으로 배경과 블렌딩된다.
BlendMode는 이 메테리얼을 다른 픽셀 앞에 렌더링할 때, 엔진에서 이 메테리얼(소스컬러)과 프레임 버터에 있는 것(대상 컬러)을 결합하는 방식을 조절한다.

가장 단순한 모드로, 가장 자주 사용될 가능성이 높다. 빛이 통과하지도, 투과하지도 않는 표면을 정의한다.
플라스틱, 금속, 돌 등 기타 표면 유형 대부분에 적합하다.

이 블렌드 모드는 가시성을 켜기와 끄기 중 선택적으로 제어해야 할 때 사용된다.
쇠사슬을 그리는 메테리얼을 예로 들면, 쇠사슬의 쇠 부분은 뒤 배경을 가리지만, 비어 있는 부분은 뒤 배경을 가리지 않을 것이다.
그릴 부분과 그리지 않을 부분은 오파시티 마스크Opacity Mask 텍스처를 메인 메테리얼 노드에 연결하여 지정하는데,
흰색 부분은 렌더링 되지만, 검은색 부분은 렌더링되지 않는다.
투명한 것과 렌더링 되지 않는 것은 다르다.
유리처럼 투명한 표면은 여전히 리플렉션(스페큘러)형태로 라이팅과 상호작용한다.
하지만 마스크드 모드에서 컬링된 픽셀은 렌더링 하지 않기 때문에, 해당 영역에선 리플렉션이 전혀 보이지 않는다.
리플렉션이나 스페큘러 효과를 유지하고자 하면 반투명 모드를 사용하거나, 레이어트 메테리얼 생성을 고려햐자.
컬링된 영역은 렌더링 하지 않아 계산하지 않으므로, 최적화에 도움이 된다.

메인 메테리얼 노드의 오파시티 마스크 클립 값Opacity Mask Clip Value 파라미터를 조정할 수 있다.
0~1 사이의 값이며, 이 값보다 어두운 픽셀은 렌더링 되지 않는다.
오파시티 마스크 클립 값 프로퍼티는 런타임에 변경하도록 설계된 것이 아님에 주의

일정한 형태의 투명도가 필요한 오브젝트에 사용된다. 투명도 수준을 조절할 수 있다는 점에서 마스크드 모드와 다르다.
반투명 모드는 Opacity 스칼라 값이나 텍스처를 받은 다음, 검은색 영역은 완전히 투명하게, 흰색 영역은 완전히 불투명하게, 그 사이의 그라데이션 값엔 그에 상응하는 투명도를 구현하는 방식으로 표면에 적용된다.
반투명 메테리얼을 사용하면, 메탈릭, 러프니스, 스페큘러, 노말 등의 효과를 지원하지 않는다.(표면에 리플렉션이 보이지 않는다)
따라서 반투명을 사용하면서 해당 효과를 주고 싶다면 꼼수를 사용해야 한다.
예를 들어 반투명이면서 반사하는 메테리얼을 만들 땐 큐브맵을 사용한다.https://wergia.tistory.com/140
https://docs.unrealengine.com/4.27/ko/RenderingAndGraphics/Materials/HowTo/Transparency/
엔진 버전이 오름에 따라, 라이팅 모드를 변경함으로써 반투명에서도 메탈릭, 러프니스 등의 효과를 지정할 수 있게 되었다.
하지만 과사용시 성능에 문제가 있다고 하니 주의

메테리얼의 픽셀을 취해 배경의 픽셀에 더한다. 어두워지지 않으며, 모든 픽셀값을 더하기 때문에, 검은색은 투명하게만 렌더링된다.
해당 블렌드 모드는 불, 증기, 홀러그램과 같은 다양한 특수효과에 좋은 방식이다.

두 애디티브 메테리얼이 적용된 모델이 겹치면, 겹친 부분이 더해져 밝아지는 것을 볼 수 있다.
반투명Translucent 모드와 마찬가지로 스페큘러 효과(리플렉션)을 반영하지 않는다.
메테리얼이 라이팅과 상호작용하는 방식을 정의한다. 즉 셰이딩 모델은 메테리얼을 구성하는 입력 데이터로, 최종 외관을 만들어내는 방식을 제어한다.
메테리얼엔 보통 기본 라이팅 포함(Lit)셰이딩 모델을 사용하는 경우가 많지만, 언리얼 엔진에서 Hair, Cloth, Skin 등을 위한 구체적인 셰이딩 모델이 제공한다.
언릿 모델은 컬러에 이미시브만 출력하므로, 불같은 이펙트나 발광 오브젝트에 적합하다.
높은 이미시브 값이 글로우 이펙트를 구현하는데, 이는 카메라에 적용된 더트 마스크에도 나타낸다.
높은 이미시브로 빛을 발하는것으로 보이지만, 실제로 씬에 라이팅이나 섀도를 드리우지 않는다.
하지만 루멘이 활성화 되거나 스태틱 라이팅에 이미시브 사용을 켜고, 라이트 매스와 함께 사용하면 라이트를 드리울 수 있다.
사용가능한 입력
기본 셰이딩 모델로, 가장 많이 사용하게 된다. 직사광, 간접광 뿐 아니라 리플렉션을 위한 스페큘러도 활용한다.
해당 모델은 서브서피스 스캐터링(SSS) 이펙트를 시뮬레이션한다.
서브서피스 스캐터링
빛이 물체의 표면을 통과하여 분산될 때 발생하는 현상이다.
서브서피스 스캐터링은 얼음, 밀랍양초, 피부 등의 오브젝트에서 두드러지게 나타난다.
일반적인 예로, 해를 손이나 귀로 가렸을 때, 빛이 얇은 부분을 뚫고 나오는 현상보통의 렌더러는 물체 표면에서만 빛의 반사와 확산을 계산하는데, 이 경우 반투명한 물체를 통과하는 빛을 표현하기 어렵다. 이를 보완하여 물체의 표면 아래에서 빛의 경로를 계산하게 만든 것이 SSS다.
이때 물체 속에서 빛은 여러번 반사하고 확산되어 보다 사실적인 이미지를 만든다.
서브서피스 모델은 서브서피스 컬러 입력에 의존하는데, 이 입력은 표면 바로 아래에 있는 물질의 색을 정의한다.
빛이 표면을 통과해 산란할 때, 서브서피스 컬러가 눈에 보이게 된다.
사람 피부의 경우, 짙은 빨간색을 사용하여 피부 표면 아래 순환하는 피를 포현하고, 얼음 정령은 어두운 청록색을 사용하여 표면에 반투명 깊이감을 준다.
서브서피스와 유사하지만, 정확도를 어느정도 포기하고, 비용을 낮추는 데 우선순위를 둔다.
물리적으로 완벽하지 않지만, 인간 피부에 사용하면 서브서피스보다 더 나은 성능으로 좋은 결과를 보여주기도 한다.
https://docs.unrealengine.com/5.2/ko/subsurface-profile-shading-model-in-unreal-engine/
서브서피스와 사전 통합 피부와 유사하지만, 고사양 스킨 렌더링에 적합하도록 고안되었다. 특히 사람 피부에 사용할 경우, 가장 퀄리티가 높은 셰이딩 모델이다.
표준 메테리얼 표면에 반투명 필름 레이어가 겹쳐진 멀티 레이어 메테리얼을 시뮬레이션 하는데 도움이 된다.
무색 금속 위에 부드럽게 색을 입힌 필름을 얹은 모습을 모델링 하는데 특화되어 있다.
금속, 비금속 모두에 사용가능하다.
아크릴, 탄산음료 캔, 자동차 도색 등을 예로 들 수 있다.
두번째 노멀 맵을 추가하여 코트 레이어 아래의 표면을 구하는 옵션. (코팅을 한겹 더)
탄소 섬유나 자동차 도색 등, 코트 레이어와 다른 반사 표면을 가진 복잡한 모델링을 더 정확하게 모델링할 수 있다.
라이트가 메테리얼 표면을 투과할 때, 나뭇잎 속으로 투과되는 라이트처럼 자연스럽고 일관된 결과를 구현할 수 있다.
서브서피스 컬러는 라이트의 투과량을 정의하는데 사용되며, 줄기나 잎맥 부분에 마스크를 생성하는데 사용된다.
해당 모델은 피부나 두꺼운 표면에 활용하기 좋은 SSS에서 발생하는 문제를 해결하는 데 용이하나, 잎처럼 얇은 표면에는 정확도가 떨어진다. 마찬가지로 기본 라이팅 포함 셰이딩 모델을 사용할 경우 잘못된 결과로 이어질 수 있음에 주의
여러 스페큘러 하이라이트를 시뮬레이션하여 자연스런 헤어를 만들 수 있다.
하나는 라이트의 색을 표현하고, 다른 하나는 헤어와 라이트의 색을 혼합하여 표현한다.
해당 모델은 옷의 특성을 더 정확히 모방할 수 있다.
클로스 표면 전반에 얇은 퍼즈 레이어가 포함되는데, 이 레이어는 빛이 이러한 유형의 메테리얼과 상호작용하는 방식을 시뮬레이션하는데 도움이 된다.
홍채의 모양과 거리를 정교하게 제어하여 눈의 표면을 시뮬레이션하도록 설계되었다.
고급 기술을 사용하며, 셰이더 코드, 메테리얼, 지오메트리 셰이프, UV 레이아웃 간에 매우 강한 종속성을 형성하도록 개발되었다.
https://docs.unrealengine.com/5.2/ko/single-layer-water-shading-model-in-unreal-engine/
해당 셰이더 모델과, 불투명Opaque 블렌드 모드를 사용하면, 투명한 물의 표면과 같은 효과를 낼 수 있다.
반투명Transparent 블렌드 모드가 필요한 메테리얼 사용에 따른 비용과 복잡성을 줄여준다.
해당 모델은 물리 기반 반투명 메테리얼 유형을 지원하므로, 스페큘러 및 배경 오브젝트를 정확히 처리하는 도색 유리를 만들 수 있다.
예를 들어 도색 유리 메테리얼을 생성할 때, 흰색 스페큘러 하이라이트와 착색된 백그라운드가 모두 필요하다.
해당 셰이딩 모델은 공기에서 유리로, 유리에서 공기로 반사되는 라이트를 고려하는 물리 기반 셰이더를 통해 두가지 단일 패스로 렌더링한다.
해당 셰이더 모델은 메테리얼 그래프의 로직을 통해, 여러개의 셰이딩 모델을 단일 메테리얼에 결합하게 해주는 고급 기술이다.
해당 셰이더 모델로 설정되면 셰이딩 모델 입력이 활성화되며, 메테리얼 그래프에서 ShadingModel노드를 사용하여 설정가능하다.
따라서 절반은 클로스, 절반은 서브서피스를 사용 가능하는 등에 사용한다.