본문 바로가기

Unreal Engine

UE5에서 투명한 바닥에 반사 표현하기

정석이라기보다는 꼼수에 가까운 방법들임

UE5에서 작업했지만 UE4에서도 적용 가능하며, 모바일 프로젝트에서도 사용 가능

 

이렇게 빈 공간 안에 떠 있는 캐릭터(또는 오브젝트) 발 밑에 반사처리를 해야 하는 경우 어떻게 해야 할까?

 

투명한 바닥 위에 캐릭터를 세우면 될 것 같지만, 바닥의 투명도가 증가할수록 그림자도 점점 투명해지기 때문에

위와 같이 거울과 같은 반사를 얻을 수 없다.

 


방법 1. Screen Reflection

0. 프로젝트 셋팅의 Support Global clip plane for Planar Reflections 를 활성화 한다. (퍼포먼스에 영향이 있다)

Support Global clip plane for Planar Reflections = true

1. 레벨에 노멀이 안쪽으로 뒤집힌 Sphere를 배치한다. 에디터 기본 메시에 포함되어 있으니 이것을 복사해서 사용하면 된다. 경로는 아래와 같다.
StaticMesh'/Engine/EditorMeshes/AssetViewer/Sphere_inversenormals.Sphere_inversenormals'

Sphere_inversenormal

화면에 꽉 차도록 Sphere의 크기를 충분히 키워준다. 나는 적당히 각 축 방향으로 200배씩 키워주었다.

 

2. 반사 이미지를 띄울 바닥 메시를 배치한다. 나는 엔진 기본 컨텐츠에 포함된 Plane 메시를 사용하였다. 바닥에 요철 등의 추가적인 이 필요한 경우, 이 메시에서 표현해 주면 된다. 크기는 반사 이미지가 잘리지 않도록 화면 아래쪽을 충분히 커버해 줄 정도로 키워준다. 나는 각 축마다 100베 정도로 키워주었다.

이때, 바닥 매시보다 Sphere메시가 충분히 커서 바닥 메시와 Sphere가 겹치는 일이 없어야 한다.

Sphere 와 Plane이 배치된 모습

3. PlanarReflection 액터를 추가한다. 이 액터에는 반사를 위한 PlanarReflectionComponent와 SceneCaptureComponent가 달려 있다.
PlanarReflection 액터의 위치를 바닥 Plane과 일치시키고, 바닥을 완전히 덮도록 크기를 조정한다. PlanarReflection이 바닥 메시 영역을 완전히 덮지 못하면, 그 부분이 카메라에 잡힐 때 아티팩트가 생긴다. 

Planar Reflection 액터 추가

4. 레벨에 PostProcessVolume을 추가한다. 레벨 전체에 영행을 주기 위해 UnBound로 설정하고, Reflection Method를 Lumen에서 Screen Space로 변경한다.

아래 파라미터에서 Screen Space 관련 추가적인 설정이 가능하다.

이제 이 레벨은 Lumen 반사 대신 Screen Space Reflection 만을 사용한다. Lumen은 장면 전체를 기반으로 반사상을 그리기 때문에, 물체를 선택적으로 반사하지 못한다. 게다가 Lumen은 실제 오브젝트 그대로의 모습이 아닌 Signed Distance Field라는 간소화된 형태의 오브젝트를 그리게 되는데, 이것은 우리가 원하는 방향이 아니다.
이에 대한 자세한 내용은 아래 문서에 있다.

https://docs.unrealengine.com/5.0/en-US/lumen-technical-details-in-unreal-engine/

 

5. 앞에서 배치한 Sphere는 레벨의 배경이 될 것이고, Plane은 반사된 이미지를 띄우는 바닥이 된다.

 

5-1. 바닥 메시에 거울 같은 머터리얼을 입힌다. 머터리얼 내용은 아래와 같다.

  • Shading Model Default Lit
  • BaseColor 1.0
  • Metalic 1.0
  • Roughness 0.0

