본문으로 건너뛰기
VFX Diary
VFX Diary
레퍼런스

Unreal Pixel Normal Offset 읽기: 넓은 수면의 굴절은 왜 IOR와 다를까

물 아래 무늬가 흔들리면 수면이 금방 살아 보입니다. 하지만 잔물결의 흔들림과 배경 전체가 밀리는 현상은 따로 살펴야 합니다. 이번에 읽을 질문은 Unreal Material에서 넓은 수면을 굴절시킬 때 왜 Pixel Normal Offset를 선택하는가입니다. 굴절 값을 크게 주는 방법보다, 무엇을 기준으로 배경을 옮기는지에 주목했습니다.

Epic 공식 문서를 AI의 도움으로 읽고 정리했습니다. 열람한 페이지는 Unreal Engine 5.8 문서로 표시되지만, 이것이 5.8에 새로 생긴 기능이라는 뜻은 아닙니다. 실제 엔진 재현이나 성능 측정은 하지 않았습니다. 아래의 비교 순서는 문서에서 도출한 시험 제안이며, 이미지 세 장도 실제 엔진 결과와 구분한 개념 일러스트입니다.

잔물결이 있는 얕은 수면 아래의 돌과 타일을 표현한 굴절 개념 장면
AI 생성 개념 이미지 — 넓은 수면과 국소적인 잔물결을 생각하기 위한 일러스트입니다. 실제 Unreal 굴절 결과나 검증 캡처가 아닙니다.

물의 굴절률과 화면에서 읽을 위치는 다른 문제

Using Refraction은 매질이 바뀔 때 빛의 진행 방향이 달라지는 현상과 IOR(Index of Refraction)를 설명합니다. 표에는 물 1.33, 유리 1.52 같은 값이 나옵니다. 이 수치는 물질의 광학적 성질을 이해하는 출발점입니다. 다만 값을 넣었다는 사실만으로 특정 렌더링 경로가 화면 밖의 배경까지 정확히 구해 준다고 판단할 수는 없습니다.

Pixel Normal Offset 문서는 IOR 방식이 작은 병이나 굽은 유리 표면에 잘 맞는 반면, 큰 평면에서는 Scene Color의 화면 밖 영역을 읽으려는 문제가 생길 수 있다고 설명합니다. 여기서 Scene Color는 이미 렌더링된 장면의 색 데이터입니다. 큰 수면을 볼 때 생기는 어색함을 전부 노멀 텍스처의 품질 탓으로 돌리지 않게 하는 대목입니다.

제가 나누어 보고 싶은 것도 이 두 층입니다. 물처럼 보일 광학적 기준과, 현재 화면의 어느 색을 가져올 수 있는가는 같은 질문이 아닙니다. 배경이 통째로 밀리는 증상이라면 노멀의 세부 무늬를 늘리기 전에 굴절 방식과 카메라 각도를 먼저 확인하겠습니다. 이는 문서를 읽고 정한 점검 순서이지 특정 프로젝트에서 확인한 해결책은 아닙니다.

PNO가 기준으로 삼는 것은 버텍스 법선

Pixel Normal Offset(PNO)는 버텍스 법선에 비해 픽셀 법선이 얼마나 달라지는지를 이용해 굴절 오프셋을 구합니다. Material Properties의 Refraction 항목은 이를 비물리적 모델로 분류하며 탄젠트 공간 법선에서만 유효하다고 명시합니다. IOR의 다른 이름으로 읽으면 입력값부터 혼동하기 쉽습니다.

문서의 기본 노멀 (0, 0, 1)은 이 방식에서 굴절을 만들지 않습니다. 따라서 평평한 기준 상태와 요철이 더해진 상태를 분리해 볼 수 있습니다. “노멀을 연결하지 않았는데 배경이 안 움직인다”는 장면은 PNO에서 곧바로 고장이라고 할 수 없습니다. 반대로 왜곡이 필요하다면 노멀 입력과 공간 설정을 먼저 확인할 이유가 됩니다.

