View에 따른 OpenGL Pipeline 분류
View |
Purpose |
Functional |
매 단계에서의 결과값의 연속 |
Transform |
수학적 변형(Transform)의 연속 |
System |
하드웨어 설계 |
Programmable |
데이터 흐름에 따른, 유저가 정의한 구현 |
Functional View
- OpenGL 구현은 항상 다음을 지원
- Vertices 들은 transform 되었거나 lit한 상태
- 프로세싱된 Vertices들은 geometry, color, texture를 이용해 이미지를 생성하기 위해 Rasterizer로 단계도 이동
- Pixels은 frame buffer에 저장돼 디스플레이에 다음 사이클에 업데이트 되기를 기다린다
- ModelView transformation
- model space에서 view space로 vertices 이동
- Projection transformation
- view space에서 normalized projection space로 vertices 이동
- Viewport transformation
- NDC에서 viewport (screen) space로 vertices 이동
Programmable View
- Vertex Specification
- 정렬된 버틱스 리스트를 나열
- 이를 이용해 primitive boundaries를 정의해 텍스처 좌표와 색깔을 정의할 수 있음
- 파이프라인 첫 단계
- Vertex Puller가 필요한 vertex data를 수집해 VS로 보냄
- Vertex shader
- 파이프라인 상 Programmable한 첫 단계
- 버텍스 데이터를 처리
- GPU가 모든 각 버텍스의 최종 위치를 연산
- Shader Stage 중 유일한 필수 단계
- Tessellation(optional)
- 일정한 형태의 도형들로 평면을 빈틈없이 채우는 것
- 더 작고 단순한 여러 개의 프리미티브로 분할하는 작업
- Geometry shader(optional)
- 추가 연산을 통해 최종 버텍스의 수를 유지하거나 증가 시킴
- primitive의 타입을 변환
- Primitive Assembly
- Vertex Post-processing
- 오브젝트 및 메쉬 중 버릴 것과 다음 스테이지로 넘어갈 것을 정하는 단계
- Rasterization
- 선별된 오브젝트들을 픽셀로 변경
- 프라그먼트들을 출력
- 픽셀 interpolation 수행
- Fragment Shader
- Per-sample Operation
- scissor, stencil, depth 등의 테스트를 실행
stencil test
- 프라그먼트의 stencil 값을 확인
- test에 실패하면 해당 프라그먼트는 culled
scissor test
- 화면을 기준으로 특정 범위(직사각형) 바깥은 버리는 것
culling과 clipping의 차이
culling
- Face culling - 보이지 않는 숨겨진 면을 제거하는 것
- Vertex-based culling - primitive 전체를 제거하는 것
clipping
- viewing volume의 내부 또는 외부의 object를 솎아내는 것
- cull할지 render할지 고르는 과정
좌표계
- Z 값의 방향에 따라 왼손 / 오른손으로 분류
- OpenGL은 오른손 좌표계
- DirectX는 왼손 좌표계
출처