Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공부용 이모저모

UE4 - 벽에 가려진 캐릭터 특정 색상으로 표시 + 림라이트 표시 본문

UE4 - 블루프린트

UE4 - 벽에 가려진 캐릭터 특정 색상으로 표시 + 림라이트 표시

불타는버스 2021. 7. 8. 16:38

참조 블로그:https://eastroot1590.tistory.com/entry/UE4-Advenced-%EB%B2%BD-%EB%92%A4%EC%97%90%EC%9E%88%EB%8A%94-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8-%EA%B7%B8%EB%A6%AC%EA%B8%B0-feat-Custom-Depth

 

UE4 Expert | 벽 뒤에있는 오브젝트 그리기 Custom Depth

위도우 메이커는 궁극기를 쓰면 벽 뒤에있는 적들의 실루엣을 볼 수 있다. 3D 게임에서 벽 뒤에있는 물체를 볼 수 없는 이유는 렌더링을 할 때 카메라와의 거리를 계산해서 더 가까이에 있는 물

eastroot1590.tistory.com

대충 이런 효과이다

이 기능을 구현하기 전에 앞서 포스트 프로세스에 대한 개념이 필요하다.

액터 배치에 존재하는걸 Scene으로 끌어들인다.
박스모양으로 영역을 세팅 해 줄 수 있다.

포스트 프로세스 블룸은 해당 범위안에 있으면 전체적으로 효과를 줄 수 있다.

메테리얼을 전체적으로 적용 하기도 되고, 블룸 등 다양한 효과를 줄 수 있다.

블룸효과를 주었을때

이번엔 포스트 프로세스에 적용할 포스트 프로세스용 머테리얼을 만든다.

머테리얼 Domain을 Post Process용으로 만들고, Blendable Location을 After Tonemapping으로 적용한다.
앞서 만든 포스트 프로세스 블룸의 디테일에, 포스트 프로세스 머테리얼을 찾아 생성하고 에셋 레퍼런스를 선택한다.
이제 포스트 프로세스용으로 만든 매테리얼을 적용시킨다.

우선 언리얼의 깊이 체크는 3종류가 있다.

디테일에서 pass라고 검색하면 딱 3가지가 뜨는데,

Main Pass:말그대로 메쉬 그 자체를 그려준다.

Depth Pass:픽셀간의 거리를 체크한다.Z-SORT에 쓰인다.

CustomDepth Pass:개발자가 사용하는 Depth정보로, 일반적으로는 사용 되지 않는다.

CustomDepth는 SceneDepth와 공유하지 않고, CustomDepth끼리만 참조한다.

즉 벽을 CustomDepth해두지 않으면, 벽 뒤에 CustomDepth 해놓은 액터를 정확히 체크한다.

벽에 가려져도 보이고 싶은 객체의 CustomDepth을 체크해준다.

우선 customDepth을 사용한 이들을 표시하기 위해 Post Process Material을 수정한다.

Mask는 ComponentMask로 검색하면 된다. SceneTexture:CustomDepth는 SceneTexture을 부르고 Scene Texture id를 수정한다.

Custom Depth 버퍼의 거리에 따라서 어둡고 밝게 하는거로 표시하려고한다.

Depth는 가까울수록 값이 0에 수렴하고,멀어질수록 수치가 올라간다.

이미시브 컬러에서 1이상의 값은 다 하얗게 나오기 때문에, Divide로 적당히 나눈다.

너무 Divide 수치가 높아지면 저-멀리 있는 캐릭터도 표시가 되기 때문에 수치 조절은 알아서 한다.

CustomDepth를 사용한 액터 외엔 전부 하얗게 표기된다.

 Custom Depth를 적용 안한 것들이 다 하얗게 표기되는 이유는,

Custom Depth를 적용 안한 액터들은 전부 infinite로 적용된다고 한다.

 

Custom Depth를 화면에 표기하는것 까진 확인이 되었으니

이제 실제 화면과 병합한다.

 

Lerp는 LinearInterpolate를 치면 나온다, 색상은 Constant3Vector

Lerp는 알파를 기점으로,알파가 0.0이면 A를, 1.0이면 B를, 사이값이면 두 색상을 혼합한다.

일단 Devide를 해도 1을 넘기 때문에, Clamp로 수치를 제한한다.

Clamp는 0부터 1 사이의 값 외엔 다 자르는 기능이다.이걸 넣지않으면 배경이 이상해진다.

Clamp를 걸지 않을경우

PostProcessInput0은,포스트 프로세스의 0번이다.여기서 RGB값을 받아서 그리면

포스트 프로세스 블룸에서 1차효과를 받은 화면이 전달 된다.

현재로썬 아무 효과도 넣지 않았으니 보여지는 그대로이다.만약 Bloom등을 적용시켰다면

적용한 화면을 기준으로 계산된다.

적용했을 경우 Custom Depth를 사용한 캐릭터만 색이 변한다.
Ceil은 소수점을 올려 정수로 만든다.Subtract는 A - B이다. 윗부분에 Add를 추가한것은, 포스트 프로세스 효과를 받을경우를 대비했다.

벽 뒤에 있을경우 CustomDepth가 SceneDepth보다 더 길다. SceneDepth는 벽에서 막히기 때문이다.

둘을 빼준 이유는 벽에 가려진부분만 걸러낼 필요가 있어서이다. 벽에 가려지지 않았다면,

SceneDepth와 CustomDepth는 같은 Depth이므로 0을 반환시키고, 막혀있을경우만 오차값이 나온다.

SceneDepth의 값과 CustomDepth를 뺀 거리를 체크하여, 정수화 시키고 뒤집는다.

 

윗 줄만 적용 시켰을 경우,
아랫줄만 적용시켰을 경우. 1-x를 하지않으면 액터의 보이는부분만 칠해진다.

두 결과물을 MAX할경우, 양쪽 한곳이라도 1인 부분은 기존색상으로 그려질 것이기 때문에

자연스럽게 가려진 부분만 표시가 된다.

 

결과물
아쉬운건 Custom Depth를 쓰는 캐릭터간에 가려질경우엔 적용이 안된다.(팔부분이 발을 가린다)

림라이트

이번엔 투명한 부분을 림라이트로 표시하는걸 해본다.

액터 하나만 가지고 처리해보고 싶었지만, custom depth의 대상이 될 액터가 필요해서

액터를 두개 사용했다. 한개로 할수있는 방법은 좀 더 고민해봐야 할 것 같다.

 

대상 액터를 하나 더만들거나, 애니메이션만 따라 동작할 액터를 만들어다 자식으로 붙인다. 
메테리얼을 만들고, 디테일 란에 Disable Depth Test를 활성화시키면 깊이 상관없이 캐릭터가 그려지게 된다.
SceneDepth와 CustomDepth를 뺀 결과값이 0인지 체크해, 0이 아니라면(벽에 가려져있다면) 기존 값을 보내준다.
위의 결과값을 두 Alpha에 넣어주고, 0이라면 림라이트를 그려주고, 1에 가깝다면 그리지않는다(0,0,0,0)
메쉬하나로 해결 할 수 있는 방법도 찾아봐야한다.