노멀 맵은 Bump Map 타입이며, 실제 지오메트리로 표현되는 것처럼 광원을 받는 범프, 홈 및 스크래치 등의 표면 디테일을 모델에 추가하는 데 사용할 수 있는 특별한 텍스처 종류입니다.
예를 들어, 비행기 기체처럼 전체 표면에 홈과 나사 또는 리벳이 있는 표면을 표시하고 싶을 수 있습니다. 이렇게 하는 방법 중 하나로, 아래와 같이 디테일을 지오메트리로 모델링할 수 있습니다.
상황에 따라 “실제” 지오메트리로 모델링된 작은 디테일을 갖는 것은 일반적으로 좋지 않습니다. 오른쪽에서 단일 스크류 헤드의 디테일을 구성하는 데 필요한 폴리곤을 볼 수 있습니다. 미세한 표면 디테일을 가진 커다란 모델에서 그리면 매우 많은 수의 폴리곤이 필요합니다. 이를 피하기 위해 노멀 맵을 사용하여 미세한 표면 디테일을 표현하고, 모델의 더 큰 모양을 위해 더 낮은 해상도의 폴리곤 표면을 사용해야 합니다.
그러지 않고 이 디테일을 범프 맵으로 대신 나타내면 표면 지오메트리가 훨씬 더 간단해질 수 있고 디테일은 광원이 표면에서 반사되는 방법을 조절하는 텍스처로 표현됩니다. 이 작업은 최신 그래픽스 하드웨어로 매우 빨리 수행할 수 있습니다. 이제 금속 표면은 폴리곤 개수가 적은 플랫 평면이 되고 나사, 리벳, 홈 및 스크래치는 텍스처로 인해 광원을 받고 뎁스가 있는 것처럼 보입니다.
최신 게임 개발 아트 파이프라인에서 아티스트는 3D 모델링 애플리케이션을 사용하여 초고해상도 소스 모델을 기반으로 노멀 맵을 생성합니다. 그런 다음, 노멀 맵을 해상도가 더 낮은 게임용 버전 모델에 매핑하여 원래의 고해상도 디테일이 노멀 맵을 사용하여 렌더링되도록 합니다.
범프 매핑은 비교적 오래된 그래픽스 기술이지만, 여전히 디테일이 높고 사실적인 실시간 그래픽스를 만드는 데 필요한 핵심적인 방법 중 하나입니다. 범프 맵을 일반적으로 Normal Maps 또는 Height Maps이라고도 하지만 이런 용어는 아래에서 설명하는 것처럼 의미가 약간 다릅니다.
노멀 매핑의 작동 원리를 제대로 설명하기 위해, “Normal”이 무엇이고 실시간 조명에 어떻게 사용되는지 먼저 설명하겠습니다. 가장 기본적인 예로는 단순히 광원에 대한 상대적인 표면 각도에 따라 각 표면 폴리곤에 빛이 비춰지는 모델을 들 수 있습니다. 표면 각도는 표면에서 직각 방향으로 돌출되는 선으로 나타낼 수 있으며, 표면에 대한 이 상대적인 방향(벡터)을 “Surface Normal” 또는 간단히 Normal이라고 합니다.
위 이미지에서 왼쪽 실린더에는 기본 플랫 셰이딩이 적용되었고 각 폴리곤은 광원에 대한 상대적인 각도에 따라 셰이딩 되었습니다. 표면이 평평하기 때문에 각 폴리곤의 조명은 전체 폴리곤 영역에 걸쳐 일정합니다. 다음은 각각의 와이어프레임 메시가 보이는 두 개의 동일한 실린더입니다.
오른쪽 모델은 왼쪽 모델과 폴리곤 수가 동일하지만, 셰이딩이 부드럽게 보이고 전체 폴리곤에 비추는 조명으로 인해 곡면이 있는 표면처럼 보입니다. 왜 그럴까요? 광원을 반사시키는 데 사용되는 각 점의 Surface Normal이 폴리곤의 전체 폭에 걸쳐 조금씩 달라지기 때문입니다. 따라서 실제로는 폴리곤이 평평하고 일정하지만 표면의 주어진 점에서 광원이 표면에 곡면이 있는 것처럼 바운스됩니다.
2D 다이어그램으로 보면 플랫 셰이딩된 실린더의 바깥쪽 주위에 있는 표면 폴리곤 중 세 개가 다음과 같이 표시됩니다.
표면 노멀은 주황색 화살표로 나타냅니다. 각 값은 표면에서 광원이 반사되는 방법을 계산하는 데 사용됩니다. 따라서 표면 노멀이 동일한 방향을 가리키기 때문에 각 폴리곤의 전장에 걸쳐 광원이 동일하게 반응할 것임을 알 수 있습니다. 그래서 “플랫 셰이딩”이 얻어지고 왼쪽 실린더의 폴리곤에 하드 에지가 있는 것처럼 보입니다.
하지만 부드럽게 셰이딩된 실린더의 경우 표면 노멀은 다음과 같이 평평한 폴리곤에 따라 달라집니다.
노멀 방향은 평평한 폴리곤 표면 전체에 걸쳐 점진적으로 변하므로 표면 전체에 걸친 셰이딩이 (녹색 선으로 표시된 것처럼) 부드러운 곡선 같다는 인상을 줍니다. 메시의 실제 폴리곤 성질에는 영향이 없고, 평평한 표면에서 조명이 계산되는 방법에만 영향이 있습니다. 이렇게 휘어진 것처럼 보이는 표면은 실제로 존재하지 않으며, 면을 조각에서 보면 평평한 폴리곤의 실제 성질이 드러납니다. 하지만 대부분의 시각에서는 실린더에 부드럽게 휘어진 표면이 있는 것처럼 보입니다.
이 부드러운 기본 셰이딩을 사용하면 노멀 방향을 결정하는 데이터는 실제로 버텍스별로만 저장되므로 전체 표면에 걸쳐 변하는 값은 버텍스 간에 보간됩니다. 위 다이어그램에서 빨간색 화살표는 각 버텍스에 저장된 노멀 방향을 나타내고, 주황색 화살표는 전체 폴리곤 영역에 걸쳐 보간된 노멀 방향의 예를 나타냅니다.
노멀 매핑은 텍스처를 사용하여 모델 전체에 걸쳐 표면 노멀을 수정하는 방법에 대한 정보를 저장하여 표면 노멀 수정을 한 단계 발전시킵니다. 노멀 맵은 일반 컬러 텍스처처럼 모델의 표면에 매핑되는 이미지 텍스처이지만, 노멀 맵 텍스처의 각 픽셀(texel이라고 함)은 평평한(또는 부드럽게 보간된) 폴리곤의 “실제” 표면 노멀과 표면 노멀 방향 간의 편차를 나타냅니다.
3D 모델의 표면에 있는 폴리곤을 2D로 표현한 이 다이어그램에서 주황색 화살표는 각각 노멀 맵 텍스처의 픽셀에 대응합니다. 아래에는 노멀 맵 텍스처의 단일 픽셀 슬라이스가 있습니다. 중앙을 보면 노멀이 수정되어 폴리곤 표면에 범프가 2–3개 있는 형상이 나타남을 알 수 있습니다. 이런 범프는 조명이 표면에 나타나는 방법으로만 보입니다. 수정된 노멀이 조명 계산에 사용되기 때문입니다.
원시 노멀 맵 파일에 보이는 컬러는 일반적으로 푸른 색조를 띠고 밝거나 어두운 실제 셰이딩을 포함하지 않습니다. 컬러 자체가 그대로 표시되도록 의도되지 않았기 때문입니다. 그 대신 각 텍셀의 RGB 값이 방향 벡터의 X, Y, Z 값을 나타내고 폴리곤 표면의 기본 보간된 부드러운 노멀에 대한 수정으로 적용됩니다.
다음은 몇 개의 위로 올린 사각형 및 텍스트에 대한 범프 정보가 포함된 간단한 노멀 맵의 예입니다. 이 노멀 맵을 Unity로 임포트하여 스탠다드 셰이더의 노멀 맵 슬롯에 넣을 수 있습니다. 컬러 맵(알베도 맵)이 있는 머티리얼에 결합하고 위의 실린더 메시 표면에 적용하면 다음과 같은 결과가 나타납니다.
이번에도 메시의 실제 폴리곤 성질에는 영향이 없고 표면에서 조명이 계산되는 방법에만 영향이 있습니다. 표면에서 튀어나온 것처럼 보이는 글자와 도형은 실제로 존재하지 않고 조각에서 면을 보면 평평한 표면의 실제 성질이 나타나지만, 대부분의 시각에서는 이제 실린더에 표면에서 튀어나온 엠보싱된 디테일이 있는 것처럼 보입니다.
일반적으로 노멀 맵은 3D 또는 텍스처 아티스트가 제작하는 모델 또는 텍스처와 함께 제작되고 종종 알베도 맵의 레이아웃 및 컨텐츠를 동일하게 나타냅니다. 경우에 따라 노멀 맵은 손으로 제작되고 때로는 3D 애플리케이션에서 렌더링됩니다.
3D 애플리케이션에서 노멀 맵을 렌더링하는 방법은 이 문서의 범위에 포함되지 않지만, 기본 개념은 3D 아티스트가 모델의 두 가지 버전, 즉 모든 디테일이 폴리곤으로 포함된 해상도가 매우 높은 모델과 해상도가 낮은 “게임용” 모델을 제작한다는 데 바탕을 두고 있습니다. 고해상도 모델은 게임에서 최적으로 실행하기엔 디테일이 너무 많지만(메시에 삼각형이 너무 많음), 3D 모델링 애플리케이션에서 노멀 맵을 생성하는 데 사용됩니다. 그러면 모델의 저해상도 버전에서는 이제 노멀 맵에 저장된 매우 세밀한 수준의 지오메트리 디테일을 제외할 수 있으므로 노멀 매핑을 대신 사용하여 이 모델을 렌더링할 수 있습니다. 일반적인 이용 사례로는 캐릭터 의상의 경계 부분에서 주름, 단추, 버클 및 솔기의 올록볼록한 디테일을 표시하는 경우를 들 수 있습니다.
일반 사진 텍스처의 조명을 분석하여 노멀 맵을 추출할 수 있는 소프트웨어 패키지가 몇 개 있습니다. 이런 패키지는 원본 텍스처가 일정한 방향에서 빛을 받는다고 가정함으로써 작동하며, 밝고 어두운 영역이 분석되고 각진 표면에 대응한다고 가정됩니다. 하지만 범프 맵을 실제로 사용할 때는 알베도 텍스처에 이미지의 특정 방향에서 비추는 조명이 없어야 합니다. 이 텍스처는 조명이 전혀 비추지 않는 표면의 컬러를 나타내는 것이 이상적입니다. 조명 정보는 광원 방향, 표면 각도 및 범프 맵 정보에 따라 Unity에서 계산하기 때문입니다.
아래에는 두 가지 예가 있는데, 하나는 단순히 반복되는 돌 벽 텍스처와 해당 노멀 맵이고 다른 하나는 캐릭터의 텍스처 아틀라스와 해당 노멀 맵입니다.
Normal Maps와 Height Maps는 모두 범프 맵 타입입니다. 두 맵에는 모두 더 단순한 폴리곤 메시의 표면에 표시되는 디테일을 나타내는 데 필요한 데이터가 있지만, 데이터가 각기 다른 방법으로 저장됩니다.
위의 왼쪽 이미지에는 돌 벽을 범프 매핑하는 데에 사용하는 높이 맵이 보입니다. 높이 맵은 각 픽셀이 표면에서 점이 위로 올라온 것처럼 보여야 하는 정도를 나타내는 단순한 흑백 텍스처입니다. 픽셀 컬러가 흰색에 가까울수록 해당 영역이 더 높이 위로 올라온 것처럼 보입니다.
노멀 맵은 RGB 텍스처로, 여기서 각 픽셀은 표면이 향하고 있는 것처럼 보여야 하는 방향의 차이를 수정되지 않은 표면 노멀에 대해 상대적으로 나타냅니다. 이 텍스처는 벡터가 RGB 값에 저장되는 방법 때문에 푸른 보라빛을 띠는 경향이 있습니다.
최신 실시간 3D 그래픽스 하드웨어는 노멀 맵을 사용합니다. 광원이 어떻게 표면에서 바운스되는 것처럼 표시되는지를 수정하는 데 필요한 벡터가 노멀 맵에 포함되어 있기 때문입니다. Unity에서는 범프 매핑에 하이트 맵도 사용할 수 있지만 하이트 맵을 사용하려면 임포트 시 노멀 맵으로 변환해야 합니다.
그 이유를 몰라도 노멀 맵을 사용하는 데 지장이 없습니다! 이 문단은 건너뛰어도 됩니다. 하지만 꼭 알고 싶은 분들을 위해 설명합니다. RGB 컬러 값은 벡터의 X, Y, Z 방향을 저장하는 데 사용되며, (Unity에서 일반적으로 Y를 “위쪽”로 사용하는 것과 달리) Z가 “위쪽” 방향입니다. 또한, 텍스처의 값은 반으로 나누고 0.5를 더한 것으로 간주되므로 모든 방향의 벡터를 저장할 수 있습니다. 따라서 RGB 컬러를 벡터 방향으로 변환하려면 2를 곱한 후 1을 빼야 합니다. 예를 들어 RGB 값이 (0.5, 0.5, 1)이거나 십육진수로 #8080FF면 벡터로 변환한 결과는 (0, 0, 1)이며, 이 벡터는 노멀 매핑에서 “위쪽” 에 해당되고 모델 표면에 변화가 없음을 나타냅니다. 이 색이 이 페이지의 앞부분에 있는 노멀 맵 “예”의 평평한 영역에 보이는 색입니다.
값이 (0.43, 0.91, 0.80)이면 벡터가 (–0.14, 0.82, 0.6)이 되어 표면이 매우 급격하게 변합니다. 이러한 컬러는 돌 벽 노멀 맵의 밝은 청록색 영역에서 일부 돌 가장자리 위에 나타날 수 있습니다. 그 결과 이런 가장자리에는 돌의 더 평평한 면과 다른 각도에서 광원이 비춰집니다.
노멀 맵(Normal Maps)
노멀 맵은 평소처럼 에셋 폴더에 텍스처 파일을 저장하여 임포트할 수 있습니다. 하지만 이 텍스처가 노멀 맵임을 Unity에 알려야 합니다. 임포트 인스펙터 설정에서 “텍스처 타입” 설정을 “노멀 맵”으로 변경하면 됩니다.
흑백 하이트맵을 노멀 맵으로 임포트하는 프로세스는 거의 동일하지만, “그레이스케일에 생성” 옵션을 선택해야 합니다.
“그레이스케일에 생성” 옵션을 선택하면 인스펙터에 범피니스 슬라이더가 나타납니다. 이 슬라이더를 사용하여 하이트맵의 높이를 노멀 맵의 각도로 변환할 때 각도의 가파른 정도를 제어할 수 있습니다. 범피니스 값이 낮으면 하이트맵의 선명한 콘트라스트도 작은 각도와 범프로 변환됩니다. 값이 높으면 과장된 범프와 범프에 대한 콘트라스트가 매우 높은 조명 반응이 생성됩니다.
에셋에 노멀 맵을 추가한 후 인스펙터에 서 머티리얼의 노멀 맵 슬롯에 넣을 수 있습니다. 스탠다드 셰이더에 노멀 맵 슬롯이 있고 여러 구형 레거시 셰이더도 노멀 맵을 지원합니다.
노멀 맵이나 하이트맵을 임포트한 경우(위에서 설명한 것처럼 Texture Type: Normal Map을 선택하여) 노멀 맵으로 표시하지 않으면 머티리얼 인스펙터에서 아래와 같이 이 문제에 대해 경고하고 수정할 것인지 묻습니다.
“지금 고치기”를 클릭하면 텍스처 인스펙터 설정에서 Texture Type: Normal Map을 선택하는 것과 효과가 동일합니다. 텍스처가 실제로 노멀 맵인 경우 이렇게 할 수 있지만, 텍스처가 그레이스케일 하이트맵이면 자동으로 인식되지 않습니다. 따라서 하이트맵의 경우에는 항상 텍스처 인스펙터 창에서 “그레이스케일에 생성” 옵션을 선택해야 합니다.
스탠다드 셰이더의 머티리얼 인스펙터에서 더 아래로 내려가면 두 번째 노멀 맵 슬롯도 있음을 볼 수 있습니다. 이 슬롯을 통해 추가 노멀 맵을 사용하여 디테일을 더 만들 수 있습니다. 이 슬롯에 일반 노멀 맵 슬롯과 동일한 방법으로 노멀 맵을 추가할 수 있지만, 추가 슬롯을 사용하는 목적은 두 노멀 맵이 함께 다른 스케일에서 높은 데이터 수준을 생성하도록 다른 스케일이나 타일링 주기를 사용해야 한다는 데 있습니다. 예를 들어 일반 노멀 맵은 벽 또는 자동차의 패널의 디테일을 패널 가장자리의 홈과 함께 정의할 수 있습니다. 보조 노멀 맵은 표면 스크래치 및 마모의 범프 디테일을 매우 세밀하게 나타내며, 베이스 노멀 맵 스케일의 5배에서 10배까지 타일링할 수 있습니다. 이러한 디테일은 가까이에서 살펴봐야만 보일 정도로 아주 미세할 수 있습니다. 베이스 노멀 맵에 이 정도의 디테일이 있으려면 베이스 노멀 맵이 엄청나게 커져야 하지만, 서로 다른 스케일로 두 맵을 결합하여 두 개의 상대적으로 작은 노멀 맵 텍스처를 사용하여 전반적으로 높은 디테일 수준(LOD)를 얻을 수 있습니다.