빛이 이를테면 공기에서 물로 전달되는 것과 같이 한 매체에서 다른 매체로 전달될 때 두 매체가 만나는 지점에서 빛의 이동 방향이 바뀝니다. 이러한 빛 현상을 리프랙션(굴절)이라고 하며, 빛이 다른 물질에 전달될 때 빛 파동의 속도가 달라지기 때문에 발생합니다. 언리얼 엔진에서는 메인 머티리얼 노드의 Refraction 입력을 사용하여 머티리얼에서 이러한 빛 현상을 시뮬레이션할 수 있습니다.
리프랙션
리프랙션 은 빛이 투과되는 매체에 따라 빛의 파동 방향이 바뀌는 현상을 설명하는 용어입니다. 다시 말해, 빛이 물이나 유리 같은 특정 표면에 닿을 때 빛이 표면을 투과하는 속도에 표면이 영향을 끼치기 때문에 빛이 휘어지거나 방향이 바뀌게 됩니다.
물이 담긴 그릇에 연필을 살짝 담가 보면 리프랙션의 전형적인 예를 확인할 수 있습니다. 연필이 물과 교차되는 지점에서 휘어지거나 방향이 바뀌어 보일 것입니다. 아래 이미지는 리프랙션의 원리를 보여줍니다.

X 는 연필을 물에 담갔을 때 실제 물리적 위치를 나타냅니다. 물속에 잠긴 연필 부분의 광선이 공기와 물의 접점에서 굴절되어 속도와 방향이 바뀝니다. 카메라의 시점에서 연필은 끝부분이 진짜 위치인 X 대신 Y 위치에 나타나므로, 물의 표면에서 구부러져 보입니다.
리프랙션 인덱스(IOR)
리프랙션 인덱스(Index of Refraction, IOR) 는 빛이 특정 물질에 입사할 때 휘어지거나 굴절되는 정도를 나타내는 광학 측정 단위입니다. 리프랙션 인덱스는 측정 가능하며, 일상적 표면의 실제 값이 잘 알려져 있습니다. 언리얼 엔진에서 리프랙션 머티리얼 제작 시 머티리얼의 사실감을 살리기 위해 실제 IOR 값을 사용하는 것이 가장 좋습니다. 아래 표에는 몇 가지 일상적 표면 타입에 대해 측정된 IOR 값이 나와 있습니다.
물질 | IOR 값 |
---|---|
공기 | 1.00 |
물 | 1.33 |
얼음 | 1.31 |
플렉시글라스 | 1.49 |
유리 | 1.52 |
다이아몬드 | 2.42 |
머티리얼에 리프랙션 사용하기
아래 인스트럭션을 따라 리프랙션을 사용하는 머티리얼을 생성합니다.
이 튜토리얼에서는 언리얼 엔진 시작용 콘텐츠에 포함된 에셋을 사용합니다. 프로젝트에 시작용 콘텐츠를 포함하지 않았다면 에셋 이주하기 페이지를 읽고 현재 프로젝트에 시작용 콘텐츠를 이주하는 방법을 알아보세요.
-
콘텐츠 브라우저 에서 우클릭 하고 컨텍스트 메뉴의 기본 에셋 생성(Create Basic Asset) 섹션에서 머티리얼(Material) 을 선택합니다. 머티리얼의 이름을 RefractionMaterial 로 변경합니다.
-
머티리얼 에셋을 더블클릭 하여 머티리얼 에디터에서 엽니다.
-
디테일 패널에서 블렌드 모드(Blend Mode) 를 불투명(Opaque) 에서 반투명(Translucent) 으로 변경합니다. 반투명 섹션을 펼치고 라이팅 모델(Lighting Model) 을 볼류메트릭 비방향성(Volumetric Non Directional) 에서 표면 반투명 볼륨(Surface Translucency Volume) 으로 변경합니다. 이 세팅을 변경하면 메인 머티리얼 노드에서 Refraction 핀이 활성화됩니다. 완료 시 디테일(Details) 패널 프로퍼티는 다음과 같은 모습입니다.
-
다음 머티리얼 표현식 노드를 검색하여 아래에 나와 있는 개수만큼 그래프에 추가합니다. 머티리얼 그래프는 아래 이미지와 같습니다.
- Constant x 3
- Scalar Parameter x 2
- Lerp x 1
- Fresnel x 1
-
아래와 같이 머티리얼 와이어 연결을 시작합니다. Base Color 및 Metallic으로 들어가는 상수 값을 1 로 변경합니다. 스칼라 파라미터 중 하나의 이름을 Opacity 로 변경하고 디폴트값을 0.3 으로 지정하여 Opacity 입력에 연결합니다.
-
두 번째 스칼라 파라미터의 이름을 IOR 로 변경하고 디폴트값을 유리의 IOR 값인 1.52 로 변경합니다. 이미지의 윤곽선 부분에 표시된 대로 머티리얼 연결을 완료합니다.
유리는 모든 시야각에서 동일한 방식으로 빛을 굴절시키지 않기 때문에, Fresnel 머티리얼 표현식을 사용하여 Lerp 노드의 두 값을 블렌딩합니다. 유리는 정면에서 봤을 때 그리 많은 빛을 굴절시키지 않지만, 비스듬한 각도에서 보면 굴절이 뚜렷해집니다. Fresnel 노드는 이 이펙트를 재현합니다. 입력 A의 상수 값은 머티리얼의 중앙에 매핑되며, 입력 B의 IOR 파라미터 는 스피어의 곡선이 카메라에서 멀어지는 에지에 매핑됩니다.
Fresnel 머티리얼 표현식의 작동 방식을 자세히 알아보려면 머티리얼에서 프레넬 사용하기 페이지를 참조하세요.
-
툴바에서 적용(Apply) 및 저장(Save) 을 클릭하여 머티리얼을 컴파일하고 에셋을 저장합니다. 머티리얼을 저장한 후에는 머티리얼 에디터를 닫아도 됩니다.
-
콘텐츠 브라우저에서 RefractionMaterial 에셋을 찾아 섬네일을 우클릭 하고 컨텍스트 메뉴에서 머티리얼 인스턴스 생성(Create Material Instance) 을 선택합니다.
-
머티리얼을 테스트하기 위해 씬에 몇 가지 오브젝트를 드롭합니다. 아래 예시에서는 StarterContent > Shapes 폴더에 있는 에셋을 사용하지만, 어떤 오브젝트든 괜찮습니다. 콘텐츠 브라우저의 RefractiveMaterial_Inst 에셋을 씬의 메시로 드래그합니다. 스피어 에지에서는 빛이 굴절되지만, 지오메트리가 카메라 정면에 있는 스피어 중앙에서는 빛이 굴절되지 않는 모습을 눈여겨보세요. 이는 위에서 설명한 프레넬 로직의 결과입니다.
-
RefractionMasterial_Inst 를 더블클릭하여 머티리얼 인스턴스 에디터에서 엽니다. 파라미터 이름 옆의 박스에 체크하여 IOR 파라미터 를 활성화합니다. 활성화되면 IOR을 다양한 값으로 설정하여 다양한 표면 상호작용을 시뮬레이션할 수 있습니다. 아래 영상은 IOR 값을 1.0(공기), 1.33(물), 1.52(유리), 2.42(다이아몬드)로 설정할 때 리프랙션이 어떻게 변화하는지 보여줍니다.
리프랙션 팁 & 트릭
이 섹션에서는 리프랙션을 머티리얼 에디터의 다른 요소와 조합하여 복잡하고 흥미로운 굴절 표면을 만드는 몇 가지 방법을 제시합니다.
리프랙션과 노멀 맵
굴절 머티리얼에 노멀 맵을 사용하는 옵션을 추가하면 매우 흥미로운 결과가 나오며, 노멀 맵에 눈여겨볼 만한 디테일이 많은 영역에서 특히 그렇습니다. 다음 단계를 따라 위에서 생성한 RefractiveMaterial 이 노멀 맵에 작동하도록 수정해 보세요.
-
먼저, 사용할 노멀 맵을 찾습니다. 이 예시에서는 시작용 콘텐츠의 T_Water_N 을 사용했지만, 어떤 노멀 텍스처든 사용 가능합니다. RefractionMaterial 에셋을 열고 노멀 텍스처를 콘텐츠 브라우저 에서 머티리얼 그래프로 드래그합니다.
-
노멀 맵 텍스처 샘플러를 우클릭 하고 파라미터로 변환(Convert to Parameter) 을 선택합니다. 파라미터 이름을 Normal Map 으로 변경하고 메인 머티리얼 노드의 Normal 입력에 연결합니다. 텍스처를 파라미터화하면 아티스트가 부모 머티리얼을 편집하지 않아도 머티리얼 인스턴스에서 오버라이드할 수 있습니다.
-
툴바에서 적용 및 저장 을 클릭한 다음, 머티리얼을 닫습니다.
-
이제 머티리얼 인스턴스 에디터에서 글로벌 텍스처 파라미터 값 아래에 노멀 맵(Normal Map) 파라미터가 보입니다. 파라미터를 활성화하고 드롭다운 메뉴에서 다른 텍스처를 선택하여 노멀 맵을 오버라이드할 수 있습니다.
-
노멀 맵을 변경하면 머티리얼의 리프랙션을 흥미로운 방식으로 변경할 수 있습니다. 아래 이미지는 시작용 콘텐츠의 Textures 폴더에서 찾을 수 있는 노멀 맵만 사용한 일부 예시입니다.
리프랙션과 모션
리프랙션을 모션과 결합하는 것은 대다수 타입의 머티리얼에서 핵심적인 요소입니다. 물결은 한 가지 예일 뿐이며, 이 기법은 아지랑이, 거대한 폭발로 인한 디스토션 또는 에너지 이펙트 등 수많은 VFX 머티리얼에도 마찬가지로 유용합니다.
아래 그래프는 노멀에 유기적으로 보이는 모션을 추가하는 한 가지 방법을 보여줍니다. 노멀 맵을 복제하여 Lerp 노드의 A와 B 입력에 연결합니다. 그래프에 2개의 Panner 머티리얼 표현식을 추가하고 노멀 맵 텍스처의 UV에 연결합니다.

