커스텀뎁스 버퍼를 두 장 사용하는 방법이 있을까요?

캐릭터 아웃라인 기능 개발할 때, 현재 커스텀 뎁스 버퍼를 한 장만 사용하여 두 객체가 동시에 아웃라인을 그릴 때 뎁스 평가를 통해 겹쳐있을 경우 한 두 객체 모두의 아웃라인을 그리지 못하는 경우가 발생합니다.

뎁스 버퍼를 한 장 늘리기 위한 방법 혹은 가이드가 있을까요??​

안녕하세요. 현재 커스텀 뎁스 버퍼를 여러개 쓰려면 엔진 수정 없이는 불가능 합니다.

대신 커스텀 뎁스 스텐실 값을 이용해서 0~255까지 구별을 할 수가 있습니다.

[Image Removed]프로젝트 셋팅에서 Enabled with Stencil 체크를 하시고

[Image Removed]스태틱메시 디테일에서 CustomDepth Stencil Value를 0~255사이 값으로 설정하실 수 있습니다.

먼저 해당 기능을 통해서 원하는 효과를 달성할 수 있는지 확인해 보시는 것이 좋을 것 같습니다.

아니면 원하시는 효과를 더 자세히 설명해주시면 도움 드릴 수 있도록 하겠습니다.

감사합니다.

안녕하세요!

두 객체에 CustomDepth Stencil Value를 다르게 부여한다고 해도, 뷰포트에서 두 객체가 겹치면 뎁스가 작은 값만 보이기 때문에

현재 구조에서는 원하는 효과 달성이 어려울 것 같습니다. (Depth 무관하게 두 객체의 온전한 아웃라인 그리기)

엔진 수정할 경우 어느 부분을 확인해보면 좋을까요??

안녕하세요! 기능 테스트 하면서 문의드리고 싶은 내용이 바뀌어서 추가 댓글로 다시 남깁니다.

현재 커스텀뎁스에 뎁스가 쓰일 때 RGB 채널에 모두 뎁스값이 담기는걸로 보이는데, 이 부분을 커스터마이징 하는 방법이 있을까요??

가려진 객체의 아웃라인을 그릴 때 씬뎁스와 커스텀뎁스의 차이를 이용해서 그리게 되는데, 현재는 커스텀뎁스에 들어간 객체들끼리 가려졌는지 체크가 되지 않아서 커스텀뎁스의 GB 채널을 이용하고 싶습니다. 가능한 부분일까요??

안녕하세요, 테스트 결과 스텐실 값 없이 커스텀 뎁스만으로도 두 객체의 아웃라인을 그릴 수 있었습니다.

이런 효과를 원하시는 거면 첨부된 머티리얼 어셋을 테스트 해 보시는 것을 추천드립니다.

[Image Removed]감사합니다.

안녕하세요!

스탠실을 이용하여 두 객체를 그릴 때, 스탠실을 사용하는 다른 객체에 의해 가려지는 객체의 아웃라인도 모두 표현됐으면 합니다!

예시로 주신 이미지의 경우에 뒷 쪽 물체가 정면 구체에 가려지는 부분에 아웃라인이 표시되지 않는 부분을 해결하고 싶습니다!

안녕하세요, 답변이 늦어져 먼저 죄송하다는 말씀을 드립니다.

말씀주셨던 겹치는 부분에 대한 아웃라인 표현은 Custom Depth Stencil Write Mask​를 활용하실 경우 여러 물체에 대한 대응이 가능할 것으로 보입니다.

해당 옵션은 StaticMeshComponent > Rendering > Advanced 아래에서 확인하실 수 있습니다.

[Image Removed]​

해당 기능은 CustomDepth Stencil Value값에서 특정 비트에 대한 값만 쓰기 지정을 할 수 있도록 합니다.

위 이미지 예에서라면 Value값인 7(이진수 111)에서 Second bit, 즉, 4(이진수 010)의 값만을 쓸 것입니다.

총 8 비트에 대한 조작이 가능하기에 8가지의 물체의 겹쳐짐을 표현할 수 있습니다.

앞서 보내드렸던 Material에서 위, 아래 각각 +1, -1씩의 Depth값을 비교하여 Outline을 표현하고 있었습니다만,

이를 Stencil 값의 차이로 변경하는 것으로 말씀주신 것과 유사한 효과의 샘플을 만들 수 있었습니다.​

자세한 내용은 변경한 Material 파일도 함께 전달드리오니 확인하시고 모호한 점이 있으시거나 질문이 필요하신 부분 말씀 부탁드리겠습니다.

[Image Removed]

  • Sphere 설정
    • CustomDepth Stencil Value - 7
    • Custom Depth Stencil Write Mask - First bit (1), ignore depth
  • Cube 설정
    • CustomDepth Stencil Value - 7
    • Custom Depth Stencil Write Mask - Second bit (2), ignore depth
  • Cylinder 설정
    • CustomDepth Stencil Value - 7
    • Custom Depth Stencil Write Mask - Third bit (4), ignore depth

