[DX] 법선 벡터(Normal Vector)

김진우·2025년 7월 29일

DirectX

목록 보기
32/32
post-thumbnail

정의

어떤 표면의 한 점에서, 그 점을 포함하는 접평면에 수직인 단위벡터이다.

단위벡터이므로 크기는 보통 1로 정규화 되어있고, 방향은 표면의 바깥쪽을 향한다.

표면이 어느 방향을 바라보고 있는지를 결정하며, 광원과 표면의 각도에 따라 빛의 세기 및 그림자, 반사, 하이라이트 등을 사실적으로 표현하는 데 사용한다.

계산 방법

면 법선(Face Normal) 계산

삼각형의 법선: 세 점 p0,p1,p2p_0, p_1, p_2가 있을 때 외적을 이용해 방향을 구하고, 정규화를 통해 단위 벡터로 변환한다.

Normal=(p1p0)×(p2p0)(p1p0)×(p2p0)\text{Normal} = \frac{(p_1 - p_0) \times (p_2 - p_0)}{\|(p_1 - p_0) \times (p_2 - p_0)\|}

여기서 ×벡터 외적이다.

정점 법선(Vertex Normal) 계산

정점 법선은 그 정점을 공유하는 면 법선들의 평균으로 정의됨

렌더링 파이프라인 활용 예시

  1. 입력 단계 (정점 데이터 준비)
    모델 파일(예: FBX, OBJ)에 저장된 정점 위치 + 정점 법선이 GPU로 전달된다.

  2. 버텍스 셰이더(Vertex Shader)
    정점 좌표와 정점 법선을 모델 공간 → 월드 공간 → 뷰 공간으로 변환한다.
    정점 법선이 이후 조명 계산에 사용될 수 있도록 넘겨준다.

  3. 래스터화(Rasterization)
    삼각형 내부 픽셀을 생성한다.
    이때 정점에 있던 법선들이 보간되어 픽셀별 표면 법선이 만들어진다.

  4. 픽셀 셰이더(Pixel Shader / Fragment Shader)
    보간된 표면 법선과 광원(Light) 방향, 카메라 방향을 사용하여 조명 공식(Phong, Blinn-Phong 등) 계산한다.
    결과적으로 픽셀마다 밝기, 색상, 하이라이트(광택) 등이 결정된다.

  5. 최종 출력
    모든 픽셀의 색상이 합쳐져 부드럽게 음영 처리된 3D 모델이 화면에 렌더링된다.

0개의 댓글