언리얼 엔진은 렌더링되는 장면에 대한 정보를 저장하기 위해 여러 버퍼를 사용하고 있는데, 아웃라이너 기능을 위해 그 중에서도 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
을 사용하여 반짝이는 커스텀 효과를 넣어줄 수도 있다.