[UE] Outliner Effect

strurao·2023년 8월 28일
0

언리얼엔진 5

목록 보기
8/10

언리얼 엔진은 렌더링되는 장면에 대한 정보를 저장하기 위해 여러 버퍼를 사용하고 있는데, 아웃라이너 기능을 위해 그 중에서도 SceneDepth 버퍼를 알아보고자 한다. 참고로 여기서 depth는 카메라와 객체/표면 사이의 거리라고 할 수 있다

뷰 모드> 버퍼 시각화> SceneDepth 선택

차례대로 디폴트 모드와 SceneDepth 모드이다.

각 픽셀은 카메라에서 얼마나 멀리 떨어져 있는지를 알려주는 값을 가지고 있다. 이 거리를 시각화할 때 그레이스케일 값으로 표시되는데, 더 가까운 물체는 더 어두운 픽셀을 갖게 되고, 멀리 있는 물체는 더 어두운 픽셀을 갖게 된다. 그래서 더 밝거나 더 어두워지는 회색조 이미지처럼 보이게 된다.

그렇다면 동일한 깊이를 사용하여 객체에 대한 윤곽선 효과를 생성하려면 어떻게 해야 할까?

Custom Buffer 를 활용하여 이 버퍼에만 특정 객체가 해당이 되도록 설정한다. 그리고 해당 버퍼에서 해당 객체는 검은색 픽셀로 표시되고 나머지는 모두 흰색이다. 버퍼 반전(1-()) 후 생기는 윤곽선에 대하여 각 객체의 내부 픽셀을 빼면 객체의 테두리가 남는다.

구체적인 방법을 알아보기 시작하겠다.
만약 우리가 총의 윤곽선을 만들고 싶다면, 총의 블루프린트에서 커스텀 뎁스 패스 렌더를 체크를 할 수 있는데 이는 총이 커스텀 뎁스 버퍼에 참여할 메시로 지정이 된다는 의미이다.

그리고 포스트 프로세스 볼륨 머티리얼에서 Scene Depth 정보를 사용하도록 설정해준다

아래 그림처럼 사용자 정의 깊이 버퍼의 개체에 없는 Texel에 대해 양수이지만 사용자 정의 깊이 버퍼에 있는 Texel의 경우 음수가 된다.

이 양수, 음수 값을 Ceil(), Clamp()를 사용하여 정규화하면 메쉬의 픽셀에 대해서는 0값을 얻을 수 있고 메쉬에 없는 픽셀에 대해서는 1값을 얻을 수 있다. 이를 1-()으로 반전시키면 아래와 같이 반전이 된다.

0 = 메시에 없는 픽셀, 1 = 메시에 있는 픽셀

이렇게 해서 객체의 배경이나 객체의 테두리에 있는 경우의 최고값이 1이 되고, 객체 내부에 있는 픽셀도 1이 된다. 아래의 블루프린트처럼 두 가지의 정보를 곱하게 되면 경계가 아닌 메시 내부 픽셀에 대해 최고값은 0이다. 또한 픽셀이 메시에 없는 경우도 0이다. 따라서 메시 외부의 모든 곳이 검은색이 된다.
또한 두 정보의 공통점은 바로 1값을 가지는 경계선(총의 테두리)인데 이 둘을 곱하면 경계선 부분만 흰색으로 남게 된다. 0: 검은색, 1: 흰색


이제 윤곽선에 색을 넣어주고, 카메라와 거리 차이를 계산하여 시야에 따라서 윤곽선이 가려지도록 해준다.


Custom stencil value를 다르게 두어서 색깔의 차이를 줄 수 있다.

VectorCurve, DynamicMaterial을 사용하여 반짝이는 커스텀 효과를 넣어줄 수도 있다.

profile
기록하는 습관

0개의 댓글