Scientia Conditorium
[정리] 리얼 타임 렌더링(Real-Time Rendering, 4/e) 2장 - 그래픽 렌더링 파이프라인 본문
[정리] 리얼 타임 렌더링(Real-Time Rendering, 4/e) 2장 - 그래픽 렌더링 파이프라인

그래픽 렌더링 파이프라인 - 아키텍처
- 주된 기능은 가상 카메라, 3차원 오브젝트, 광원 등을 생성하거나 렌더링하는 것
- 각 단계는 병렬로 실행되며 이전 단계 결과의 영향을 받음
- 이상적으로는 파이프라인화되지 않은 시스템을 n개의 파이프라인으로 나누면 속도가 n배 향상
- 가장 기본적으로 4단계로 나눔
- 응용 단계(Application)
- 애플리케이션에 의해 동작되며 보통 CPU에서 실행되는 소프트웨어로 구현
- 충돌 검출, 가속 알고리듬, 애니메이션, 물리 시뮬레이션 등을 포함
- 기하 처리 단계(Geometry processing)
- 변환, 투영, 기타 지오메트리 구조 처리
- 무엇을, 어떻게, 어디에 그릴 것인지 계산
- 일반적으로 GPU에서 처리
- 래스터화 단계(Raterization)
- 보통 3개의 정점(Vertex)을 입력으로 한 삼각형을 구성해 해당 삼각형 안의 모든 픽셀을 찾은 후 다음 단계로 전달
- 픽셀 처리 단계(Pixel processing)
- 프로그램을 실행해 색상을 결정하고 깊이 테스트(Depth testing)를 수행해 가시성을 판단
- 기존 색상과 새로 계산된 색상을 혼합하는 것과 같은 픽셀 단위 작업을 수행
- 응용 단계(Application)
- 각 단계는 그 자체가 하나의 파이프라인이기 때문에 여러 개의 하위 단계로 구성될 수 있음
- 렌더링 속도는 초당 프레임(FPS, Frames Per Second)으로 표현하며 초당 렌더링되는 이미지의 수
응용 단계(Application)
- 일반적으로 CPU에서 소프트웨어로 실행되기 때문에 개발자는 이 단계에서 일어나는 것을 완전히 통제 가능
- 응용 단계의 변경은 이후 단계의 성능에 영향을 줌
- 렌더링될 삼각형 수를 줄이면 이후 단계에서 처리해야 할 일이 줄어 렌더링 속도가 높아짐
- 컴퓨트 쉐이더(Compute Shader)라고 불리는 별도 모드를 사용해서 GPU에서 수행 가능
- GPU를 매우 병렬적인 일반 처리 장치로 취급하고 그래픽 렌더링을 위한 특수 기능을 무시
- 일반적으로 구현되는 프로세스 중 하나는 충돌 검출
- 두 오브젝트 사이에서 충돌이 검출되면 그에 대한 응답을 생성해 충돌한 오브젝트들과 포스 피드백 장치로 보냄
- 응용 단계를 마치면 렌더링할 기하 모델은 파이프라인의 다음 단계로 공급
- 기하 모델은 최종적으로 화면에 그려지는 점, 선, 삼각형과 같은 렌더링 기본체(Primitives)
- 응용 단계에서 가장 중요한 작업
- 키보드, 마우스 등 다양한 입력 장치 처리
- 특정 컬링 알고리듬(Culling Algorithm) 같은 가속 알고리듬도 나머지 파이프라인에서 처리할 수 없는 것과 함께
이 단계에서 처리
기하 처리 단계(Geomtry Processing)
- 주로 삼각형이나 정점 단위로 수행되는 연산을 담당
- 4단계의 세부적인 기능으로 나뉠 수 있음
- 버텍스 쉐이딩(Vertex Shading)
- 투영(Projection)
- 클리핑(Clipping)
- 화면 매핑(Screen mapping)
- 버텍스 쉐이딩(Vertex Shading)
- 정점 위치를 계산하고 프로그래머가 필요로 하는 정점 출력 데이터를 평가하는 것
- 항상 필요한 좌표 집합인 정점 위치를 계산하는 방법을 설명하는 것으로 시작
- 모델은 아무런 변환도 적용되지 않은 고유의 모델 공간에 존재
- 각 모델은 모델 변환(Model transform)을 이용해 위치와 방향을 지정
- 모델 변환에 의해 변형되는 것은 모델의 정점과 법선 벡터들
- 오브젝트의 좌표를 모델 좌표(Model coordinates) 또는 지역 좌표(local coordinates)라고 하며
모델 변환이 적용되면 전역 좌표(World coordinates) 또는 전역 공간(World space)에 위치 - 전역 공간은 유일하게 하나만 존재하며 각 모델들이 고유의 모델 변환에 의해 변환되면
모든 모델은 동일한 전역 공간에 존재
- 오브젝트의 좌표를 모델 좌표(Model coordinates) 또는 지역 좌표(local coordinates)라고 하며
- 카메라는 전역 공간에 배치하기 위한 위치 정보와 바라보는 방향 정보를 가지고 있음
- 투영과 클리핑(Clipping)을 하고자 카메라와 모든 모델은 뷰 변환으로 변환
- 뷰 변환의 목적은 카메라를 원점에 배치하고 바라보는 방향을 -z축 방향으로 향하게 하기 위해서
- 이와 같은 공간을 카메라 공간(Camera space), 뷰 공간(View space), 눈 공간(Eye space)라 함
- 각 오브젝트의 재질과 오브젝트를 비추는 광원의 효과 같은 외향도 반드시 필요
- 음영(Shading) : 재질에 대한 빛의 효과를 결정하는 작업
오브젝트를 구성하는 정점에서 음영 방정식(Shading Equation)을 계산하는 것 - 일반적으로 이 계산의 일부는 모델의 정점에 대해 기하 처리 단계에서 수행되고 일부는 픽셀당 처리 과정에서 수행
- 버텍스 쉐이딩 결과는 래스터화 단계로 전달돼 픽셀 처리 단게에서 보간되고
최종적으로 표면의 음영을 계산하는 데 사용
- 음영(Shading) : 재질에 대한 빛의 효과를 결정하는 작업
- 정점 위치를 계산하고 프로그래머가 필요로 하는 정점 출력 데이터를 평가하는 것
- 투영(Projection) - 일반적으로 2가지
- 직교 투영(Orthographic projection) 또는 평행 투영(Parallel projection)
- 뷰 볼륨은 보통 직사각형 모양이고 직교 투영에 의한 뷰 볼륨은 단위 정육면체로 변환
- 평행선이 변환 후에도 평행을 유지
- 원근 투영(Perspective projection)
- 오브젝트가 카메라에서 멀어질수록 투영한 후에 더 작게 보임
- 평행선은 수평선에서 한 점으로 수렴(소실점)
- 인간이 오브젝트의 크기를 인지하는 방법을 모사한 것
- 절두체라 불리는 뷰 볼륨은 직사각형의 바닥면을 갖고 머리 쪽이 잘려진 피라미드 모양
이 절두체를 단위 정육면체로 변환
- 렌더링 시스템은 버텍스 쉐이딩의 한 부분으로 투영 변환 후 클리핑 연산을 처리하는 데,
이는 뷰 볼륨을 양끝 점이 (-1, -1, -1)과 (1, 1, 1)인 단위 정육면체 크리로 변환하는 과정- 이와 같은 단위 정육면체를 정규 뷰 볼륨(Canonical view volume)
- 투영 변환이 먼저 처리되고 GPU의 버텍스 쉐이더에 의해 실행
- 하나의 영역을 다른 것으로 변형하는 것이지만 화면에 그려진 영상에는 z축을 따로 저장하지 않고
z버퍼 안에 저장되기 때문에 투영이라고 부름. 이런 방법으로 모델은 3차원에서 2차원으로 투영
- 직교 투영(Orthographic projection) 또는 평행 투영(Parallel projection)
- 선택적 정점 처리
- 모든 파이프라인은 정점 처리 단계를 가짐
- 이 처리 후 테셀레이션(Tessellation), 지오메트리 쉐이딩(Geometry shading), 스트림 출력(Stream output)과 같은
GPU에서 처리할 수 있는 몇 가지 선택적인 단계가 존재 - 테셀레이션(Tessellation)
- 헐 쉐이더(Hull shader), 테셀레이터(Tessellator), 도메인 쉐이더(Domain shader)와 같은 여러 단계로 구성
- 공과 같은 곡면을 묘사할 때 패치(Patch)의 집합으로 설정할 수 있고 각 패치는 정점의 집합으로 만들어짐.
패치 정점의 집합을 더 큰 정점의 집합으로 변환해 새로운 삼각형 집합으로 만드는 데 사용 - 한 장면에서 카메라는 얼마나 많은 삼각형이 생성되는지를 결정하기 때문에 가까울 때 정점이 많아지고,
멀어지면 적어짐
- 지오메트리 쉐이더(Geomtry shader)
- 테셀레이션 쉐이더보다 먼저 생겨났기 때문에 GPU에서 좀 더 일반적
- 테셀레이션 쉐이더는 다양한 종류의 기본체(primitives) 안에 있어 새로운 정점을 생성할 수 있지만
일정 범위로 제한돼 있고 출력 기본체가 생성보다 더 제한돼 있기 때문에 단순하게 진행됨.
반면 지오메트리 쉐이더는 다양하게 활용할 수 있으며 입자 생성(Particle generation)에서 사용 - 예를 들어 불꽃놀이 폭발을 모사한다고 했을 때 각 불꽃은 단일 정점인 점으로 표현될 수 있음.
지오메트리 쉐이더에서는 각 점을 취해서 시점을 향하게 하고 몇 개의 픽셀을 커버하는 정사각형으로
변환 가능하기 때문에 좀 더 그럴듯하게 표현할 수 있는 기본 요소를 제공
- 스트림 출력(Stream output)
- GPU를 지오메트리 구조 엔진으로 사용
- 처리된 정점을 파이프라인 후반부로 보내 화면에 렌더링하는 대신 현 시점 이후 처리를 위해 선택적으로 출력
- 이 데이터는 이후 단계에서 CPU나 GPU로 직접 처리 가능
- 일반적으로 불꽃놀이와 같은 입자 시뮬레이션에 사용
- 클리핑(Clipping)
- 뷰 볼륨에 포함되는 기하 요소만 화면에 그려지기 때문에 완전히 벗어나 있는 기하 요소들은 제거할 필요가 있음
- 한 정점이 뷰 볼륨의 바깥쪽에 있고 다른 정점이 안쪽에 있다면 뷰 볼륨의 경계를 기준으로 잘라서 바깥쪽에 있는
정점은 뷰 볼륨의 교차점에 위치하는 지점에 새로운 정점으로 대치 - 이전 단계에서 투영 변환을 한 후 변환된 기하 요소들은 단위 정육면체(Unit cube)를 기준으로 클리핑
- 투영으로 생성된 4개의 값을 갖고 있는 동차 좌표계를 사용
- 일반적으로 이 값은 원근 공간 안의 삼각형에서는 선형 보간되지 않음
- 원근 분할(perspective division)이 실행되며 이는 결과적으로 삼각형을
3차원 정규 장치 좌표(nomalized device coordinates)에 놓이게 함. - 지오메트리 구조 단계의 마지막은 이 공간을 윈도우 좌표계로 변환하는 것
- 화면 매핑(Screen mapping)
- 뷰 볼륨 안쪽 클리핑된 기하 요소들만 화면 매핑 단계로 전달
- 이 단계에 진입할 때까지 좌표는 3차원
- 전달된 기하 요소들의 x/y 좌표는 화면 좌표계를 형성하고자 변환
- 화면 좌표와 z 좌표를 윈도우 좌표(Window coordinates)라고 부름
- 어떤 장면이 모서리 최솟값이 (X1, Y1)이고 모서리 최댓값이 (X2, Y2)인 윈도우에 렌더링한다고 가정
- 그 후 화면 매핑은 이동 연산과 연속적인 크기 조절(scaling) 연산
- 여기서 새로운 x/y 좌표를 화면 좌표(screen coordinates)라고 함
- z 좌표 또한 [Z1, Z2]로 매핑되고 Z값을 가진 윈도우 좌표가 래스터화 단계로 전달
- OpenGL : [-1, +1]
- DirectX, Vulkan, metal : [0, 1]
- 주어진 수평 픽셀 배열과 데카르트 좌표(Cartesian coordinates)를 사용하는 경우
가장 왼쪽 위의 픽셀은 부동소수점 좌표에서 0.0 - 모든 API가 픽셀 위치 값을 왼쪽에서 오른쪽으로 증가하게 사용하지만 위, 아래의 경우 OpenGL과 DirectX가 다름
- OpenGL : 이미지의 왼쪽 아래 모서리가 (0, 0)
- DirectX, Vulkan, metal : 이미지의 왼쪽 위 모서리가 (0, 0)
래스터화 단계(Rasterization)
- 렌더링되는 기본체 안에 있는 모든 픽셀을 찾는 것
- 스캔 변환(Scan conversion)이라고도 불리며 화면 공간의 2차원 정점에서 화면의 픽셀로 변환
- 삼각형이 3개의 정점에서 형성돼 결국 픽셀 처리로 보내지기 때문에 기하학 처리와 픽셀 처리 사이의 동기화 과정이기도 함
- 기능적으로 삼각형 준비(setup) 단계와 삼각형 순회(traversal) 단계로 나뉨
- 삼각형 준비
- 삼각형에 대한 미분, 에지 방정식(Edge equations), 기타 데이터를 계산
- 삼각형 순회와 지오메트리 구조 단계에서 생성된 다양한 음영 데이터의 보간에 사용
- 고정 함수 하드웨어(Fixed-function hardware)를 사용
- 삼각형 순회
- 어떤 샘플 혹은 픽셀이 삼각형 안에 있는지 검사하는 것
- 각 픽셀의 중점이 삼각형에 포함되는지 검사하고 삼각형과 겹치는 픽셀에 대해 생성된 프래그먼트를 확인
- 각 삼각형 내부 프래그먼트 속성 값은 3개의 삼각형 정점 사이 보간된 데이터를 사용.
이 속성 값은 프래그먼트 깊이 값과 지오메트리 구조 단계의 음영 데이터도 포함
- 삼각형 준비
픽셀 처리 단계(Pixel Processing)
- 픽셀당 또는 샘플당 계산 및 작업이 기본체 내부에 있는 픽셀이나 샘플에서 처리되는 단계
- 픽셀 음영(Pixel shading)과 병합(merging)으로 나뉨
- 픽셀 음영
- 보간된 음영 데이터를 입력으로 사용해 픽셀당 음영이 이뤄짐
- 최종 결과는 각 프래그먼트에 대한 컬러 값이며 이 값이 다음 단계로 하나 이상의 컬러를 전달
- 프로그램 가능한 GPU 코어에 의해 실행되며 이를 위해 프로그래머에게 원하는 계산을 포함할 수 있는
픽셀 쉐이더(또는 프래그먼트 쉐이더)용 프로그램을 제공 - 가장 중요한 기술 중 하나는 텍스처링(Texturing)
- 하나 이상의 이미지를 해당 오브젝트에 붙이는 것
- 텍스처링에 사용될 이미지는 1, 2, 3차원이 될 수 있으며 2차원 이미지가 가장 일반적
- 병합
- 각 픽셀에 대한 정보는 컬러의 직사각형 배열인 컬러 버퍼(Color buffer)에 저장
- 픽셀 음영 단계에서 생성된 프래그먼트 컬러를 현재 버퍼에 저장된 컬러와 병합
ROP(Raster Operations Pipeline 또는 Render Output unit이라고 부름) - 이 단계를 처리하는 GPU 세부 장치는 일반적으로 프로그래밍 가능하지 않지만
구성 가능한 설정이 많아 다양한 효과를 사용할 수 있음 - 가시성(Visibility)을 결정하는 역할도 함
- Z버퍼(깊이 버퍼(Depth buffer) 라고도 함) 알고리듬을 사용해 처리
- 컬러 버퍼와 크기 및 모양이 같으며 각 픽셀들은 현재 카메라에서 가장 가까운 기본체의 깊이 값을 저장
- 이는 기본체가 특정 픽셀로 렌더링될 때 해당 기본체의 z값이 계산되고
동일한 픽셀의 z 버퍼 내용과 비교됨을 의미 - 새로운 z값이 z버퍼에 저장돼 있던 값보다 작으면 렌더링되는 기본체는 지금까지 해당 픽셀에서 가장
가까웠던 기본체보다 더 가까운 것을 의미하므로 z값과 해당 픽셀의 컬러는 그려지는 기본체의 z값과
컬러로 각각 z버퍼와 컬러 버퍼에서 교체 - 계산된 z값이 z버퍼에 저장된 값보다 크다면 기존에 저장됐던 컬러 버퍼와 z 버퍼의 내용은 그대로 유지
- O(n)의 복잡도를 가지며 각 픽셀에서 깊이 값을 계산할 수만 있다면 그려질 어떤 기본체에도 적용 가능
- 단, 화면의 각 지점에 대해 단 하나의 깊이 값만 저장하기 때문에 부분적으로 투명한 기본체에는 사용X
반투명성은 기본 Z버퍼 알고리듬의 가장 큰 한계 중 하나
- Z버퍼(깊이 버퍼(Depth buffer) 라고도 함) 알고리듬을 사용해 처리
- 프래그먼트 정보를 필터링하고 캡처하는 데 다른 채널과 버퍼를 사용할 수 있음
- 알파 채널(Alpha channel)은 컬러 버퍼와 관련이 있으며 각 픽셀에 대응되는 불투명도 값을 저장
- 스텐실 버퍼(Stencil buffer)는 오프스크린 버퍼(Offscreen buffer)로 렌더링된 기본체의 위치를 저장하는 데 사용
(화면상 보이는 버퍼가 아닌 추가 계산을 위한 버퍼라는 의미)
- 기본체를 스텐실 버퍼에 렌더링한 다음 이 버퍼의 값으로 컬러 버퍼와 Z버퍼로의 렌더링을 제어 가능
- 속이 채워진 원이 스텐실 버퍼에 렌더링됐다고 가정했을 때, 컬러 버퍼에 원이 있는 부분에만
기본체의 렌더링을 허용하도록 스텐실 버퍼 연산자와 연동할 수 있음 - 파이프라인 끝에 있는 이런 모든 기능을 래스터 연산(Raster Operation) 또는 블렌드 연산(Blend operation)
- 현재 컬러 버퍼에 있는 컬러와 삼각형 내부에서 처리 중인 픽셀의 컬러를 혼합할 수 있음
- 프레임 버퍼(Frame buffer)는 일반적으로 시스템의 모든 버퍼로 이뤄짐
- 기본체가 래스터화 단계에 도달하고 이를 지날 때 카메라 시점에서 보이는 것을 화면에 디스플레이
- 화면 디스플레이는 컬러 버퍼에 저장된 내용을 보여주는 것
- 기본체가 래스터화돼 화면으로 보내지는 과정을 관측자가 볼 수 없도록 이중 버퍼링(Double buffering 사용
- 한 장면히 화면 밖 후면 버퍼(Back buffer)에서 렌더링되면 후면 버퍼의 내용은
이전에 화면에 디스플레이된 전면 버퍼(Front buffer)의 내용과 교체 - 교체 작업은 보통 안전한 시기인 모니터의 수직 회귀(Vertical retrace) 동안 일어남
- 한 장면히 화면 밖 후면 버퍼(Back buffer)에서 렌더링되면 후면 버퍼의 내용은
- 픽셀 음영
파이프라인을 통해
- 파이프라인은 실시간 렌더링 애플리케이션을 목표로 지난 수십 년간 API와 그래픽 하드웨어가 발전한 결과
- 단, 유일하게 가능한 렌더링 파이프라인은 아님
- 오프라인 렌더링 파이프라인 역시 다른 진화 과정을 거침
- 영화 제작을 위한 렌더링은 종종 마이크로폴리곤 파이프라인(micropolygon pipeline)으로 처리
- 최근 광선 추적(Ray tracing)과 경로 추적(Path tracing) 기법을 도입
- 건축 설계와 디자인 사전 시각화에도 사용
'프로그래밍 > 컴퓨터 그래픽스' 카테고리의 다른 글
| 레이 트레이싱 공부#001 - Ray Tracing in One Weekend (0) | 2025.11.19 |
|---|---|
| [정리] 리얼 타임 렌더링(Real-Time Rendering, 4/e) 3장 - 그래픽 처리 장치 (0) | 2025.11.05 |
| [OpenGL 009] Visual Studio 2022에서 GLSL 문법 확인 및 구문 강조 (0) | 2025.02.18 |
| [OpenGL 008] glfw 키 2개 입력 방법 및 glfwSwapInterval (0) | 2025.02.15 |
| [OpenGL 007] 쉐이더 파일 생성 및 프로그램 수정 (0) | 2025.02.15 |
