-
버텍스 노멀과 평균 노멀 : 빛을 어떻게 받는지 결정Apple🍎/Metal 2025. 3. 18. 14:16
노멀(Normal)이란 무엇인가?
노멀 벡터는 표면에 수직으로 향하는 벡터로, 마치 땅에서 하늘을 가리키는 막대기와 같이 표면에서 바깥쪽으로 향합니다.
노멀 벡터의 중요성
- 조명 계산
- 빛이 표면에 어떻게 반사될지 결정하는 핵심 요소입니다.
- 빛의 방향과 노멀 벡터 사이의 각도가 표면의 밝기를 결정합니다.
- 빛의 방향과 노멀 벡터의 내적(dot product)이 표면의 밝기를 결정합니다.
- 내적 값이 클수록 표면이 밝게 보입니다.
- 이 각도가 작을수록(빛이 노멀과 같은 방향일수록) 표면이 밝게 보입니다.
- 반대로 각도가 클수록 표면이 어둡게 보입니다.
- 앞면/뒷면 결정 (Backface Culling)
- 3D 모델에서 어떤 면이 보여야 하고 어떤 면이 숨겨져야 하는지 결정합니다.
- 관찰자를 향하는 노멀을 가진 면은 "앞면"으로 간주되어 렌더링됩니다.
- 반대 방향으로 향하는 노멀을 가진 면은 "뒷면"으로 간주되어 종종 렌더링이 생략됩니다.
- 이를 통해 시스템은 불필요한 계산을 줄이고 렌더링 효율성을 높입니다.
노멀 벡터는 단위 벡터(길이가 1인 벡터)로 표현되며, 방향만 중요하고 길이는 중요하지 않습니다.
삼각형 노멀 계산 방법
삼각형의 노멀 벡터는 삼각형을 구성하는 두 엣지 벡터의 외적(cross product)으로 계산됩니다.
계산 단계
- 삼각형의 세 버텍스에 이름 부여하기
- 세 버텍스를 A, B, C로 명명합니다.
- 이때 버텍스 순서는 시계 방향 또는 반시계 방향으로 일관되게 유지해야 합니다.
- 첫 번째 엣지 벡터(AB) 계산하기
- 벡터 AB = B - A
- 좌표로 표현하면: AB = (xB-xA, yB-yA, zB-zA)
- 이 벡터는 버텍스 A에서 버텍스 B로 향합니다.
- 두 번째 엣지 벡터(AC) 계산하기
- 벡터 AC = C - A
- 좌표로 표현하면: AC = (xC-xA, yC-yA, zC-zA)
- 이 벡터는 버텍스 A에서 버텍스 C로 향합니다.
- 외적 계산하기
- 노멀 벡터 = AB × AC
- 정규화하기
- 계산된 벡터를 길이가 1이 되도록 정규화합니다.
- 정규화 공식: 노멀 = 노멀 / ||노멀||
- 여기서 ||노멀||은 노멀 벡터의 길이(magnitude)입니다.
감김 순서(Winding Order)와 노멀 방향
삼각형의 버텍스를 지정하는 순서, 즉 감김 순서(winding order)는 노멀 벡터의 방향을 결정합니다. 3D 그래픽스에서 앞면과 뒷면을 구분하는 기준이 됩니다.
시계 방향 vs 반시계 방향
- 시계 방향 감김 순서
- 버텍스가 시계 방향으로 나열되었을 때 (예: A → B → C)
- 산출되는 노멀 벡터는 화면 쪽으로 향합니다 (시스템에 따라 다를 수 있음).
- 이 면은 보통 "앞면(front-facing)"으로 간주됩니다.
- 반시계 방향 감김 순서
- 버텍스가 반시계 방향으로 나열되었을 때 (예: A → C → B)
- 산출되는 노멀 벡터는 화면 반대쪽으로 향합니다.
- 이 면은 보통 "뒷면(back-facing)"으로 간주됩니다.
중요한 점은 어떤 감김 순서가 앞면을 결정하는지는 그래픽스 시스템 및 컨벤션에 따라 다르다는 것입니다. OpenGL과 DirectX는 서로 다른 규칙을 사용합니다:
- OpenGL: 반시계 방향 삼각형이 전면을 향합니다.
- DirectX: 시계 방향 삼각형이 전면을 향합니다.
일관성을 유지하는 것이 중요하며, 3D 모델링 소프트웨어와 렌더링 엔진 간에 규칙이 일치하도록 해야 합니다.
평균 노멀(Averaged Normals)과 부드러운 쉐이딩
단순히 각 삼각형마다 하나의 노멀만 사용하면 모델이 각지게 보이는 "평면 쉐이딩(flat shading)" 효과가 나타납니다. 더 부드러운 표면을 표현하기 위해서는 "평균 노멀"의 개념이 필요합니다.
평면 쉐이딩 vs 부드러운 쉐이딩
- 평면 쉐이딩 (Flat Shading)
- 각 삼각형 면마다 하나의 고유한 노멀을 사용합니다.
- 삼각형 간의 경계가 뚜렷하게 보입니다.
- 각진 객체(예: 주사위)를 표현할 때 적합합니다.
- 부드러운 쉐이딩 (Smooth Shading)
- 각 버텍스마다 주변 삼각형 노멀들의 평균을 사용합니다.
- 삼각형 간의 전환이 부드럽게 보입니다.
- 곡면(예: 구체, 인체)을 표현할 때 적합합니다.
평균 노멀 계산 방법
공유 버텍스의 각 삼각형 노멀 벡터 계산하기 평균 노멀 벡터 계산하기 계산한 평균 노멀 벡터 각 버텍스에 저장하기 - 특정 버텍스를 공유하는 모든 삼각형을 식별합니다.
- 각 삼각형의 노멀 벡터를 계산합니다.
- 이 노멀 벡터들을 모두 더합니다.
- 합산된 벡터를 정규화하여 길이가 1인 벡터로 만듭니다.
수식으로 표현하면
평균 노멀 = normalize(노멀1 + 노멀2 + ... + 노멀N)
여기서 N은 해당 버텍스를 공유하는 삼각형의 수입니다.
예를 들어, 한 버텍스가 세 개의 삼각형에 속하고, 그 삼각형들의 노멀이 (0,0,1), (0,1,0), (1,0,0)이라면:
- 세 노멀의 합: (1,1,1)
- 정규화: (1,1,1) / √3 ≈ (0.577, 0.577, 0.577)
- 이 정규화된 벡터가 해당 버텍스의 평균 노멀이 됩니다.
'Apple🍎 > Metal' 카테고리의 다른 글
cellular automata(세포 자동자)는 뭘까? (0) 2025.03.23 Metal 둘러보기 (0) 2025.03.21 셰이더(shader)는 무엇인가? (0) 2025.03.20 3D 모델링 기초 : 삼각형으로 일단 쪼개 보자 (0) 2025.03.17 부동 소수점이란? (0) 2025.01.28 - 조명 계산