컴퓨터 그래픽스

2024.7.8(월) 7장 - 래스터라이저

새우급여기 2024. 7. 14. 18:00
  • 래스터라이저: 프리미티브 조립 및 래스터화 담당
  • 프리미티브: GPU 파이프라인이 처리할 기하적인 개체들
  • 래스터화: 정점 쉐이더가 출력한 정점들은 프리미티브로 다시 조립됨. 이 프리미티브는 스크린에 그려질 형태로 변환된 후 프래그먼트로 분해된다.

클리핑(Clipping)

222 크기의 클립 공간 뷰 볼륨 바깥에 놓인 폴리곤을 잘라내는 작업

t1: view frustum 바깥에 위치. 제거

t2: 다음 단계로

t3: 이 경우 꼭짓점 하나는 view frustum 안에 있지만 나머지는 바깥에 위치. 클러핑 작업이 필요함.

원근 나눗셈(Perspective Division)

네 번째 행은 아핀 변환과는 달리 (0 0 0 1)이 아니라 (0 0 -1 0)이다.

따라서 변환된 정점의 w 좌표는 -z가 된다. 대개 1이 아니다.

투영 변환을 통해 얻어진 동차 좌표를 카테시안 좌표로 전환하기 위해서는 동차 좌표 모든 원소를 w로 나눠야 한다. → 원근 나눗셈

원근 나눗셈 결과로 얻은 카테시안 좌표를 정규화된 장치 좌표 혹은 NDC라고 부른다.

 

뒷면 제거

  • 뒷면: 가상 카메라를 등지고 있는 폴리곤
  • 앞면: 카메라를 향하는 폴리곤

카메라 공간에서의 뒷면 제거

→ 카메라(EYE)가 삼각형 노멀이 가리키는 방향 반대쪽에 존재하면 삼각형은 뒷면.

(a)에서 t1은 뒷면이고, t2는 앞면이다.

→ 삼각형 정점과 카메라를 연결하는 벡터를 이용한다.

t1처럼 n1과 c1이 둔각 이루면 내적은 음수이며 해당 삼각형은 뒷면으로 판정된다.

반면 t2는 n2, c2 예각 이루고 내적은 음수이다. 해당 삼각형은 앞면으로 판정되는 것이다.

t3은 n3, c3이 수직이므로 내적은 0이 되는데, 이 경우는 삼각형이 변만 보이는 것으로 판정된다.

 

뒷면 제거 구현

삼각형이 투영선과 수평 관계 - 선분으로 보임

이러한 폴리곤은 변만 보이는 면이라고 함.

 

2차원으로 투영된 삼각형 <v1, v2, v3>. 각 정점 v1은 (x1, t1) 좌표를 가짐.

이 삼각형의 정점이 시계 방향인지, 반시계 방향으로 정렬되어 있는지 판정하는 법

→ v1, v2 잇는 벡터 (x2 - x1,y2-y1), v1과 v3 잇는 벡터 (x3-x1,y3-y1) 계산 후 위 사진과 같은 행렬식 계산.

행렬식 값이 음수이면 시계 방향(뒷면),

양수라면 반시계 방향(앞면)이다.

0이면 변만 보이는 삼각형

항상 뒷면을 제거해야 하느냐? X - 반투명 물체 렌더링 같은 경우 예외

  • glCullFace() 호출로 뒷면, 앞면 중 어떤 것 제거할지 결정
  • GL_BACK: 기본값
  • glCullFace 호출 않으면 뒷면 제거, 앞면 제거 시 glCullFace(GL_FRONT)호출
  • 마지막으로 glFrontFace 호출해 앞면 정점 정렬 순서 명시.(함수 기본 값은 GL_CCW, 반시계 방향임)

앞면이라고 반드시 보이는 것은 아님. 또 다른 앞면에 의해 가려질 수 있는데, 이러한 앞면은 z-버퍼링이라고 하는 프래그먼트별 연산에 의해 처리됨.

 

뷰포트 변환

  • 윈도우 공간(스크린 공간): 컴퓨터 스크린 위 윈도우는 그 자신의 좌표계를 가짐.
  • 뷰포트: NDC 정육면체 뷰 볼륨 안 내용이 최종적으로 그려질 스크린 영역

뷰포트는 때로 윈도우 전체를 차지하나, 반드시 그럴 필요는 없으며 범위는 glViewport에 의해 정의됨. 첫 두 파라미터 minX, minY는 뷰포트 왼쪽 아래 모퉁이의 스크린 공간 좌표를, 마지막 두 파라미터 w, h는 각각 뷰포트 너비와 높이를 지정함.

  • 뷰포트의 종황비: w/h

 

 

뷰포트 변환은 축소확대에 이은 이동으로 표현된다. 클립 공간, 스크린 공간 모두 왼손 좌표계이다. 2*2*2 크기 뷰 볼륨 안 모든 정점에 적용됨.

 

뷰포트는 윈도우 전체 영역 차지함.

glViewport 두 파라미터 minX, minY는 모두 0이 됨.

뷰포트 z 범위 [minZ, maxZ]가 기본값 [0,1] 가질 시 행렬은 아래처럼 간단해진다.

 

 

스캔 전환

스캔 전환: 뷰포트 변환은 모든 삼각형들을 스크린 공간으로 옮긴다. 그 후 래스터라이저 마지막 세부 단계가 수행되는데, 그것을 스캔 전환이라고 한다.

  • 삼각형 내부를 채우는 프래그먼트를 생성함 → 개별 삼각형 차지하는 스크린 공간 픽셀 위치 결정, 삼각형 정점별 애트리뷰트 보간해 각 픽셀 위치에 할당
  1. 정점별 애트리뷰트는 삼각형의 변을 따라 선형보간 된다. 보간을 위해 각 변마다 기울기 계산이 필요함.
  2. 스캔라인: 수평 방향으로 이어진 스크린 픽셀들
  3. 초기화 단계 거친 후 애트리뷰트 보간

 

7.6 - c는 R1과 R3가 왼쪽 변을 따라 보간되는 것을 보여준다.

겹선형보간: 스캔 전환 단계에서 선형보간은 두 단계로, 먼저 변을 따라, 그 다음에는 스캔라인을 따라 수행되는데, 이를 겹선형보간이라고 부른다.

 

GPU 파이프라인에서 래스터라이저 다음 단계인 프래그먼트 쉐이더는 보간된 v_normal과 v_texCoord를 이용해 한번에 하나씩 프래그먼트 처리함.

 

 


이미지 출처: [OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문]

위 서적을 보고 공부한 내용을 정리함