Replicated

[Graphics] 렌더링 파이프라인 및 클리핑, 컬링 본문

지식

[Graphics] 렌더링 파이프라인 및 클리핑, 컬링

라구넹 2025. 5. 29. 01:12

렌더링 파이프라인(Redering Pipeline)

- 3D 데이터를 화면에 2D 이미지로 변환하는 전체 과정

 

Input Assembler Stage

Vertex Shader Stage

Rasterizer Stage

Pixel Shader Stage (Fragment Shader)

Output Merger Stage

 

Input Assembler Stage

GPU에 정점 데이터를 전달하고 그 정점들로부터 기본 도형(Primitive)을 구성

 

입력 데이터

- 정점 위치, 색상, 노멀, 텍스처 좌표 .. => Vertex

- 인덱스 버퍼 (삼각형 정의를 위한 정점 인덱스)

주요 작업

- 정점 데이터를 GPU에 올림

- 도형 구성

- 그 외 필터링, 인스턴싱 가능

 

Vertex Shader Stage

각 정점에 대해 개별 연산을 수행, 주로 모델 좌표 -> 클립 좌표로 변환

 

주요작업

- 월드/뷰/프로젝션 행렬을 통해 위치 변환

- 조명 계산

- 텍스쳐 좌표, 컬러 등 다음 단계로 넘길 값 결정

 

Rasterizer Stage

정점으로 구성된 도형을 화면 공간에 래스터화(픽셀화)

도형의 내부 픽셀(Fragment)을 생성하고 속성을 보간

 

주요작업

- 삼각형 -> 픽셀로 분해

- 각 픽셀에 대해 정점 속성 보간 (색상, 텍스쳐 좌표 등)

- 뷰포트 변환 (NDC -> 스크린 좌표)

* 클립 -> NDC는 Vertex Stage 이후 Rasterizer 스테이지 이전에 자동으로 GPU가 수행

- 클리핑(화면 밖 잘라내기), 백페이스 컬링(뒤집힌 면 제거)

 

Pixel Shader Stage (Fragment Shader)

보간된 각 픽셀(Fragment)에 대해 최종 색상 계산

 

주요작업

- 텍스처 색상 추출 (텍스쳐 매핑)

- 픽셀 단위 조명 계산 (ex. 퐁 쉐이딩)

- 그림자, 반사, 투명도 등 시각 효과

- 알파 값 조정

 

Output Merger Stage

최종적으로 계산된 픽셀을 프레임 버퍼에 출력

여러 테스트를 통해 어떤 픽셀을 남길지 결정

 

주요작업

- 깊이 테스트(Z-Buffer): 앞에 있는 픽셀만 출력

- 스텐실 테스트: 특정 조건에 따라 픽셀 마스킹

- 블렌딩(알파): 반투명 오브젝트 색상 혼합

- 프레임 버퍼에 픽셀 기록 -> 화면 출력

 


 

Vertex Shader -> Fragment Shader 데이터 흐름

1. Vertex Shader에서 출력

- 각 정점에 대해 다양한 출력 변수 (ex. 색상, 텍스쳐 좌표, 노멀 등) 설정

- 이 변수들은 보간 대상이 됨

 

2. Rasterizer가 보간

- 정점 쉐이더에서 출력한 값들은 삼각형 내부의 각 픽셀마다 자동으로 보간

- Rasterizer Stage에서 GPU가 자동 수행

    - 선형 보간

    - 원근 보정 보간

 

3. Fragment Shader 입력

- 보간된 값들이 전달됨

- 픽셀 단위 연산에서 값들을 사용해 색상, 조명, 텍스처 샘플링 등을 처리

 


 

클리핑이란?

- 카메라(뷰)의 경계를 벗어난 도형(정점, 삼각형 등)을 잘라내는 과정

 

정확히는 Vertex Shader 이후, Rasterizer 이전에 수행됨

 

왜 필요한가?

- 렌더링 최적화

- 시각적 정확성 (화면 밖 내용이 보이는 현상 방지)

- 파이프라인 안정성 (NDC 변환이 가능한 좌표만 통과)

 

클리핑 이후 Perspective Divide: x/w, y/w, z/w

-> NDC 좌표계로 이동

-> 뷰포트 트랜스폼으로 화면에 그릴 위치 계산

 

* 클리핑 vs 컬링

클리핑: 삼각형의 일부가 시야 밖에 있을 때 자르는 작업

컬링: 삼각형 전체가 안보이는 경우(ex. 뒷면) 아예 제거

 


 

Back-face Culling

카메라에서 보이지 않는 면을 렌더링하지 않도록 제거하는 최적화 기법

시야에서 반대 방향(뒷면)을 향한 삼각형(도형)은 렌더링하지 않고 제거하는 기법

 

어떻게 판단하는가?

삼각형은 정점의 순서로 면의 방향(법선 방향)이 정해짐

이를 기준으로 카메라와 삼각형이 반대 방향을 보고 있으면 뒷면으로 간주

 

일반적인 규칙

- 시계방향(CW) 정점 순서 -> 보통 뒷면

- 반시계방향(CCW) -> 보통 앞면

* OpenGL, DirectX에서 설정 가능

 

계산 방법

1. 삼각형의 법선 벡터 계산

2. 시점(카메라) 방향과 내적

3. 내적 결과가 0 이하 -> 뒷면 => 제거

 

유용한 경우

- 닫힌 메시

- 정적인 환경

- 성능 최적화 중요 시

 

쓰면 안되는 경우

- 투명한 오브젝트

- 양면 모델 (ex. 종이, 천 등 얇은 물체)

- 렌더링 디버깅

 


 

Normal Vector (법선 벡터)의 역할

표면의 방향을 나타내며 조명 계산에 사용됨

표면에 수직인 단위 벡터로, 그 표면이 어느 방향을 향하고 있는지를 나타냄

 

벡터 길이: 1 (단위 벡터)

 

핵심 역할

1. 조명 계산

- 가장 중요한 역할

- 조명 모델(퐁, 램버트, 블린-퐁 등)에서 광원의 방향과 노멀 벡터의 각도를 이용해 밝기와 색상을 계산

 

2. 반사/굴절 효과 (Relection / Refrection)

- 뷰 벡터와 Normal을 기준으로 반사 벡터 계산

 

3. 정점 보간 및 쉐이딩

- 정점마다 Normal이 다르면 삼각형 내부 픽셀의 조명 효과를 보간해 부드러운 곡면처럼 보이게 함

- ex. 고루드 쉐이딩 (정점 조명 -> 보간), 퐁 쉐이딩 (픽셀 조명 -> 보간된 노멀 벡터 사용)

 

4. 텍스처 매핑 보조

- 실제 메시 형태와 무관하게 픽셀 단위로 가짜 노멀 벡터를 적용해서 세밀한 질감 효과를 낼 수 있음