안녕하세요. 지난번 전달드린 내용에서 일부 구현하시고자 하는 내용에 도움을 드린 거 같아 기쁩니다!
추가로 문의주신 내용에 대해 이해한 바가 맞다면, 플레이어 그룹만 외곽선을 그리며, 해당 그룹에 속하는 오브젝트가 다른 오브젝트에 가려지는 경우에만 외곽선을 그리고 싶으신 것으로 보입니다.
이 경우에는 외곽선을 그리고자 하는 그룹들만 커스텀 뎁스&스텐실을 적용하고, 그리는 영역을 커스텀 뎁스와 Scene Depth 값 비교를 통해 마스킹할 수 있을 것으로 판단됩니다.
[Image Removed]
말씀드리는 내용을 보내드렸던 예제를 수정하여 구현해보면 다음과 같습니다.
먼저, 외곽선을 그리는 그룹에만 커스텀 텝스 & 스텐실을 적용하고 나머지 오브젝트에는 해당 설정을 해제하였습니다.
이어서 커스텀 텝스와 SceneDepth를 비교하여, 커스텀 뎁스값이 큰 경우, 즉, 카메라 상에서 대상 오브젝트가 멀리 보여지는 경우를 구분하여 해당 경우에만 외곽선 대상임을 알리도록 하였습니다.
이를 머티리얼 함수(MatFunc_CheckOutlineDepth)로 구현하여 재활용이 가능하도록 하였습니다.
[Image Removed]해당 함수에 대한 부연 설명을 드려보면, 물체가 그려지는 영역을 제외한 곳에는(예. SkyBox) 카메라의 Far Value가 기록되게 됨으로 해당 경우를 최소의 값인 -1로 설정하였습니다. (1번 과정)
그리고 이를 Scene Depth와 비교하여 카메라 기준으로 대상 오브젝트들이 멀리 있을 경우에만 외곽선을 그리도록 0을 반환하도록 하였습니다. (2번 과정)
[Image Removed]이어서 전달드린 외곽선 후처리 머티리얼은 십자 모양(+) 형태로 외곽선 검출을 진행하고 있기에, 같은 두께의 외곽선이 나오도록 곱하기 연산을 통해 총 5 픽셀에 해당하는 테스트 값들을 연결하였습니다.
연결된 값은 이후 가시성을 위해 FilterMask라는 지역 머티리얼 Reroute 노드에 이를 저장하였습니다.
[Image Removed]이후 기존 커스텀 스텐실 결과물을 외곽선으로 출력해주기 위한 상수값 0을 FilterMask값으로 대체하였습니다.
샘플로 제작한 머티리얼과 머티리얼 함수 파일을 전달드리오니 자세한 내용은 실제 샘플에서 확인 부탁드리겠습니다.
한가지 주의사항으로 이러한 방식으로는 커스텀 뎁스를 그리는 플레이어들끼리 겹쳐졌을 때는 외곽선을 그리지 않습니다.
해당 방식을 구현하기 위해서는 개별 커스텀 스텐실 비트를 마스크로 사용하여 하나하나씩 처리하는 형태로 구현하는 방법이 필요할 것으로 보입니다.
다만, 이러한 형태는 (플레이어의 수 x 화면상의 픽셀 수) 만큼의 픽셀 연산이 들어가기 때문에 매우 높은 성능 비용이 발생할 것으로 추측됩니다.
전달드리는 내용에서 모호하셨거나 추가로 문의주실 사항이 있으시면 말씀 부탁드립니다.
감사합니다.