노멀 매핑은 실제로 어떻게 작동합니까?


10

노멀 매핑의 개념을 이해하려고 노력하고 있지만 몇 가지가 혼란 스러워요. 요컨대, 노멀 맵이 뷰 포인트에 의존 하는지 아닌지 확실 하지 않습니다 (예를 들어, 회전 할 때 동일한 오브젝트의 다른 노멀 맵을 얻을지 여부). 둘째, 노멀 맵에서 파란 색이 주된 색인 이유를 알 수 없습니다 .

법선에 대한 생각과 RGB 색상과의 관계는 다음과 같습니다. 단위 구는 가능한 모든 단위 법선을 나타냅니다. 즉, 단위 법선 벡터의 X, Y 및 Z 구성 요소 범위는 -1에서 1까지입니다. RGB 색상의 구성 요소는 모두 0에서 255까지입니다. -1 (일반 구성 요소)을 0 (색상 구성 요소), 0 ~ 127 또는 128 및 1 ~ 255에 매핑합니다. 사이의 모든 값은 선형 보간입니다.

이 매핑을 임의의 3D 객체의 법선에 적용하면 거의 파란색이 아닌 매우 다채로운 그림이 만들어집니다. 예를 들어, 큐브를 만들 때 6 개의 얼굴은 모두 다르지만 균일 한 색상을 갖습니다. 예를 들어 법선이 (1,0,0) 인면은 (255,128,128)이되고 법선이 (0,0, -1) 인면은 (128,128,0) 등이됩니다.

그러나 어떤 이유로 든 내가 찾은 큐브의 노멀 맵은 완전히 푸른 빛을 띠고 있습니다 (즉, (128,128,255)). 그러나 분명히 법선이 모두 양의 z 방향이 아닙니다 (즉, (0,0,1)). 어떻게 작동합니까?

[편집하다]

따라서 위에서 설명한 접근 방식은 오브젝트 공간 노멀 맵 또는 월드 공간 노멀 맵이라고 합니다. 다른 하나는 탄젠트 공간 노멀 맵 이라고합니다 . 이러한 탄젠트 공간 노멀 맵을 사용하여 지오메트리의 노멀을 수정하는 방법을 이해하지만 실제로 어떻게 계산되는지는 확실하지 않습니다 (Nicol Bolas의 답변에 대한 내 의견 참조).

[편집 2]

아마도 조각 매개 변수 표면으로 작업하고 있다고 언급해야합니다. 이러한 표면은 일련의 표면 패치 로 구성되며 , 각 패치는 고유 한 파라 메트릭 공간 (u, v) = [0,1] x [0,1]과 연결됩니다. 표면의 어느 지점에서나 법선을 정확하게 계산할 수 있습니다. 분명히, 탄젠트 공간에 걸치는 데 필요한 벡터 T ( 탄젠트 )와 B ( 바이 탄젠트 )는 단순히 u와 v 방향으로 표면 패치의 부분 파생물이 아닙니다.


퐁 또는 적어도 확산 쉐이딩을 구현하려고 시도한 적이 있습니까? 단위 벡터 a, b에 대해 dot (a, b) = cos (angle (a, b))와 같은 기본 공식을 알고 있습니까? 몇 시간 동안 구현하면 몇 년 동안 어려움을 겪을 수 있습니다.
Ivan Kuckir 2016 년

@Ailurus : 지형 객체 / 높이 필드에서 동일한 문제에 접근하는 방법에 대한 내 의견 / 응답을 참조하십시오. 다른 객체에 대해서는 다소 복잡하지만 개념은 다르지 않습니다.
teodron

지형 노멀 맵핑의 특별한 경우 : gamedev.stackexchange.com/questions/43894/…
teodron

답변:


14

텍스처 매핑은 3D 표면의 점과 텍스처 이미지의 해당 점 사이의 매핑입니다. 1 : 1 텍스처 매핑이있는 경우 3D 표면의 모든 점이 텍스처 이미지의 특정하고 고유 한 점에 매핑됩니다. 표면에).

이러한 매핑을 사용하면 3D 표면을 통과하고 각각의 고유 법선을 텍스처의 해당 위치에 저장할 수 있습니다.