5-2. Sphere에도 배경 머터리얼을 입혀준다. 

  • Shading Model Unlit
  • Emissive Color : 원하는 배경 텍스처

이때, 배경 텍스처는 Screen Aligned UV 를 사용한다. 이렇게 하면 카메라 위치나 각도에 관계없이, 텍스처가 항상 화면을 채우게 된다.

Screen Alighend UV

바닥과 sphere에 머터리얼을 적용해 본 모습은 아래와 같다.

이제 여기에 라이트와 모델을 추가헤 주면 된다.

 

 

캐릭터 뒷쪽의 백라이트 효과를 위해서 Exponential Height Fog 의 Volumetric Fog를 활성화 해 주었다.

이때 뒷쪽에 생기는 경계는 Fog Cutoff Distance를 늘려 주면 사라진다.

Fog Cutoff Distance 0

 

Fog Cutoff Distance 300

 

퍼포먼스를 위해서는 Reflection Capture 가 씬 전체가 아닌 Show Only Actors만을 반사하도록 설정해 주는 게 좋다.

Show Only Actors 목록에는 Sphere와 반사될 액터가 포함되어야 한다.


 

방법 2. 메쉬를 두 번 그리기

같은 메시를 한번 더 그리되, 바닥을 기준으로 버텍스 위치를 -z 방향으로 옮겨 준다. 이렇게 하면, 반사된 상의 색을 마음대로 바꿀 수 있다.

 

머터리얼에서 필요한 셋팅은 아래와 같다.

  • World Position Offset : 기존 버텍스 Z 위치의 2배만큼 -Z 축 방향으로 옮겨준다.
    이렇게 하면 월드 좌표 0 기준으로 아래 방향으로 높이가 반전된다.
  • Normal : 위치가 반전되면서 노멀도 뒤집어지기 때문에, -1을 곱해 다시 뒤집어 준다.
  • Is Refiection (Scalar) : 현재 머터리얼을 위치와 노멀이 반전된 머터리얼로 만들기 위한 스위치 역할을 한다.
    Static Switch Parameter일 경우 런타임에 켰다 껐다 할 수 없기 때문에 이 값을 블루프린트에서 스위치 대신 사용한다. 값이 0이면 원래 World Position Offset과 Normal 값을 사용하고, 1이면 각각 반전시킨 값들을 사용한다.
    원래 값에서 반전된 값으로 보간할 게 아니고, 둘 중에 하나의 값을 선택할 것이기 때문에, Step으로 0 또는 1 값만 들어가도록 하였다.

이렇게 셋팅된 Material Attribute는 아래와 같다.

액터 클래스의 블루프린트 BP_SpawnReflection을 생성하고, 아래 두 함수를 추가하였다.

 

Collect Components

0. 반사시키고 싶은 액터들 배열을 유저 인풋으로 받는다.

1. 인풋으로 받은 액터들의 컴포넌트 중 스켈레탈 메시 컴포넌트와 스태틱 메시 컴포넌트만을 얻어 배열에 저장한다.

Duplicate Components

2. 저장한 배열들에 있는 컴포넌트 갯수만큼, 같은 클래스로 현재 액터에 컴포넌트를 생성해 달아준다.

각 컴포넌트와 새로 생성한 컴포넌트는 월드 상의 위치가 일치하도록 해야 한다.


3. Staic Mesh (또는 Skeletal Mesh) 와 머터리얼을 새로 생성한 컴퍼넌트에 똑같이 적용해 준다.

4. 각 머터리얼의 Material Instance Dynamic을 생성해 적용하고, 위에서 만든 IsReflection 파라미터를 1로 넣어준다.

 

이렇게 하면, 위치와 노멀이 반전된 새로운 메쉬 컴포넌트들이 현재 액터 아래에 생성된다. 

아래는 위 함수들을 차례로 실행시킨 결과이다. (월드에는 BP_SpawnReflection 액터와 Sphere, 캐릭터만 있다)