ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [언리얼 블루프린트]포스트 프로세스 사용하기
    Unreal Engine Blueprint/블루프린트를 이용한 게임 만들기 2019. 9. 23. 14:41

    먼저 Post Process란?  

    포스트 프로세싱(Post-processing) 은 전체 화면 필터 및 효과를 화면에 표시하기 전에 카메라의 이미지 버퍼에 적용하는 프로세스입니다.

    포스트 프로세싱은 기존에 렌더링 된 씬에 씬에 렌더링 효과를 더하는 작업입니다. 포스트 프로세싱의 효과는 일반적으로 씬 뷰에 따라 달라지거나, 최종 렌더링 결과물을 생성하기 전에 렌더링 되는 씬 위에 겹쳐서 표시됩니다. 이 기능은 기존 콘텐츠를 수정할 필요 없이 시각적인 효과를 즉시 구현하고 씬의 품질을 한층 개선할 수 있다는 뚜렷한 장점이 있습니다.

     

    하지만 언리얼에서는 이 Post Process 효과를 적용하기 위해서는 언리얼에서 제공하는 Post Process volume을 사용해야 하는데 PostProcessVolume 은 레벨에 추가할 수 있는 특수한 종류의 볼륨으로, 언리얼 엔진 4 에서는 포스트 프로세싱 체인을 활용하지 않기 때문에, 포스트 프로세싱 파라미터를 조작할 수 있는 유일한 방법은 현재 이 볼륨뿐입니다. 실제 사용 방법은 이 볼륨에 Post Process Material을 추가해 Post Process 효과를 얻는 것입니다. 간단히 말하면 UE4에서 Post Process 효과를 얻고 싶다?! -> 씬[레벨]에 Post Process Volume을 배치한다 -> Post Process volume에 Post Process Material을 추가해준다. [좀 더 자세한 내용이나 원하는 내용은 언리얼 공식 사이트에서 찾으면 알 수 있습니다.]

     

    공식 언리얼 사이트에서 설명에 사용되는 사진

    위에 움짤이 오늘 설명을 할 UE4에서 Post Process Material을 짜서 사용해보기입니다. 일단 위에 움짤을 간단히 설명하자면 움직이는 큐브는 저번 글에서 설명했던 간단한 Ai입니다. 그리고 Post Process 적용 X -> 적용 O으로 바뀌면서 멈추게 만든 것입니다. 

     

    이제 위 사진처럼 모드 창에서 포스트 프로세스 볼륨을 씬[레벨]에 배치합니다. 이제 이 볼륨 안에 있는 오브젝트들은 포스트 프로세스 효과를 받는데 그럼 위 사진처럼 볼륨을 크게 잡아야 하나요? 생각을 하는데 그 대답은 경우에 따라 다르다고 생각합니다. 특정 지역에만 효과를 주고 싶고 그 특정 지역이 크다면 크게 잡아야 합니다. 하지만 월드 전체 즉 씬[레벨]에 있는 모든 오브젝트들에게 적용되게 하고 싶다면 볼륨을 크게 잡지 않아도 됩니다. 

    바로 위 사진에 보이듯이 설정을 해주면 가능합니다. 위에서부터 차례대로 설명하자면

    Priority - 이 우선순위이며, 볼륨이 중복될 경우 숫자가 더 큰 볼륨이 작은 볼륨을 오버라이드 합니다.

    Blend Radius - 블랜드 반경을 말하며 블랜딩에 사용되는 볼륨 주위 월드 스페이스 반경을 말합니다.

    Blend Weight - 블랜드 무게 값이며 0~1 값을 가지고 0에 가까울수록 포스트 프로세스의 영향이 없어집니다.(0 값이면 포스트 프로세스가 적용이 안됩니다.) 1에 가까울수록 100%의 영향력을 끼칩니다.

    Infinite Extent(Unbound) - 이 볼륨이 월드 전체에 영향을 줄지, 아니면 볼륨 내부만 영향을 줄지 선택하는 겁니다. 즉 이 옵션을 체크하면 월드 전체에 포스트 프로세스의 효과를 줄 수 있습니다.

     

    이제 머티리얼을 하나 생성해 주시고 열면 위 사진처럼 보이시는데 빨간색 부분에서 Surface를 Post Process로 바꿔주면 이 머티리얼은 이제 Post Process Material이 된 것입니다. 생성해 준 머티리얼을 마우스 우클릭을 통해 머티리얼 인스턴스 생성을 해주세요. 이 인스턴스는 부모가 된 머티리얼을 기반으로 하는 다른 머티리얼입니다. (Ex : 같은 문양에서 다른 색을 사용하는 방법)

    [+머티리얼 인스턴싱이란, 부모 머티리얼이라 불리는 하나의 머티리얼을 만든 다음, 그것을 바탕으로 여러 가지 다양한 모양의 머티리얼을 만드는 것을 말합니다. 이러한 유연성을 내기 위해 머티리얼 인스턴 싱은 상속이란 개념을 사용합니다. 상속이란 단순히 부모가 가진 속성이 자손에게 부여되는 것을 뜻합니다.]

     

    이제 포스트 프로세스 볼륨에서 위 사진에 보이는 옵션을 찾아주고 볼륨에 포스트 프로세스 머티리얼을 추가합니다. [추가할 때는 에셋 레퍼런스로 추가하고 아까 만들어 뒀던 머티리얼 인스턴스로 추가해주세요.]

     

    다음으로 본격적으로 씬[레벨]에 적용이 될 머티리얼을 짜 보겠습니다.

     

    우선 위 사진에 보이는 것처럼 노드를 만들어 줍니다. 이 노드의 설명은 먼저 Lerp을 설명하겠습니다.

    Lerp(A, B, C) AC(B - A)를 리턴한다. A, B, C모두 동일한 타입으로 지정해야 하고 이 함수는 C0인 경우 A , 1인 경우 B돌려주도록 AB사이를 선형 보간 한다.

     

    그림으로 이해하는 Lerp(선형보간)

    즉 SceneTexture:PostProcessInput0(A)에서 SceneTexture:PostProcessInput0 - OneMinus(반전)한 값(B)으로 알파 값에 따라 선형 보간을 하는 식이다. SceneTexture란? 최종적으로 카메라에 랜더링 되어 실제 플레이어가 보는 화면(씬)을 말합니다.  그 뒤에 :PostProcessInput0은 SceneTexture에 대한 옵션이며 PostProcess가 적용되는 씬 텍스쳐를 말합니다. 아무것도 적용이 안된 화면에서 알파 값에 따라 화면이 반전되는 화면으로 넘어가는 식입니다. 이번에는 그 알파 값에 대해 알아보도록 하겠습니다. 

    위 사진이 알파 값에 연결된 노드입니다. 사진만 보고 이해가 가는 노드는 if노드뿐일 거라고 생각합니다. 대충 SphereMask값이 0.9보다 크냐 작냐에 따라 알파 값이 다르게 출력된다고 생각하시면 됩니다. 그럼 SphereMask가 무슨 역할을 하는지 알아보겠습니다.

    SphereMask를 쉽게 설명한 사진

    SphereMask란 B [관측자, 공의 중심]를 기준으로 했을 때 Radius [공의 반경] 안에 A [물체]가 들어오면 1의 값, Radius밖에 있다면 0의 값을 출력하는 노드입니다. Hardness는 0~1의 값을 가지며 공 안팎의 경계를 완만하게 그라 데이 시원합니다.

    그럼 B는 카메라 포지션으로 플레이어가 가지고 있는 카메라라고 한다면 "절대 월드 위치"는 뭘까? 간단하게 말하면 이름 그대로 월드의 위치를 알려주는 노드입니다. 이 포스트 프로세스 볼륨이 적용된 모든 물체들의 위치를 알려준다고 생각하시면 됩니다. Radius라고 쓰여 있는 큰 상자는 머티리얼 파라미터 컬렉션으로 MaterialParameterCollection은 어느 머티리얼에서도 참조 가능한 임의의 스칼라 & 벡터 파라미터 세트를 저장하는 애셋입니다. 이렇게 설정을 해놓으면 나중에 어떤 곳에서 머티리얼 색을 바꾸고 싶을 때 파라미터 컬렉션에 정의된 변수의 값을 바꿔주면 파라미터 컬렉션 변수가 사용된 모든 머티리얼이 바뀝니다. 쉽게 말하자면 스칼라 변수와 벡터 변수들을 미리 정의해놓고 사용하겠다 라고 생각하시면 편합니다. 플레이어 위치와 월드 내 어떤 물체든 공의 경계에 따라 1과 0 값을 리턴하는 알파 값에 대해 알아봤습니다. 이제 다음 연결된 노드를 확인하겠습니다.

    위 사진만 봐서는 어떤 노드에서 연결이 된 건지 잘 모를 겁니다. 우선 A 노드는 맨 처음에 선형 보간인 Lerp에 값으로 연결되어 있습니다. B는 PostProcess 볼륨이 적용된 곳에 반전이 된 색으로 연결이 되어 있으며 마지막으로 알파에는 머티리얼 파라미터 컬렉션인 Radius가 연결되어 있습니다. 

    최종적으로 연결 된 모습

    그럼 왜 저렇게 연결되어있냐에 대한 설명입니다. 우선 맨 처음 Lerp노드를 보면 플레이어와 물체가 경계에 따라 안에 들어오면 1 밖일 때 0의 값을 출력 해 밖인 0일 때는 보통의 색을 가진 월드와 경계 안에 들어오면 1인 반전된 색을 가진 월드를 출력할 겁니다. 그 값을 다시 Radius의 값에 따라 점점 경계 밖에 있었던 모든 물체나 오브젝트를 반전된 색을 가진 월드로 바꾸는 노드입니다. 그럼 경계에 따라 반전되는 색을 가지지만 최종적으로 반전된 색을 가진 월드로 점점 바뀌게 됩니다. [맨 처음 사진에서 본 것처럼] 

     

    마지막으로 이제 이 머티리얼을 적용시키고 머티리얼 파라미터 컬렉션의 값을 조정해줘야 합니다.

    플레이어 블루프린트 안에 만들어주세요

    플레이어 블루프린트 안에 b키를 눌렀을 때 발생되는 이벤트를 만들겠습니다. RaduisTime이라고 쓰여 있는 노드는 Timeline 노드로 지정한 시간만큼 지정한 변수를 리턴하는 함수입니다. Timeline 함수에 따라 b키를 눌렀을 때 타임 라인 노드가 실행이 되며 그 값에 따라 파라미터 컬렉션인 Radius값이 바뀌는 노드입니다. 또다시 b키를 누르면 reverse로 연결된 것을 봐서는 거꾸로 진행된다는 것을 알 수 있습니다. 그럼 실제 타임라인 노드 안을 살펴보겠습니다.

    타임라인 노드를 더블 클릭해서 열어보면 이런 화면을 볼 수 있습니다. 쉽게 설명하자면 타임라인이 끝나고 리턴하는 값을 빨간색 동그라미 부분에서 정할 수 있습니다. [float, vector 등] 파라미터 컬렉션 raduis값은 스칼라인 float형이니 float형으로 추가해주세요. 추가를 해주고 리턴하는 값의 이름을 정해주신 다음에 그래프에서 우클릭을 통해 원하는 시간에 원하는 키값을 정해줄 수 있습니다. 0초에서 0 값을 5초에서 1 값으로 키 값을 지정해주면 이 그래프는 5초 동안 노드가 진행이 되며 0에서 1로 가는 값을 5초 동안 리턴하는 노드가 완성이 됩니다. 이렇게 포스트 프로세스에 대한 설명도 끝났습니다. 이번 글은 쓰면서 설명을 잘 못했다고 생각이 듭니다. 이해가 안 가는 부분이 있으시다면 댓글을 달아주세요.

Designed by Tistory.