언리얼4.22 버전 기준으로 기본 마네킹 모델 마테리얼을 Translucent쉐이더로 변경하고 오파시티 값을 0.8설정 해봤습니다.

 

그 결과 위와같이 반투명 블랜딩이 되긴하지만 몸체 내부, 반대편까지 렌더링, 블랜딩되어 위와 같이 이상하게 나옵니다.

 

 

https://forum.bodybuilding.com/showthread.php?t=167455441&page=1

분명 우리가 원하는 건 위와 같이 깔끔하게 투명처리 되는 것 인데 말이죠.

 

위 문제의 원인은 Z-Buffer를 사용하지 않는 반투명 쉐이더의 알파소팅 문제입니다.

https://darkcatgame.tistory.com/31?category=806332

 

Unity Shader - Alpha 이론 & 문제 해결

게임을 만드는데 있어서 반투명 그래픽은 필수적이며 여러가지 활용하는 곳이 많습니다, 반투명이라는 것은 뒤의 픽셀과 블렌딩(Blending)된다는 의미입니다. 이번 포스팅에서는 알파에 관한 이론과 알파를 사용..

darkcatgame.tistory.com

이전에 해당 이슈에 대해 다룬 글입니다, 자세한 것은 위 포스팅을 확인해주시길 바랍니다.

 

결론적으로 말하면 카메라가 보는 픽셀만 반투명으로 렌더링해야하는데 뒷부분까지 렌더링하여 생기는 문제로 위 포스팅에서는 2Pass를 해서 강제로 Z-Buffer를 사용하게하여 해결했습니다,

 

하지만 언리얼4에서는 쉐이더를 직접 작성할 수 없는 관계로 2Pass를 사용 할 수 없습니다,

이 포스팅은 언리얼4에서 2Pass를 사용하지 않고 이 이슈를 해결하는 방법에 대해 다루겠습니다.

 

 

 


Custom Depth Buffer란?

사진 클릭하면 크게 볼 수 있습니다.

디퍼드렌더링의 언리얼4에는 다양한 버퍼가 존재하는데 그중에서 깊이(Depth)버퍼가 있습니다.

버퍼 시각화 -> 씬 뎁스를 클릭하면 위 처럼 깊이 버퍼를 육안으로 식별할 수 있습니다.

 

Mesh 오브젝트의 디테일 속성에서 Render CustomDepth Pass 옵션을 체크하고 버퍼 시각화 -> 커스텀 텝스를 클릭하면 이전에 전체 뎁스 버퍼가 나오던것과 달리 해당 오브젝트의 뎁스 버퍼만 출력됩니다, 이렇게 별도의 깊이 버퍼로 설정하는 것을 Custom Depth Buffer라고 합니다.

 

 

 


Pixel Depth 노드

Pixel Depth는 Depth Buffer와 흡사해 보이지만 정확히는 카메라로부터 Mesh가 찍히는 픽셀의 거리 값을 의미합니다,

그런데 Depth 값 단위가 Depth Buffer와 동일합니다.

(위 노드에서 2048을 나눈 이유는 기본 Depth 값 단위가 높아서 눈에 잘보이게 하기 위해 값을 낮추기 위함입니다.)

 

이제 본론으로 넘어가기 전에 알아야할 기능, 이론을 다 설명했습니다 본격적으로 해결방법을 설명하겠습니다.

 

 


오버드로우 막기(뒷 부분 렌더링 막기) : 마테리얼 작성

위 사진과 같이 Pixel Depth값은 언제나 카메라와 가장 가까운 픽셀 값이 출력되고 Custom Depth 값은 깊이 값 전부가 출력됩니다,

그럼 답은 간단합니다 Pixel Depth 값보다 낮은 픽셀을 출력하지 않으면 됩니다.

 

 

1. Custom Depth 버퍼 노드입니다, 버퍼 시각화에서 보던 데이터를 가지고 있습니다.

 

2. PixelDepth 이전에 설명한 PixelDepth 데이터 노드입니다.

 

3. Custom Depth와 Pixel Depth 값이 동일하기 때문에 Pixel Depth값에서 오브젝트의 표면을 거리를 설정하기 위한 Offset 값입니다, 대략 2정도면 됩니다.

 

 

위 마테리얼을 작성하고 Mesh의 디테일에서 커스텀 뎁스를 체크합니다.

 

그런데 안됩니다, 그 이유는 간단합니다, 반투명 쉐이더는 Custom Depth가 안됩니다.

 

 

 


오버드로우 막기(뒷 부분 렌더링 막기) : 문제 해결

이 문제는 Custom Depth에는 보이고 일반 pass에는 보이지 않는 불투명 Mesh를 설치해서 해결합니다.

 

우선 기존에 있던 Mesh에 똑같은 Mesh를 생성합니다.

 

새로 만든 Mesh의 디테일 설정에서 위 두 옵션을 위와 같이 세팅합니다,

Render in Main Pass는 말그대로 메인 Pass에 렌더링하지 않아 투명하게 만드는 것입니다,

그리고 Render CustomDepth Pass를 체크하면 Custom Depth에만 출력되게 됩니다.

 

그리고 불투명(Opaque)로 세팅된 아무런 기능없는 마테리얼을 제작하여 새로만든 Mesh에 적용합니다.

 

메인 pass에 출력되지 않아 화면에 안보이면서 Custom Depth 버퍼에는 인식되게 만들었습니다, 그럼 처음에 의도했던데로 

 

깔끔한 반투명이 구현되었습니다.

 

 


WRITTEN BY
CatDarkGame
Technical Artist dhwlgn12@gmail.com

,