저는 이 기준을 잔물결만 남기기 위한 출발점으로 이해했습니다. 표면 전체의 기울기에서 생기는 이동과 국소적인 표면 변화의 효과를 구분하려는 선택입니다. 단, 버텍스 법선과 픽셀 법선의 차이를 사용한다는 개념 설명을 그대로 두 벡터의 단순 뺄셈 코드로 옮겨도 된다는 뜻은 아닙니다. 이 글에서는 엔진 셰이더 구현을 추출하거나 동등한 계산식을 검증하지 않았습니다.

평평한 투명 판과 미세한 물결이 있는 판을 나란히 둔 법선 차이 개념 이미지
AI 생성 개념 이미지 — 평평한 표면과 요철이 있는 표면을 대비한 시각적 비유입니다. PNO 계산 구조도나 IOR와의 실제 렌더링 비교가 아닙니다.

같은 1.33을 넣어도 같은 의미가 아니다

Material Properties는 PNO의 Refraction 입력을 오프셋의 스케일로 설명합니다. 1.0은 굴절 없음, 2.0은 오프셋 스케일 1.0에 대응합니다. 이 대응을 알고 나면 물의 IOR인 1.33을 PNO에도 넣고 “물리적으로 같은 물”이라고 부르는 실수를 피할 수 있습니다. 숫자의 모양보다 선택한 방식에서 그 입력을 어떻게 해석하는지가 먼저입니다.

공식 PNO 예시는 1.0에서 2.0으로 바꾸며 변화를 보여 줍니다. 이것을 모든 수면에 권장되는 완성값으로 가져오고 싶지는 않습니다. 제안할 비교는 동일한 카메라와 동일한 노멀에서 1.0을 기준으로 시작하고, 작은 단계로 강도를 올리며 배경의 읽힘을 보는 것입니다. 강도와 노멀의 변화량을 동시에 바꾸면 무엇 때문에 달라졌는지 판단하기 어렵겠습니다.

IOR와 PNO를 비교할 때도 “같은 숫자”와 “비슷한 화면의 왜곡량”을 별도 조건으로 기록하고 싶습니다. 전자는 입력 해석의 차이를 확인하는 데, 후자는 원하는 인상을 어느 방식으로 조절할지 살피는 데 쓰겠습니다. 어느 쪽도 이번 글에서 실행한 비교는 아니며, PNO가 더 빠르다는 성능 결론도 내리지 않습니다.

화면 경계와 앞쪽 물체는 별도 질문으로 남는다

PNO는 Scene Color를 읽는 위치를 바꾸는 방식입니다. 속성 문서도 화면 밖을 읽지 않도록 오프셋을 작게 유지해야 한다고 적습니다. 따라서 큰 평면의 상수 이동을 줄이는 선택을 화면 밖 정보의 복원으로 이해해서는 안 되겠습니다. 화면 경계의 데이터 제약은 여전히 남는다는 것은 이 읽기 구조에서 도출한 해석입니다. 강한 노멀과 큰 오프셋에서도 경계가 항상 안전하다고 보장하는 문장은 아닙니다.

작성 중에는 “앞에 있는 물체가 굴절 표면 안으로 따라 들어오는 문제도 같은 설정으로 고치나?”라는 질문이 생겨 Refraction Depth Bias 설명을 추가로 확인했습니다. 가까운 물체가 왜곡에 섞이는 현상을 줄이는 조절이지만, 높이면 표면과 굴절이 시작되는 곳 사이가 벌어져 보일 수 있습니다. 화면 밖 데이터가 없는 문제를 해결하는 기능으로 읽을 근거는 없습니다.

앞서 다룬 DepthFade의 접촉 이음새와도 구분하겠습니다. 투명 표면의 접촉 알파, 굴절에 끌려오는 전경, 화면 가장자리의 색 조회는 겉으로는 모두 경계 문제처럼 보여도 점검할 대상이 다릅니다. 저는 먼저 증상이 나타나는 위치를 적고, 하나의 숫자로 세 문제를 한꺼번에 조절하지 않는 쪽을 택하겠습니다.