알았어, 해보자 3D 표면을 살펴보고 매핑 된 위치에 객체 공간 법선을 생성 한 다음 텍스처에 붙입니다. 렌더하고 싶을 때, 텍스처에서 오브젝트 공간 노멀을 페치하면됩니다. 권리?

네, 그게 효과가 있습니다. 그러나 텍스처의 법선은 특정 객체에서만 사용할 수 있습니다. 또한 텍스처의 법선은 해당 객체 및 특정 텍스처 매핑 에서만 사용할 수 있습니다 . 따라서 텍스처 매핑을 어떤 식 으로든 회전 시키거나 UV 변환으로 변경하려는 경우 운이 좋지 않습니다.

일반적으로 사람들이 사용하는 것은 법선이 "접선"에있는 법선 맵입니다. 탄젠트 공간은 수정되지 않은 법선이 + Z 방향에있는 3D 표면의 매핑 된 점에 대한 공간이며 X 및 Y 축은 표면에 대한 U 및 V 축을 따라 가리 킵니다.

탄젠트 공간은 기본적으로 법선을 정규화합니다. 접선 공간에서 법선 (0, 0, 1)은 항상 "수정되지 않은"을 의미합니다. 정점 법선을 보간하여 얻는 법선입니다. 이것은 당신이 할 수있는 많은 유용한 일들로 이어지며 , 가장 중요한 것 중 하나는 적은 양의 데이터에 그것들을 저장하는 것입니다.

Z는 항상 양수이므로 X 및 Y 구성 요소의 셰이더에서 Z를 계산할 수 있습니다. 값이 2 개만 필요하므로 픽셀 당 4 바이트가 아닌 픽셀 당 2 바이트 형식 ( OpenGL 이미지 형식 명명법 )을 사용할 수 있습니다 ( 여전히 픽셀 당 4 바이트) GPU는 각 픽셀을 4 바이트로 채 웁니다.) 더 좋은 방법 으로이 두 값을 압축하여 픽셀 당 1 바이트 형식으로 만들 수 있습니다. 텍스처 크기를 오브젝트 공간 노멀 맵의 75 %로 줄였습니다.GL_RG8GL_RGBA8GL_RGB8

모든 종류의 노멀 맵에 대해 이야기하기 전에 먼저 저장된 맵을 알아야 합니다. 객체 공간 법선 맵, 탄젠트 공간 법선 맵 또는 다른 것입니까?


자, 여러분이 설명하는 첫 번째 유형의지도는 객체 공간 노멀 맵입니다 . 이것은 법선의 실제 X, Y 및 Z 구성 요소를 저장하기 때문에 더 화려한 것입니다. 두 번째 유형 인 접선 공간 법선 맵 은 법선 자체가 아닌 법선에 대한 섭동과 같은 것을 저장하는 것 같습니다. 접선 공간의 개념을 읽고 나중에 다시 확인하겠습니다.
Ailurus