Panner 노드의 값을 변경하여 텍스처에 모션을 추가합니다. 일부 값을 음수로 설정하면 텍스처가 반대 방향으로 이동하며, 이는 유기적이고 랜덤해 보이는 모션을 구현하기에 좋은 방법입니다. 이 예시에서 두 패너에 사용된 값은 다음과 같습니다.

결과는 아래 영상에서 볼 수 있습니다. 현재 상태는 미끄러운 금속성의 유체와 비슷해 보이지만, 어느 정도의 수정을 거치면 물 머티리얼의 밑바탕으로 활용할 수 있습니다.
리프랙션 뎁스 바이어스
리프랙션 뎁스 바이어스(Refraction Depth Bias) 는 가까이 있는 오브젝트가 예각인 시야각에서 왜곡된 표면으로 렌더링되는 것을 방지하기 위한 한 가지 방법입니다. 하지만 이로 인해 표면과 리프랙션이 시작되는 위치 사이에 단절이 늘어날 수 있습니다. 리프랙션 뎁스 바이어스 는 다음 두 위치에서 조정할 수 있습니다.
-
머티리얼 에디터 - 디테일 패널의 머티리얼 섹션에서 리프랙션 뎁스 바이어스 를 찾을 수 있습니다. 이 프로퍼티를 노출하려면 흰색 삼각형(녹색으로 강조 표시됨)을 눌러야 합니다.
-
머티리얼 인스턴스 에디터 - 디테일 패널의 일반(General) 섹션에서 리프랙션 뎁스 바이어스 를 찾을 수 있습니다.
결론
머티리얼에 리프랙션을 더하는 것은 유리, 물 등의 반투명 머티리얼에서 사실적으로 보이는 결과를 얻기 위한 좋은 방법입니다. 문서 상단의 차트를 참조하여 시뮬레이션하려는 표면 타입에 올바른 IOR 값을 사용하세요. IOR 값은 실제 측정값이므로, 사실성을 추구한다면 IOR 값을 높이거나 낮추는 것은 권장하지 않습니다. 물론 VFX 및 리프랙션을 느슨하게 적용하는 다른 사례에서 원하는 미적 기준에 맞는 값을 실험적으로 사용할 수 있습니다.