이전 글 보기
https://mountain-noroo.tistory.com/79
아웃라인
원리
한 픽셀에서 주변 픽셀의 Depth 값을 가져왔을 때
차이가 크면 경계선일 것이다.
그렇다면 Screen 좌표에서 상하좌우 픽셀의 평균값과 비교해 차이가 크다면
그 픽셀은 아웃라인에 해당한다 할 수 있다.
구현
우선 상하좌우 픽셀을 얻어오는 방법이다.
ScreenPosition에 한 픽셀만큼 더하면 되는데
이 한 픽셀의 사이즈는 SceneTexelSize로 가져올 수 있다.
현재 좌표에 [(0, 1), (1, 0), (0, -1), (-1, 0) * 픽셀 사이즈]로 더해준다.
이제 본인과 주변 좌표들의 Depth 값을 가져온다.
주변 좌표들의 값의 평균을 내고 현재 좌표와 비교해 절댓값을 구한다.
20(임의의 숫자) 초과로 차이가 나면 외곽라인 색상을 표시하고
20 이하로 차이가 나면 픽셀의 원래 색상을 표시한다.
원래 화면의 텍스처를 본뜬 버퍼를 가져오는 노드가 SceneTexture:PostProcessInput0인데
씬 텍스처 ID를 지정해주어야 한다.
개선
멀리 있는 물체는 외곽선이 너무 많이 보이고 가까이 있는 물체는 잘 생성되지 않는 문제 발생.
그래서 임의의 값을 넣는 대신에 현재 Depth의 5% 초과로 차이가 나는지로 변경하였다.
아웃라인 굵기를 조절할 수 있는 파라미터도 생성.
오프셋을 변경하면 더 먼 곳의 픽셀과 비교하기 때문에 아웃라인으로 판정되는 범위도 넓어진다.
스텐실
내가 생각하는 스텐실이란
원하는 오브젝트의 픽셀들에 번호를 매겨놓아 쉐이더에서 구분을 위해 사용하는 기능.
https://rito15.github.io/posts/unity-transparent-stencil/
위 링크는 전에 스텐실을 공부할 때 참고했던 블로그인데
유니티의 스텐실을 설명한 포스팅이지만 결국 개념은 동일하니 보면 좋을 듯.
스텐실 기능을 사용하기 위해
프로젝트 세팅 -> 랜더링 -> 포스트 프로세싱 -> 커스텀 뎁스-스텐실 패스를 Enabled with Stencil로 변경
아웃라인을 주길 원하는 메시에
커스텀 뎁스 패스 렌더를 체크하고 커스텀 깊이 스텐실 값을 정한다.
원하는 오브젝트만 아웃라인 주기
스텐실을 이용해 원하는 오브젝트에만 아웃라인을 표시해 보자.
이는 위에서 완성한 쉐이더 그래프에서 지정치보다 차이가 클 때 아웃라인 색을 표시하던 부분을 잘게 쪼갠 것이다.
스텐실을 기록해 둔 버퍼를 가져오기 위해 이번에는 SceneTexutre로 CustomStencil을 선택한다.
이 값이 미리 정해둔 오브젝트의 스텐실 값과 동일할 경우
BitMask가 true, flase를 1, 0으로 반환하기 때문에
반환값과 아웃라인 색을 곱한다.
다른 테스트 값과 전부 더해도 1이 반환되는 것은 하나뿐이라
전부 더한 값을 A > B 핀에 꽂아 넣어주면 된다.
참고로,
스텐실을 지정해주지 않았을 때 기본 값은 0이다.
이런 픽셀은 원래 색상을 곱해준다.
나이아가라
이미터
이미터는 나이아가라의 모듈(기능)들이 들어있는 집합이다.
이는 파티클을 어떻게 생성하고 어떻게 동작할지를 정한다.
나이아가라 이미터는 우클릭 -> FX -> 나이아가라 이미터로 만든다.
새 이미터를 처음부터 만들 수도 있고 기존 이미터를 이용해 변형할 수도 있다.
여러 모듈로 구성된 모습
모듈은 순서에 따라 실행 순서가 변경된다.
시스템
시스템은 여러 이미터로 구성되어 있다.
시스템도 우클릭 -> FX -> 나이아가라 시스템 (혹은 바로 우클릭 -> 나이아가라 시스템)으로 만든다.
시스템에서는 이미터를 추가할 수 있다.
여기 프로퍼티에서 시뮬레이션을 어디서 돌릴지 정할 수 있는데
기본 CPU로 되어있으나
시뮬레이션 타깃을 GPUCompute Sim으로 선택하면
GPU컴퓨터 셰이더가 지원된다면 GPU에서 시뮬레이션하게 된다.
그러나 CPU에서 컬링작업이 이루어지기 때문에
CPU 시뮬레이션에서는 입자 하나하나 컬링을 적용할 수 있지만
GPU 시뮬레이션에서는 바운더리 박스를 생성하여 이 박스에 대한 컬링을 적용한다.
CPU: 시뮬레이션(CPU) -> 컬링(CPU) -> 랜더링(GPU)
GPU: 시뮬레이션(GPU) -> 랜더링(GPU) -> 컬링(CPU)
컬링이 중간에 들어가면 CPU와 GPU를 왔다 갔다 해야 하기 때문에 매우 비효율적
그래서 바운드 계산 모드를 Fixed(고정된 박스)로 해주었다.
다음으로 Emitter State를 보자.
Life Cycle Mode: System의 라이프 사이클 or 자신(이미터)의 라이프 사이클
Loop Behavior: 얼마나 반복 재생 할 것인지
Loop Duration: 죽는 데 걸리는 시간
여기서 이미터와 파티클은 별개의 존재이기 때문에
파티클의 라이프타임이 5초라면
이미터가 언제 태어났냐 죽었냐 와는 상관없이
파티클 자신의 생성 시간으로부터 5초 뒤에 죽는다.
파라미터
멤버 변수들
파티클이 붙은 파라미터는 파티클 하나하나에 붙어있는 멤버 변수를 뜻한다.
시스템, 이미터가 붙은 경우도 마찬가지.
모듈 추가
옆의 + 버튼으로 모듈을 추가할 수 있다.
모듈 하나하나 설명하면 끝이 없을거라 생각하기 때문에 생략한다.
'언리얼 > Assortrack UE5' 카테고리의 다른 글
[언리얼] 학원 29일차: 머티리얼 파라미터 콜렉션, 폴리지 (1) | 2023.10.17 |
---|---|
[언리얼] 학원 28일차: 랜드스케이프 (1) | 2023.10.16 |
[언리얼] 학원 24일차: Material (1) | 2023.10.10 |
[언리얼] 학원 23일차: Material (0) | 2023.09.27 |
[언리얼] 학원 22일차: Material(ScreenUV, MRT(Deffered)) 활용 (0) | 2023.09.26 |