제한된 시야 틀 안에서 잔물결 수면과 전경 기둥을 바라보는 화면 경계 개념 이미지
AI 생성 개념 이미지 — 제한된 시야와 가까운 물체를 함께 점검하기 위한 비유입니다. 실제 Scene Color 범위나 엔진 오류를 재현하지 않습니다.

수면 전체의 선택과 굴절 방식의 선택을 나누기

물 이야기를 하다 보니 모든 물 머티리얼을 Translucent로 시작해야 하는지도 확인할 필요가 있었습니다. Using Refraction의 예제는 Translucent와 Surface Translucency Volume을 사용합니다. 하지만 이를 모든 수면의 필수 구성으로 확대하면 안 되겠습니다. 실제 프로젝트에서 설정을 찾을 때는 해당 버전의 머티리얼 경로와 노출된 입력을 함께 확인해야 합니다.

추가로 연 Single Layer Water 문서는 Opaque 또는 Masked와 별도 렌더 패스로 투명한 물의 결과를 만드는 구조를 설명합니다. 산란·흡수 같은 물의 표현까지 다루는 모델입니다. 따라서 일반 굴절 예제에서 PNO를 이해하는 일과, 프로젝트의 수면 셰이딩 모델을 정하는 일은 구분하겠습니다. 여기서 두 경로의 최종 품질이나 비용 우위를 비교한 것은 아닙니다.

문서 사이의 이름 차이도 남겨 둡니다. PNO 안내는 Refraction Mode라고 쓰고, 속성 표는 Refraction Method라고 씁니다. 메뉴 이름 하나만 외우기보다 실제로 선택된 방식과 탄젠트 공간 조건을 확인하는 편이 낫겠습니다. 버전 표시만으로 본문에 남은 오래된 UI 설명까지 모두 현재 인터페이스와 같다고 보지는 않겠습니다.

다음에는 배경과 카메라를 먼저 고정해 보기

제가 시험을 준비한다면 작은 비교 장면부터 만들겠습니다. 배경에는 간격을 읽기 쉬운 무늬를 두고, 평면과 카메라·불투명도·조명을 고정합니다. 먼저 평평한 노멀로 IOR와 PNO의 차이를 보고, 그다음 같은 노멀 요철을 연결합니다. 마지막으로 카메라를 화면 가장자리와 낮은 시점으로 옮겨, 중앙에서 괜찮았던 설정이 어디서 무너지는지 따로 기록하겠습니다.

이때 남길 질문은 세 가지입니다. 평평한 기준에서 배경 전체의 이동이 남는가, 잔물결의 작은 변화가 필요한 만큼만 전달되는가, 전경이 섞이는 증상과 화면 경계의 증상을 구별할 수 있는가입니다. Depth Bias는 앞의 조건을 확인한 뒤 별도 비교로 다루겠습니다. 이는 검증 계획이며 아직 결과표나 Unreal 캡처는 없습니다.

이 자료에서 다시 찾고 싶은 판단 기준은 “굴절을 얼마나 줄까”에 앞서 “무엇의 차이로 배경을 옮길까”를 묻는 것입니다. 노멀의 기준과 입력의 의미를 정리해 두면, 다음에 수면이나 평평한 유리의 왜곡을 볼 때 필요한 질문을 더 작게 나눌 수 있겠습니다. 관련 읽기는 기술자료 읽기 모음과 레퍼런스에 모아 둡니다.

확인한 자료

열람일: 2026-10-29. 문서의 게시·갱신 날짜는 확인되지 않아 최신 변경 소식으로 소개하지 않았습니다. AI가 자료 정리와 개념 이미지 제작을 도왔습니다.

작업 이야기와 댓글

이 글을 보고 떠오른 질문이나 경험을 남겨 주세요. 서로의 시도와 관찰을 나누는 공간입니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다