​추가로 문의주셨던 Custom Depth를 여러장을 그리는 것은 앞서 안내드렸 듯 엔진 수정을 필요로 합니다.

해당 기능을 위해서는 다음 대규모의 엔진 수정을 필요하신 Custom Depth의 개수만큼 반복해주시는 것이 요구됩니다.​

  • StaticMeshComponent 또는 각각의 다른 Renderer Component에서 Custom Depth N에 대한 옵션 추가
  • SceneProxy에 Custom Depth N에 대한 Render Flag 추가
  • Visibility 처리에 대한 코드에서 Custom Depth N 렌더링에 대한 플래그 전달
  • MeshPass상 Custom Depth N 패스 추가
  • SceneTextures ​리소스에 Custom Depth N 텍스쳐 추가
  • ​사용하고 계신 SceneRenderer의 Render() 함수에서 Custom Depth를 그리는 Render Pass콜을 Custom Depth N에 대해서 하도록 복제

이처럼 복잡한 커스텀 과정 외에도 Custom Depth 패스는 등록된 모든 오브젝트들을 대상으로 Render Loop를 실행하게 되기에 그 자체로 높은 성능 비용을 발생시킵니다.

또한 저희가 이해한 바가 맞다면, Custom Depth를 여러장 그리는 방법은 기본적으로 각 오브젝트마다 Depth Rendering -> Outline Draw를 실행하는 것과 유사한 비용이 발생할 것으로 추측됩니다.

관련 내용이 필요하실 경우 사용하고 계신 SceneRenderer 또는 빌드 타겟 플랫폼을 알려주시면 Diff 파일 형태의 패치 파일을 전달드릴 수 있도록 하겠습니다.​

안녕하세요. 지난번 전달드린 내용에서 일부 구현하시고자 하는 내용에 도움을 드린 거 같아 기쁩니다!

추가로 문의주신 내용에 대해 이해한 바가 맞다면, 플레이어 그룹만 외곽선을 그리며, 해당 그룹에 속하는 오브젝트가 다른 오브젝트에 가려지는 경우에만 외곽선을 그리고 싶으신 것으로 보입니다.

이 경우에는 외곽선을 그리고자 하는 그룹들만 커스텀 뎁스&스텐실을 적용하고, 그리는 영역을 커스텀 뎁스와 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 화면상의 픽셀 수) 만큼의 픽셀 연산이 들어가기 때문에 매우 높은 성능 비용이 발생할 것으로 추측됩니다.

전달드리는 내용에서 모호하셨거나 추가로 문의주실 사항이 있으시면 말씀 부탁드립니다.

감사합니다.

안녕하세요, 추가로 문의주신 커스텀 뎁스의 GB 채널에 대한 답변을 드립니다.​

머티리얼 노드 상에서는 RGBA 채널을 모두 가지고 있는 것처럼 표현되고 있으나, 실제로 해당 노드의 실제 Shader 코드인 HLSL 코드를 살펴보면

CustomDepthTexture라는 텍스쳐로부터 R 채널을 읽고 이를 반환값의 RGB에 넣고, 나머지 A채널에는 0을 넣고 있음을 확인할 수 있습니다.​

[Image Removed]또한, CustomDepthTexture의 픽셀 포멧을 에디터 환경인 DirectX 12에서 확인해보면 D32S8_TYPELESS(Depth 32bit, Stencil 8bit)인 것으로 확인되며,

Stencil은 별도의 읽기를 제공하고 있지 않기에 단일 채널 Depth 32bit의 값만을 R채널에 담고 있는 텍스쳐임을 알 수 있습니다.​

결론적으로 실질적인 커스텀 뎁스 텍스쳐는 CustomDepthTexture로써 컴퓨터 그래픽스 상의 제한사항으로 인해 단일 채널의 텍스쳐로써 추가 채널을 제공하고 있지 않는다고 볼 수 있습니다.​​

안녕하세요 답변 감사합니다, 비트플래그 사용하여 다수의 객체에 대한 겹침 아웃라인 처리를 해결할 수 있었습니다.

추가 문의가 하나 더 있는데, 커스텀뎁스에 그릴 때 스텐실 값만 쓰고 깊이값은 쓰지 않게 설정하는 방법이 있을까요??

겹친 객체의 깊이에 따른 처리를 다르게 하고 싶은데 커스텀뎁스에 들어간 객체 중 가장 뎁스값이 적은 객체의 뎁스만 확인이 됩니다.

플레이어 객체를 아웃라인을 그리고자 하는 객체에 가려졌을 경우에만 아웃라인을 표시하고 싶은데, 현재 구조에서는 겹쳐져 있을 때 플레이어가 가려진건지 앞에 있는건지 구분이 불가능한 것 같습니다. 스텐실 뎁스에 플레이어 객체만 넣을 경우 가능할 것 같은데, 이런 방법이 가능할까요??

안녕하세요! 정성스러운 답변 감사드립니다.

해당 내용들 인지하여 가능한 범위 내에서 필요한 기능 구현해보도록 하겠습니다.