표면의 한 점의 탄젠트 공간은 단순히 그 점의 모든 탄젠트 벡터의 공간입니다. 그러나이 경우 접선 공간에서 본 법선 이 (0,0,1) 이외의 다른 방법이 아닌지 알 수 있습니까? 다시 말해, 항상 노멀 맵이 균일하게 파란색 (128,128,255)이 될 것으로 기대합니다. 그러나 wikipedia 페이지 ( en.wikipedia.org/wiki/Normal_mapping#How_it_works ) 에 표시된 예 에는 다른 색상이 포함되어 있습니다. 이 맵을 사용하여 법선을 변경하는 방법을 이해하지만 실제로 계산하는 방법은 이해하지 못합니다.
Ailurus 2016 년

@Ailurus : " 좋아요, 표면에있는 점의 탄젠트 공간은 단순히 그 점의 모든 탄젠트 벡터의 공간입니다. "아니, 그렇지 않습니다. 표면의 해당 지점에서 (수정되지 않은) 법선과 텍스처 좌표의 방향으로 정의 된 공간입니다. 텍스처 매핑과 수정 전의 현재 법선을 기준으로 텍스쳐에 저장된 법선을 정규화했습니다.
Nicol Bolas 2016 년

아마 노멀 맵에서 가장 어려운 부분은 매핑 자체 (접선 벡터 계산 방법 포함)입니다. 접선 벡터의 계산이 확산 텍스처의 UV 매핑 / 래핑과 객체의 지오메트리에 본질적으로 연결되어 있지 않습니까? 달리 말하면 객체에 대해 서로 다른 두 개의 노멀 맵이 있지만 하나의 탄젠트 (및 노멀) 필드 만 계산됩니다. 탄젠트 필드를 두 개의 서로 다른 노멀 텍스처와 일관되게 사용할 수 없다는 것을 알 수 있습니다. (기하학적으로는 사소한 작업이 아닌 적절한 uv 매핑을 찾을 수 있지만).
teodron

@NicolBolas Ah, 나는 일부 출처가 벡터 T, B 및 N이 직교 정규 기초를 형성한다고 주장하기 때문에 혼란 스러웠지만 다른 사람들은 이것이 반드시 사실이 아니라고 언급하기 때문에 혼란스러워했다.
Ailurus

3

노멀 맵은 소위 탄젠트 공간을 사용하여 매핑됩니다. 탄젠트 공간은 기본적으로 모델의 텍스처 공간을 기반으로하는 로컬 공간입니다. 두 질문에 모두 답해야합니다.

이 공간은 카메라와 관련이 없기 때문에 시점에 의존하지 않습니다. 노멀 맵에서 Z는 위쪽 방향입니다. 모델의 법선을 보면 대부분의 법선 벡터가 메시에서 직접 가리 킵니다. 메쉬의 표면은 내가 말했던 텍스처 공간이므로 로컬 좌표계에서 위쪽은 "외부"방향입니다.


이것을 명확히 해 주셔서 감사합니다! 그러나 다각형 메쉬 를 표면으로 사용하지 않고 조각으로 매끄럽게 파라 메트릭 표면을 사용하고 있습니다. 따라서 모든 법선은 (0,0,1) 방향을 가리키는 것으로 저장됩니다.
Ailurus

1

이 페이지에서 아래 스크롤

데이터 세트에서 오른쪽 B / W 도면을 봅니다. 이것은 고슴도치 도면으로 알려져 있으며, 각 노멀이 그려진 표면의 렌더링입니다.

따라서 전통적인 노멀 맵을 이해하려면 모든 척추가 튀어 나와있는 화가 고슴도치를 생각하십시오. 각 척추는 고슴도치 표면 아래에서 정상입니다.

당신의 구체 문제와 관련하여, 당신이 광선 추적기와 같이, 파라 메트릭 공간에 순수하게 살고 있다면, 구체에 대한 무한 법선 세트는 테셀 레이트 된 공간, 즉 컴퓨터가 우리에게 강제하는 세계에서 더 큰 구체를 만들 것입니다. 우리는 실시간을 원합니다. 그러면 당신은 구의 뾰족한 근사치를 갖게됩니다.

이제이 예제는 OBJECT 노멀 맵에 초점을 맞췄습니다. 오브젝트에 대해 노멀을 정의하는 것입니다. 이것은 이전에 언급 한 것처럼 오브젝트 나 카메라 또는 다른 것의 회전, 변환 또는 스케일링에 따라 변하지 않습니다. 한 종류의 노멀 맵이지만 가장 일반적입니다


0

노멀 맵이 무엇인지에 대한 오해가 있다고 생각합니다. 기본적으로 형상이 완전히 평평한 경우 울퉁불퉁 한 모양을 시뮬레이션하는 방법입니다.

노멀 맵의 색상은 기술 셰이더에 의해 해석되며 카메라의 뷰뿐만 아니라 빛의 강도와 방향에 따라 처리됩니다. 예를 들어 완전히 평평하고 평평한 질감의 벽돌 바닥을 가질 수 있지만, 같은 벽돌 모양의 노멀 맵이 있기 때문에 주변을 둘러 보면 빛이 옆으로 튀는 것처럼 보입니다. 벽돌보다 3D로 보이게합니다.

이것은 물론 환상 일 뿐이지 만 복잡한 지오메트리를 사용하는 것보다 훨씬 저렴합니다. 그리고 노멀 맵의 색상은 변하지 않습니다. 실제로 셰이더에서 비교할 값만 나타냅니다. 나는 여기 누군가가 당신을 훨씬 더 자세하게 채울 수있을 것이라고 확신합니다.


알고 있지만 어쨌든 귀하의 답변에 감사드립니다 :)
Ailurus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.