이전 글 보기
https://mountain-noroo.tistory.com/71
[언리얼] 학원 21일차: 툴팁, 마우스 커서, 빌보드
이전 글 보기 https://mountain-noroo.tistory.com/67 [언리얼] 학원 20일차: 인벤토리 끄기(UMG Input) 이전 글 보기 https://mountain-noroo.tistory.com/66 [언리얼] 학원 19일차: 아이템 획득, 인벤토리 매니저 이전 글 보
mountain-noroo.tistory.com
빌보드 머티리얼 만들기
빌보드 컴포넌트는 항상 오브젝트가 카메라를 바라보게 회전시키는 구조지만
머티리얼로도 항상 카메라를 바라보도록 하는 것이 가능하다.
그래픽스 파이프라인 중 월드 좌표계를 카메라 좌표계로 변환하는 중간에
카메라를 바라보도록 위치를 조정하는 것이다.
머티리얼에서는 이 월드 좌표계에서의 위치를 바꿀 수 있도록 오프셋을 추가할 수 있는 노드를 제공한다.
이 오프셋을 직접 계산하려면 복잡하지만
카메라를 바라보도록 할 때 오프셋을 얼마나 줘야 하는지도 노드로 제공하기 때문에
기저 축 세 개만 알맞게 넣어주면 아래와 같이 텍스트 메시 컴포넌트가 정상적으로 화면을 바라본다.
셰이딩 모델을 Unlit으로 하면 광원 효과를 받지 않게 된다.
만약 이미시브 컬러에 연결한다면
자신이 빛나는 효과를 가지게 된다.
Specular
노멀 맵에는 위로 향하는 방향 값이 담겨 있다.
빛 표현은 Ambient(환경광) + Diffuse(난반사광) + Specular(반사광)으로 이루어져 있는데
이 중 Specular는 카메라에서 들어오는 eye 벡터와 반사된 벡터의 내적값에 따라 결정되며
램버트 코사인법칙에 따라, 각도가 작을수록(코사인 1에 가까울수록) 빛이 강하다는 뜻이다.
여기서 Specular는 계수를 직접 적용 가능하여
0을 주면 반사광을 없애 흔히 말하는 무광 효과(Ambient, Diffuse light는 적용되어 있기 때문에 엄밀히 말해 무광은 아님)를 만들 수 있다.
ScreenUV
TexCoord는 정점에 매핑된 UV값을 가져오지만
ScreenPosition은 스크린 좌표를 가져온다.
노드를 UV에 연결하면 이 화면이 그대로 텍스처 UV에 매핑되어
월드 스페이스 어디에 놓아져 있는가 상관없이 화면의 일정 부분에는 텍스처의 똑같은 부분이 보이게 된다.
여러 가지 응용
흘러가는 효과
Panner이라는 노드를 통해 구현 가능하다.
시간에 따라 조금씩 UV좌표를 이동시켜 흘러가는 듯한 효과를 보이게 한다.
멀티 랜더 타겟(MRT)
랜더링 방식이 20년 전부터 forward 랜더링에서 Deffered 랜더링으로 바뀌었다.
forward 랜더링은 한 번에, Deffered 랜더링은 지연시켜 랜더링 하는 방식이다.
디퍼드 랜더링을 할 때는
색상, 빛, 노멀, 반사광, 깊이 등과 같은 랜더링에 필요한 여러 정보들을 타겟(각 버퍼)에 저장한다.
머티리얼을 만들 때는 이 특정 타겟만 가져올 수 있다.
여기서는 Depth 값을 가져와 일정 값 이상이 되면(멀어지면) 투명도를 0으로 처리하였다.
소프트 파티클
소프트 파티클이란 이렇게 반투명 오브젝트가 불투명 오브젝트와 맞닿았을 때
알파가 투박하게 사라지는 것이 아닌 서서히 사라져 가는 효과를 주는 것으로
글로 쓰면 잘 와닿지 않으니 위 그림을 보는 것이 좋다.
언리얼에서는 Depth Fade 노드로 이 효과를 줄 수 있다.
겹치는 좌표를 기준으로 하여 어느 정도 길이만큼 Fade 효과를 줄 것인지를 FadeDistance에 넣어주면 된다.
그리고 여기서 나온 알파값을 원본 텍스처의 알파값과 비교하여
텍스처 알파값이 더 작으면 텍스처 알파값을 return 하고(텍스처에서 알파값이 0으로 설정된 좌표이다.)
뎁스 페이드를 거쳐 나온 알파값이 더 작으면 이 값을 return 하여 페이드 효과를 적용한다.
그런 그냥 두 값을 곱하면 되지 않나?라는 생각이 들었다.
알파값이 둘 중 하나라도 0이면 0이 적용되고
페이드 되어 0~1 사이인 값은, 텍스처에 그 값이 곱해지는 것이니 문제없지 않은가...?
결과도 차이가 없는 것 같다.
아직 개선할 수 있는 부분이 있는데,
이 페이드는 월드스페이스를 기준으로 하기 때문에
카메라가 물체에서 멀어진다면 페이드 효과가 잘 보이지 않는다는 것이다.
그러면 물체에서 카메라가 멀어질수록 FadeDistance 값에 보정치를 주어 더 커지게 하면 되지 않을까?
어떤 원리로 구현하는가
1. 오브젝트의 월드 좌표를 가져온다.
2. 이 좌표계(Absolute World Space)를 카메라 기준 좌표계(Camera Space / View Space)로 변환한다.
3. 여기서 Z값(Depth)을 구하면 카메라 위치에서 오브젝트까지 얼마나 떨어져 있는지 알 수 있다.
4. 보정치는 적당한 값을 임의로 주는데, 카메라거리 500당 배율을 1로 적용하도록 하였다.
5. 원래 FadeDistance 값인 100에 보정치(배율)를 곱해주었다.
- 거리가 2000 떨어져 있다면 FadeDistance는 100 * 4가 된다는 것.
위의 절대 월드 포지션과 Object Position 노드의 차이는
절대 월드 포지션(World Position) 노드는 모든 픽셀의 월드 좌표 값이 리턴되고
Object Position 노드는 오브젝트 원점의 월드 좌표 값이 리턴된다는 것이다.
이 TransformPosition이라는 노드는 어떤 좌표계를 어떤 좌표계로 변환할 것인지 설정할 수 있다.
여러모로 많이 쓰일 것 같기 때문에 잘 기억해야겠다.
머티리얼 인스턴스
원본 머티리얼을 우클릭하면 머티리얼 인스턴스라는 것을 만들 수 있다.
값을 입력하는 노드는 파라미터로 변환할 수 있는데
이렇게 생성한 파라미터는
그 머티리얼의 인스턴스에서 수정이 가능하다.
게임의 최적화를 위해 변수 값만 다른 머티리얼을 만들고 싶은 경우,
언리얼에서는 머티리얼 인스턴스의 활용을 권장한다.
동적 머티리얼 (Dynamic Material)
런타임 도중 머티리얼의 변수 값을 바꿔야하는 경우 동적 머티리얼을 만들 수 있다.
물론 연산이 더 많이 들기 때문에 가능한 머티리얼 인스턴스를 활용하길 권장하고(변수를 바꾸는 대신 머티리얼 인스턴스를 교체하기),
다이나믹 머티리얼을 써야하는 상황이 끝난 경우 머티리얼 인스턴스로 다시 교체하는 것들 권장한다.
https://docs.unrealengine.com/5.1/ko/instanced-materials-in-unreal-engine/
인스턴스드 머티리얼
셰이더 리컴파일 없이 자손 머티리얼의 행동이나 외형을 변경할 수 있는 계층구조식 머티리얼 관계입니다.
docs.unrealengine.com
'언리얼 > Assortrack UE5' 카테고리의 다른 글
[언리얼] 학원 24일차: Material (1) | 2023.10.10 |
---|---|
[언리얼] 학원 23일차: Material (0) | 2023.09.27 |
[언리얼] 학원 21일차: 툴팁, 마우스 커서, 빌보드 (0) | 2023.09.25 |
[언리얼] 학원 20일차: 인벤토리 끄기(UMG Input) (0) | 2023.09.22 |
[언리얼] 학원 19일차: 아이템 획득, 인벤토리 매니저 (0) | 2023.09.21 |