그래픽스 파이프라인
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
그래픽스 파이프라인은 3D 다각형 렌더링을 위한 일련의 처리 과정으로, 애플리케이션, 지오메트리, 래스터라이제이션의 세 단계로 구성된다. 애플리케이션 단계에서 사용자 입력, 애니메이션, 충돌 감지 등이 처리되고, 지오메트리 단계에서는 다각형의 정점 변환, 조명, 클리핑 등이 수행된다. 래스터라이제이션 단계에서는 정점으로부터 개별 프래그먼트를 생성하여 픽셀을 채색하고, 은면 제거, 텍스처 매핑 등을 거쳐 최종 이미지를 생성한다. 이러한 파이프라인은 CPU, 고정 기능 파이프라인, 프로그래머블 파이프라인 등 다양한 방식으로 구현될 수 있으며, 실시간 렌더링을 위해 연산량 감소 및 근사적인 기법이 활용된다.
더 읽어볼만한 페이지
- 그래픽 하드웨어 - 그래픽 처리 장치
그래픽 처리 장치(GPU)는 컴퓨터 그래픽 렌더링 및 표시를 가속화하는 전용 프로세서로, 아케이드 게임기에서 시작하여 개인용 컴퓨터의 초기 그래픽 디스플레이 프로세서, 하드웨어 가속 3D 그래픽을 거쳐 인공지능 및 딥러닝 분야에서도 활용되며 다양한 형태로 컴퓨터, 게임 콘솔, 모바일 기기 등 광범위한 분야에서 사용된다. - 그래픽 하드웨어 - 매트록스 G200
매트록스 G200은 1990년대 후반 매트록스가 출시한 고급 2D 그래픽 가속기 시리즈로, 듀얼버스 아키텍처, 32비트 색상 지원, 트리리니어 밉맵 필터링 등의 혁신적인 기술을 통해 2D 그래픽 분야에서 강점을 유지하고 저전력 설계를 통해 시스템 안정성과 소음 감소에 기여했다. - 3차원 렌더링 - 비사실적 렌더링
비사실적 렌더링은 3D 모델이나 2D 이미지를 예술적 표현을 위해 다양한 스타일로 변환하는 컴퓨터 그래픽스 기술이며, 3D 비디오 게임, 영화 등 다양한 분야에서 활용된다. - 3차원 렌더링 - Z 버퍼링
Z 버퍼링은 3차원 컴퓨터 그래픽스에서 픽셀의 깊이 정보를 저장하여 가려진 면을 제거하는 기술로, 다양한 분야에서 활용되며 Z 컬링을 통해 렌더링 성능을 향상시키지만 Z 파이팅과 같은 문제점을 야기하기도 한다.
그래픽스 파이프라인 | |
---|---|
개요 | |
종류 | 렌더링 과정 |
역할 | 3차원 장면을 2차원 이미지로 변환 |
주요 단계 | 정점 처리 래스터화 프래그먼트 처리 |
파이프라인 단계 | |
정점 처리 (Vertex Processing) | 모델-뷰 변환 정점 셰이딩 클리핑 |
래스터화 (Rasterization) | 삼각형 설정 삼각형 트래버설 |
프래그먼트 처리 (Fragment Processing) | 텍스처 적용 프래그먼트 셰이딩 블렌딩 |
세부 단계 | |
어플리케이션 단계 (Application Stage) | 3D 모델 데이터 준비 및 설정 |
지오메트리 단계 (Geometry Stage) | 모델-뷰 변환 정점 셰이딩 클리핑 투영 |
래스터화 단계 (Rasterizer Stage) | 삼각형 설정 삼각형 트래버설 |
픽셀 처리 단계 (Pixel Processing Stage) | 텍스처 적용 프래그먼트 셰이딩 블렌딩 |
2. 기본 개념
3D 파이프라인은 일반적으로 3D 다각형 렌더링이라고 불리는 가장 일반적인 형태의 컴퓨터 3차원 렌더링을 지칭하며, 광선 추적 및 광선 투사와는 다르다. 광선 투사에서는 카메라가 있는 지점에서 광선이 시작되며, 해당 광선이 표면에 부딪히면 광선이 부딪힌 표면의 해당 지점의 색상과 조명이 계산된다. 3D 다각형 렌더링에서는 반대 현상이 발생하는데, 카메라에 주어진 영역을 계산한 다음 카메라에 주어진 모든 표면의 모든 부분에서 광선을 생성하여 카메라로 추적한다.
그래픽스 파이프라인은 크게 애플리케이션, 지오메트리, 래스터라이제이션의 세 단계로 구성된다.[26][4]
현재의 3차원 컴퓨터 그래픽스에서는 물체를 폴리곤 메시와 텍스처로 표현하는 것이 표준이다. 또한 출력은 디스플레이 등의 2D 평면인 경우가 대부분이다. 따라서 3D 모델은 공간에 배치되고, 위치가 지정된 카메라로 촬영되어 평면의 이미지가 되고, 디스플레이의 픽셀 좌표에 할당되어 비로소 표시될 수 있다. 이 일련의 변환 처리가 그래픽스 파이프라인이다.
일련의 조작을 파이프라인 처리로 고속화하는 렌더링 방식이라는 의미도 있다. 컴퓨터 그래픽스는 크게 영화나 CM 등의 프로덕션 용도와, CAD나 시뮬레이션 가시화, 게임 등의 실시간 용도의 두 가지가 있다. 각 그래픽스 파이프라인의 각 단계에 할당되는 리소스의 비중이나, 사용되는 하드웨어, 그리고 렌더링 방정식 및 조명 알고리즘의 엄밀도는 다르지만, 기본적인 흐름과 생각은 같다.
실시간 3DCG용 API에는 OpenGL과 Direct3D가 있다.
3. 구조
현대의 3차원 컴퓨터 그래픽스에서는 물체를 폴리곤 메시와 텍스처로 표현하는 것이 일반적이다. 출력은 대부분 디스플레이와 같은 2D 평면이다. 따라서 3D 모델은 공간에 배치되고, 카메라로 촬영되어 평면 이미지가 된 후, 디스플레이 픽셀 좌표에 할당되어 표시된다. 이러한 일련의 변환 처리가 그래픽스 파이프라인이다.
이러한 일련의 조작은 파이프라인 처리를 통해 빠르게 렌더링하는 방식이다. 컴퓨터 그래픽스는 영화나 CM 등의 프로덕션 용도와, CAD, 시뮬레이션, 게임 등의 실시간 용도로 나뉜다. 그래픽스 파이프라인의 각 단계에 할당되는 리소스, 사용되는 하드웨어, 렌더링 방정식 및 조명 알고리즘의 엄밀함은 다르지만, 기본적인 흐름은 같다.
실시간 3DCG용 API에는 OpenGL과 Direct3D가 있다.
그래픽스 파이프라인 처리의 각 단계는 3차원 컴퓨터 그래픽스에서 더 자세히 다룬다. 파이프라인의 스테이지는 그래픽스 파이프라인을 구성하는 한 단계의 처리이다.[15]
3. 1. 애플리케이션 단계
응용 프로그램 단계는 메인 프로세서인 CPU에서 소프트웨어에 의해 실행된다. 응용 프로그램 단계에서는 사용자의 입력 장치를 사용한 상호 작용이나 애니메이션을 통해 필요한 경우 장면에 변경 사항이 적용된다. 모든 프리미티브(삼각형, 선, 점 등)를 포함하는 새로운 장면은 파이프라인의 다음 단계로 전달된다.
응용 프로그램 단계에서 일반적으로 수행되는 작업에는 충돌 감지, 애니메이션, 모핑, 그리고 쿼드트리 또는 옥트리와 같은 공간 분할 방식을 사용한 가속 기술이 있다. 이러한 기술은 주어진 시간에 필요한 주 메모리의 양을 줄이는 데에도 사용된다. 현대 컴퓨터 게임의 "월드"는 한 번에 메모리에 들어갈 수 있는 것보다 훨씬 더 크다.
3. 2. 지오메트리 단계
기하 단계(기하 파이프라인)는 다각형과 다각형의 정점(정점 파이프라인)에 대한 대부분의 연산을 담당한다. 모델의 정점 좌표 데이터 등은 셰이더 유닛 등에 의해 여러 번 다양한 변환 처리를 거쳐 최종적으로 프레임 버퍼에 결과가 저장된다.
DirectX (Direct3D) 및 OpenGL 등 3D 그래픽스 API에서 "래스터라이저"를 기준으로 앞부분은 정점 데이터를 다루는 "정점 파이프라인"이며, 뒷부분은 지오메트리 셰이더부터 시작하여 픽셀 데이터를 다루는 "픽셀 파이프라인"이다.
정점 셰이더는 정점 단위로 좌표 변환, 음영 처리, 클리핑 처리, 컬링 처리 등을 수행한다. 테셀레이션 스테이지에서는 정점을 새롭게 추가할 수 있으며, 이를 통해 거리 적응형 테셀레이션이나 디스플레이스먼트 맵과 같은 효과를 낼 수 있다. 지오메트리 셰이더(프리미티브 셰이더)는 프리미티브를 추가, 제거하거나 종류를 변경할 수 있다.
이러한 작업들이 실제로 병렬 파이프라인 단계로 구성되는 방식은 구현에 따라 달라진다.
3. 2. 1. 정의
'''정점'''(Vertex, 복수형: 정점들)은 3차원 공간에 존재하는 한 점이다. 많은 점들이 연결되어 표면을 형성하는 데 사용된다. 특수한 경우, 점 구름이 직접 그려지기도 하지만, 이는 여전히 예외적인 경우이다.[1]
'''삼각형'''(Triangle)은 컴퓨터 그래픽스에서 가장 흔한 기하학적 기본 도형이다. 삼각형은 세 개의 정점과 법선 벡터로 정의된다. 법선 벡터는 삼각형의 앞면을 나타내며, 표면에 수직인 벡터 역할을 한다. 삼각형은 색상 또는 텍스처 (그 위에 "붙여진" 이미지)와 함께 제공될 수 있다. 삼각형은 세 점이 항상 단일 평면에 존재하기 때문에 사각형보다 선호된다.[1]
3차원 모델의 폴리곤 메시를 형성하는 각각의 삼각형은 각각 3개의 정점으로 이루어져 있으며, 표면 또는 뒷면의 방향을 가지고 있다. 좌표 변환 후에 카메라를 향해 뒷면을 향하고 있는 삼각형을 그릴 필요가 없는 경우 파이프라인에서 제외되는데, 이 과정을 뒷면 컬링(back-face culling)이라고 부른다. 어느 면이 표면이고 어느 면이 뒷면인지는 입력 정점의 순서 및 오른손 좌표계/왼손 좌표계 중 어느 것을 채택하는지에 따라 달라진다.[1]
폴리곤의 정점 형식의 3D 모델, 텍스처, 배경 이미지, 라이팅, 모델 위치, 처리 프로그램 등을 얻는다.[1]
블렌더나 셰이드(Shade)와 같은 스플라인(베지어 곡선) 기반의 모델링 툴을 갖춘 소프트웨어에서는, 구나 원통과 같은 기하학 도형의 특징점·특징량을 수학적으로 표현할 수 있는 NURBS 모델이 사용되지만, NURBS를 직접 다룰 수 있는 GPU나 실시간 그래픽스 API의 표준 규격은 존재하지 않는다. 따라서 NURBS를 화면에 표시할 때는 한 번 폴리곤으로 근사 변환한 다음 표시된다.[1]
3. 2. 2. 세계 좌표계
세계 좌표계는 가상 세계가 생성되는 좌표계이다. 모든 축의 크기가 동일한 직각 데카르트 좌표계이며, 단위는 응용 분야에 따라 다르다. 사용할 오른손 또는 왼손 좌표계는 사용되는 그래픽 라이브러리에 따라 결정된다.[5]
예를 들어 비행 시뮬레이터를 개발하는 경우, 세계 좌표계의 원점을 지구 중심으로, 단위를 1미터로 설정할 수 있다. X축은 자오선 0도에서 적도와 교차하고, Z축은 극점을 통과하도록 정의할 수 있다. 오른손 좌표계에서 Y축은 90° 동경(대략 인도양)을 통과한다. 이렇게 하면 지구상의 모든 점을 3차원 데카르트 좌표로 표현하는 좌표계가 만들어진다.
컴퓨터 기하학 외에도 지구에는 지리 좌표가 사용된다. 위도 및 경도와 해발 고도를 사용하여 위치를 나타낸다. 지구는 정확한 구가 아니지만, 근사 변환은 다음과 같이 간단하게 수행할 수 있다.
:
:R = 지구 반지름 [6378137m], lat = 위도, long = 경도, hasl = 해발 고도.
장면 내 객체(집, 나무, 자동차 등)는 모델링을 간단하게 하기 위해 자체 객체 좌표계(모델 좌표계 또는 로컬 좌표계)로 설계된다. 이러한 객체를 세계 좌표계(전역 좌표계)에 배치하기 위해 이동, 회전, 스케일링 등의 변환을 사용한다. 이 변환은 변환 행렬을 곱하여 수행된다. 이 방법을 통해 하나의 객체(예: 나무)에서 여러 개의 다르게 변환된 사본(예: 숲)을 만들 수 있는데, 이를 인스턴싱이라고 한다.
비행기 모델을 세계에 배치하는 과정은 다음과 같다:
# 3차원 공간에서 작업하므로 4차원 동차 행렬을 사용한다.
# 먼저 각 세 개의 항공기 축(수직 축, 가로 축, 종축)에 대해 회전 행렬을 계산한다.
#:: X축 중심 회전(객체 좌표계에서 종축)
#::
#:: Y축 중심 회전(객체 좌표계에서 가로축)
#::
#:: Z축 중심 회전(객체 좌표계에서 수직축)
#::
# 항공기를 원하는 지점으로 이동시키는 이동 행렬을 계산한다.
#::
#:: ''참고'': 위의 행렬은 전치되어 있으며 회전 행렬의 행렬과 관련된다.
각 점을 네 개의 행렬로 연속적으로 곱하여 세계 좌표에서 항공기 정점의 위치를 계산한다. 벡터와 행렬의 곱셈은 계산 비용이 크므로, 일반적으로 네 개의 행렬을 먼저 곱한 후 결과 행렬을 정점에 적용한다.
북극을 제외하고 ''위''의 일반적인 의미가 양의 Z축에 대한 정의와 일치하지 않으므로 모델을 지구 중심 주위로 회전시켜야 한다. 를 통해 모델의 원점을 지구 표면 위의 올바른 높이로 이동시킨 후 위도 및 경도에 따라 회전시킨다.
행렬을 적용하는 순서는 행렬 곱셈이 교환적이지 않기 때문에 중요하다. 점 (1, 0, 0)을 X축을 중심으로 90° 회전한 다음 Y축을 중심으로 회전하면 Z축에 위치하지만, Y축을 중심으로 먼저 회전한 다음 X축을 중심으로 회전하면 Y축에 위치한다.
행렬을 정의하는 두 가지 규칙은 열 벡터 또는 행 벡터 중 어느 것을 사용하는지에 따라 달라진다. OpenGL은 열 벡터를, DirectX는 행 벡터를 사용한다.
행렬 체이닝에서 각 변환은 새로운 좌표계를 정의한다. 예를 들어, 별도로 모델링된 항공기 프로펠러는 모델에서 프로펠러 좌표계로 이동하는 변환을 통해 항공기 노즈에 부착할 수 있다. 항공기를 렌더링하려면 먼저 변환 행렬을 계산하여 점을 변환한 다음, 프로펠러 점에 대한 항공기 행렬과 프로펠러 모델 행렬을 곱한다. 이렇게 계산된 행렬을 '세계 행렬'이라고 하며, 렌더링 전에 장면에 있는 각 객체에 대해 계산해야 한다. 응용 프로그램은 이러한 행렬을 동적으로 변경하여 객체의 움직임을 표현할 수 있다.
3. 2. 3. 객체 변환
객체(집, 나무, 자동차 등)는 모델링을 더 쉽게 하기 위해 자체 좌표계(모델 좌표계 또는 로컬 좌표계라고도 함)로 설계된다. 이러한 객체를 전체 장면의 세계 좌표계 (또는 전역 좌표계) 좌표에 배치하려면 객체 좌표를 이동, 회전, 또는 스케일링하여 변환해야 한다. 이러한 변환은 해당 변환 행렬을 곱하여 수행된다.[5] 예를 들어, 나무 한 그루에서 여러 개의 다르게 변환된 사본을 만들어 숲을 형성할 수 있는데, 이 기술을 인스턴싱이라고 한다.
비행기 모델을 세계 좌표계에 배치하는 과정을 예시로 들어보자.
먼저, 3차원 공간에서 작업하므로 계산을 위해 4차원 동차 행렬이 필요하다. 3개의 회전 행렬은 각각 세 개의 항공기 축(수직축, 가로축, 종축)에 대해 필요하다.
:
:
:
또한, 항공기를 원하는 지점으로 이동하는 이동 행렬을 사용한다.
:
''참고'': 위의 행렬은 전치되어 있으며 회전 행렬의 행렬과 관련된다.[5]
세계 좌표에서 항공기 정점의 위치를 계산하려면 각 점을 이러한 네 개의 행렬로 연속적으로 곱해야 한다. 벡터가 있는 행렬의 곱셈은 비용이 많이 들기 때문에, 일반적으로 네 개의 행렬을 먼저 곱하는 방식을 사용한다. 두 행렬의 곱셈은 더 비싸지만 전체 객체에 대해 한 번만 실행하면 된다. 와 의 곱셈은 동일하다.
하지만 위의 예제에서 북극을 제외하고 ''위''의 일반적인 의미가 양의 Z축에 대한 정의와 일치하지 않으므로, 이동은 다르게 결정되어야 한다. 모델도 지구 중심 주위로 회전해야 한다. 첫 번째 단계는 모델의 원점을 지구 표면 위의 올바른 높이로 올린 다음, 위도 및 경도에 따라 회전한다.
행렬 곱셈은 교환적이지 않기 때문에 행렬을 적용하는 순서가 중요하다. 점 (1, 0, 0)을 예로 들어보자. 먼저 X축을 중심으로 90° 회전한 다음 Y축을 중심으로 회전하면 Z축에 있게 된다. 반면에 먼저 Y축을 중심으로 회전한 다음 X축을 중심으로 회전하면 결과 점은 Y축에 있게 된다. x, y, z (롤, 피치, 방위각) 순서는 종종 가장 직관적이며, 회전하면 나침반 방향이 "코"의 방향과 일치한다.
행렬을 정의하는 두 가지 규칙은 열 벡터 또는 행 벡터 중 어느 것을 사용하는지에 따라 달라진다. OpenGL은 열 벡터를 선호하고 DirectX는 행 벡터를 선호한다. 이 결정에 따라 변환 행렬로 점 벡터를 곱할 측면이 결정된다.
[5] 규칙이 적용되는데, 이는 벡터를 곱할 때 행렬을 전치하여 곱셈 순서를 변경할 수 있음을 의미한다.
행렬 체이닝에서 각 변환은 새로운 좌표계를 정의하여 유연한 확장을 허용한다. 예를 들어, 별도로 모델링된 항공기 프로펠러는 모델에서 프로펠러 좌표계로만 이동하는 변환을 통해 항공기 노즈에 부착할 수 있다. 항공기를 렌더링하려면 먼저 변환 행렬을 계산하여 점을 변환한 다음, 프로펠러 점에 대한 항공기 행렬로 프로펠러 모델 행렬을 곱한다.
이러한 방식으로 계산된 행렬을 ''세계 행렬''이라고 한다.
3. 2. 4. 카메라 변환
객체 외에도 장면은 씬이 렌더링되는 상대적인 위치와 뷰 방향을 나타내는 가상 카메라(뷰어)를 정의한다. 카메라는 원점에 위치하고 Z축을 따라 보도록 장면이 변환된다. 결과 좌표계는 카메라 좌표계라고 하며 변환을 "카메라 변환" 또는 "뷰 변환"이라고 한다.
뷰 행렬은 일반적으로 카메라 위치, 대상 지점(카메라가 보는 곳) 및 "상향 벡터"(뷰어의 관점에서 "상향")로 결정된다. 처음 세 개의 보조 벡터가 필요하다.
: Zaxis = normal(cameraPosition - cameraTarget)
: Xaxis = normal(cross(cameraUpVector, Zaxis))
: Yaxis = cross(Zaxis, Xaxis)
: normal(v) = 벡터 v의 정규화
: cross(v1, v2) = v1과 v2의 외적
:마지막으로 행렬:
:
: dot(v1, v2) = v1과 v2의 내적.
'''뷰 변환'''(View Transform)은 카메라 정보를 기반으로 하는 월드 좌표계에서 시점 좌표계로의 변환이다. '''시야 변환'''이라고도 한다.
3. 2. 5. 투영
3차원 투영 단계는 시야 체적을 모서리점 좌표가 (-1, -1, 0)과 (1, 1, 1)인 정육면체로 변환한다. 때때로 다른 대상 체적도 사용된다. 이 단계는 결과적인 Z 좌표가 이미지에 저장되지 않고 나중에 래스터화 단계에서 Z 버퍼링에만 사용되기 때문에 체적을 다른 체적으로 변환하더라도 "투영"이라고 불린다. 원근법 일러스트레이션에서는 중앙 투영이 사용된다. 표시되는 객체의 수를 제한하기 위해 두 개의 추가 클리핑 평면이 사용된다. 따라서 시각 체적은 절두 피라미드(절두체)이다. 평행 또는 직교 투영은 예를 들어 기술적 표현에 사용된다. 객체 공간의 모든 평행선이 이미지 공간에서도 평행하며, 표면과 체적이 시청자로부터의 거리에 관계없이 동일한 크기를 갖는다는 이점이 있기 때문이다. 예를 들어 지도는 직교 투영(소위 정사영)을 사용하지만, 풍경의 사선 이미지는 이 방식으로 사용할 수 없다. 기술적으로 렌더링은 가능하지만, 왜곡이 심해서 사용할 수 없다.[9]
최소 거리와 최대 거리를 여기에 제공해야 하는 이유는 한편으로는 이 거리가 장면의 크기 조정에 도달하기 위해 나뉘어지기 때문이고(원근 이미지에서 더 먼 객체가 가까운 객체보다 작음), 다른 한편으로는 Z 값을 Z 버퍼를 채우기 위해 0..1 범위로 크기 조정하기 위해서이다. 이 버퍼는 종종 16비트의 해상도만 가지므로 near 및 far 값을 신중하게 선택해야 한다. near 값과 far 값 간의 너무 큰 차이는 Z 버퍼의 낮은 해상도로 인해 소위 Z 파이팅으로 이어진다. near 값은 이 지점이 투영의 초점이기 때문에 0이 될 수 없다는 것도 공식에서 볼 수 있다. 이 지점에는 그림이 없다.[9]
투영법도 참조
3. 2. 6. 조명
장면은 종종 물체의 조명을 더 사실적으로 보이도록 다양한 위치에 광원을 포함한다. 이 경우 텍스처에 대한 이득 계수는 광원과 해당 삼각형과 관련된 재질 속성을 기반으로 각 정점에 대해 계산된다.[1] 이후 래스터화 단계에서 삼각형의 정점 값은 표면 전체에 보간된다.[1] 일반 조명(주변광)은 모든 표면에 적용되며, 이는 장면의 확산적이고 방향에 독립적인 밝기이다.[1] 태양은 무한히 멀리 있다고 가정할 수 있는 지향성 광원이다.[1] 태양이 표면에 미치는 조명은 태양에서 표면의 법선 벡터로 향하는 방향 벡터의 스칼라 곱을 형성하여 결정되며, 값이 음수이면 표면이 태양을 향하고 있다.[1]
3. 2. 7. 클리핑
래스터화 단계에서는 시각적 볼륨(절두체) 내부에 있는 기본 도형만 래스터화 단계로 전달하고, 외부에 있는 기본 도형은 삭제한다(절두체 컬링). 이론적으로 그래픽스 파이프라인의 모든 단계에서 후면 컬링과 같이 고려해야 할 기본 도형의 수를 줄이는 추가적인 컬링 방법을 실행할 수 있다. 입체 내부에 부분적으로만 있는 기본 도형은 클리핑되어야 한다. 이전 투영 단계의 장점은 클리핑이 항상 동일한 입체에 대해 수행된다는 것이다.
3차원 모델의 폴리곤 메시를 구성하는 각 삼각형은 3개의 정점으로 이루어져 있으며, 표면 또는 뒷면의 방향을 가진다. 좌표 변환 후 카메라를 향해 뒷면을 향하고 있는 삼각형은 그릴 필요가 없으므로 파이프라인에서 제외된다. 이 과정을 뒷면 컬링(back-face culling)이라고 한다. 어느 면이 표면이고 어느 면이 뒷면인지는 입력 정점의 순서 및 오른손 좌표계/왼손 좌표계 중 어느 것을 채택하는지에 따라 달라진다.
카메라의 시야인 시원뿔대(frustum) 바깥으로 벗어난 좌표는 잘라낸다. 이를 통해 처리 대상을 줄여 속도를 향상시킬 수 있다. 선분의 한쪽 또는 양쪽 끝점이 시원뿔대 밖에 있는(잘려나간) 경우에는 단선이 되는 교점이 구해진다.
3. 2. 8. 윈도우-뷰포트 변환
화면의 임의의 대상 영역(뷰포트)에 이미지를 출력하려면 또 다른 변환인 ''윈도우-뷰포트 변환''을 적용해야 한다. 이는 이동과 크기 조정을 따른다. 결과 좌표는 출력 장치의 장치 좌표이다. 뷰포트는 픽셀 단위의 윈도우 높이와 너비, 윈도우 좌표에서 윈도우의 왼쪽 상단 모서리(보통 0, 0), 그리고 Z의 최소 및 최대 값(보통 0과 1)의 6개 값을 포함한다.
형식적으로 다음과 같다.
:
: 여기서 vp는 뷰포트, v는 투영 후의 점이다.
3. 3. 래스터라이제이션 단계
래스터화 단계는 모든 기본 도형이 래스터화되는 프래그먼트 셰이더 파이프라인 이전의 마지막 단계이다. 이 단계에서 연속적인 기본 도형으로부터 개별 프래그먼트(픽셀)가 생성된다.
그래픽스 파이프라인의 이 단계에서 격자점은 구분을 위해 프래그먼트라고도 불린다. 각 프래그먼트는 프레임 버퍼의 하나의 픽셀에 해당하며, 이는 화면의 하나의 픽셀에 해당한다. 이들은 색칠될 수 있으며 (그리고 아마도 조명될 수 있다). 또한, 중첩된 다각형의 경우 관찰자에 더 가까운, 즉 보이는 프래그먼트를 결정해야 한다. Z-버퍼는 일반적으로 이른바 은면 처리에 사용된다.[10] 프래그먼트의 색상은 보이는 기본 도형의 조명, 텍스처 및 기타 재질 속성에 따라 달라지며, 삼각형 꼭지점 속성을 사용하여 보간되는 경우가 많다. 사용 가능한 경우, 객체의 각 프래그먼트에 대해 프래그먼트 셰이더 (또는 픽셀 셰이더)가 실행된다. 프래그먼트가 보이면, 투명도 또는 멀티 샘플링이 사용되는 경우 이미지의 이미 존재하는 색상 값과 혼합될 수 있다. 이 단계에서 하나 이상의 프래그먼트가 픽셀이 된다.
사용자가 기본 도형의 점진적인 래스터화를 보지 못하도록 하기 위해 이중 버퍼링이 수행된다. 래스터화는 특수 메모리 영역에서 수행된다. 이미지가 완전히 래스터화되면 이미지 메모리의 가시 영역으로 복사된다.
래스터라이제이션은 렌더링 장면을 래스터 형식으로 변환하여 2차원 이미지 공간에 표현한다. 이를 통해 픽셀 값이 결정된다.
래스터라이즈 처리에는 다음 처리가 포함된다. 특히 삼각형 내 픽셀별 색상을 결정하는 픽셀 셰이딩 처리가 파이프라인의 주요 처리를 차지한다.
실시간 그래픽스 처리 시스템에서는 렌더링된 폴리곤의 법선 방향으로만 조명을 계산하고 있다. 정점 간의 조명 값은 래스터라이즈 중에 보간된다. DirectX 7 세대까지는 면 단위로 음영 처리를 하는 플랫 셰이딩과 정점 단위로 음영을 보간하는 정점 단위 셰이딩(Gouraud 셰이딩)이 주류였지만, 이후에는 보다 고품질의 픽셀 단위 셰이딩(Phong 셰이딩)을 래스터라이즈 후에 실시하고 있다.
4. 셰이더
최신 그래픽 카드는 자유롭게 프로그래밍 가능한 셰이더 제어 파이프라인을 사용하여 개별 처리 단계에 직접 접근할 수 있다. 주요 셰이더 유닛으로는 정점 셰이더, 지오메트리 셰이더, 픽셀 셰이더가 있다.[6]
통합 셰이더는 단일 셰이더 유닛 풀을 제공하며, 필요에 따라 셰이더의 서로 다른 그룹으로 나뉜다. 따라서 셰이더 유형 간의 엄격한 분리는 더 이상 유용하지 않다.
GPGPU라고도 불리는 컴퓨트 셰이더를 사용하면 GPU에서 그래픽 디스플레이 외의 계산을 수행할 수 있다. 컴퓨트 셰이더는 매우 병렬로 실행되지만 몇 가지 제한 사항이 있다.
DirectX 11 및 OpenGL 4.3의 셰이더 처리 흐름은 다음과 같다.
DirectX 11 | OpenGL 4.3 |
---|---|
(*) 표시는 범용 셰이더에서 실행된다고 가정되는 스테이지이다.
정점 셰이더는 정점 단위 처리를, 테셀레이션 스테이지에서는 정점을 새롭게 부가할 수 있다. 지오메트리 셰이더(프리미티브 셰이더)는 프리미티브의 증감이나 종류 변경이 가능하다. 래스터라이저는 폴리곤을 2차원 배열 픽셀에 대응시키며, 텍스처 데이터를 사용할 수 있다. 텍스처를 구성하는 화소는 텍셀이라고 불린다. 픽셀 셰이더(프래그먼트 셰이더)는 픽셀 단위 처리를 수행한다.
5. 실시간 처리
CAD, 드라이브 시뮬레이터, 항공 시뮬레이터 및 게임 등 영상을 실시간으로 생성하는 용도에서는 그래픽스 파이프라인이 실시간으로 작동해야 한다(최소 30~60 프레임/초). 이는 사전에 영상 작품을 생성하는 영화 산업과는 대조적이다. 따라서 실시간을 상정하는지 여부에 따라 렌더링 파이프라인에 요구되는 요건(정밀도 및 방향성)이 다르다.
실시간 용도에서는 실시간성을 확보하기 위한 연산량 감소가 최우선이며, 다양한 방법을 사용하여 물체 표면의 질감 등을 의사적으로, 근사적으로 만들어내는 경우가 많다.
6. 구현
그래픽스 파이프라인은 일련의 연산이며, 이를 실제 컴퓨터에서 어떻게 구현할지에 대해서는 다양한 접근 방식이 있을 수 있다.
- 가장 단순한 구현은 CPU를 이용한 범용 계산이다. 구현으로서의 파이프라인 처리를 수행하지 않고, 파이프라인의 각 스테이지를 필요에 따라 계산한다. 초기 그래픽스(파이프라인)는 이 형태로 구현되었다.
- '''고정 기능 파이프라인'''(Fixed function pipeline영어)은 각 스테이지가 고정 기능(전용 회로)으로 구현된 파이프라인이다.[16] 그래픽스 처리가 소수의 기능을 병렬로 수행하는 특성에 주목하여, 전용 회로로 구현된 스테이지를 파이프라인 처리하여 고속화한다는 사상으로 생겨난 개념이다. 초기의 GPU는 고정 기능 파이프라인이었으며, '''하드웨어 T&L'''(Hardware Transform & Lighting영어) 등의 고정 기능을 연결하여 파이프라인으로 구성했다.[17] DirectX 9 세대가 주류였던 2005년 경까지는, 그래픽 카드에 탑재되는 정점 셰이더 유닛 및 픽셀 셰이더 유닛을 각각 증설하고, 순서대로 처리를 수행하게 하는 것이 렌더링 고속화의 주류였다.[18]
- 프로그래머블 파이프라인(Programmable pipeline)은 각 스테이지의 동작이 프로그램으로 동적으로 제어되는 파이프라인이다.[19] 고정 기능 파이프라인은 하드웨어 수준에서 정해진 처리를 고속으로 실행할 수 있지만, 유연하게 처리의 동작을 변경할 수 없다. 그래픽스 알고리즘이 날마다 발전하는 상황에서는 뛰어난 알고리즘이 하드웨어 제약으로 효율적으로 실행되지 못하는 상황이 발생한다.[20] 그렇다면 더 범용적인 하드웨어를 실행 시에 프로그램으로 동적으로 제어하면 된다는 사상으로 만들어진 개념이 프로그래머블 파이프라인이다. DirectX 8세대 이후, GPU는 프로그래머블 파이프라인을 지향하게 된다. DirectX 8, DirectX 9 및 OpenGL 2.x에서는 프로그래밍 가능한 스테이지는 정점 셰이더 및 픽셀 셰이더뿐이었지만, DirectX 10 및 OpenGL 3.2 이후에는 지오메트리 셰이더(기하 셰이더)가 추가되었다. 그래픽스 API 측면에서도 DirectX 10이나 OpenGL 3.1 이후에는 기본적인 변환 처리부터 고도화된 효과까지 모든 동작 지시를 셰이더 프로그램으로 기술해야 도형을 그리는 것조차 불가능하게 되었다. 프로그래머블 파이프라인에서는 범용 셰이더 유닛의 유동적인 활용을 통해 고속화를 실현하고 있다.[18] 2015년 현재, 프로그램 처리가 가능한 범용 회로의 수가 최대 수천 개를 넘는 규모가 되었다.[21][22][23]
참조
[1]
웹사이트
Graphics Pipeline
https://msdn.microso[...]
Microsoft
2018-05-30
[2]
웹사이트
Lecture: Graphics pipeline and animation
http://goanna.cs.rmi[...]
[3]
웹사이트
3D Polygon Rendering Pipeline
http://www.connellyb[...]
2012-10-22
[4]
서적
https://books.google[...]
[5]
서적
Lineare Algebra
v/d/f Hochschulverlag der ETH Zürich
1998
[6]
Youtube
Advanced API Performance: Mesh Shaders
https://developer.nv[...]
[7]
웹사이트
Khronos Vulkan Tutorial - Drawing a triangle -Graphics pipeline basics
https://docs.vulkan.[...]
Khronos
2024-08-10
[8]
강의자료
第1回 レンダリングパイプライン
https://tokoik.githu[...]
和歌山大学
[9]
강의자료
第1回 レンダリングパイプライン
https://tokoik.githu[...]
和歌山大学
[10]
강의자료
第8回 レンダリング技法1 ~基礎と概要,隠面消去~
http://hideki-todo.c[...]
明治大学
[11]
강의자료
第8回 レンダリング技法1 ~基礎と概要,隠面消去~
http://hideki-todo.c[...]
明治大学
[12]
강의자료
第8回 レンダリング技法1 ~基礎と概要,隠面消去~
http://hideki-todo.c[...]
明治大学
[13]
웹사이트
ストリーム出力ステージ (Direct3D 10)
https://msdn.microso[...]
[14]
웹사이트
ParticlesGS サンプル
https://msdn.microso[...]
[15]
웹사이트
Vulkan Specification - Pipelines
https://docs.vulkan.[...]
Khronos
2024-08-10
[16]
기타
[17]
기타
[18]
뉴스
3Dグラフィックス・マニアックス (7) GPUとシェーダ技術の基礎知識(7) | マイナビニュース
http://news.mynavi.j[...]
[19]
강의자료
Programmable Graphics Pipelines
https://graphics.sta[...]
Stanford University
[20]
기타
[21]
웹사이트
GeForce GTX 980 グラフィックスカード | GeForce | NVIDIA
http://www.nvidia.co[...]
[22]
웹사이트
GeForce GTX Titan Black グラフィックスカード | NVIDIA
http://www.nvidia.co[...]
[23]
뉴스
ASCII.jp:TITANを追撃! AMD「Radeon R9 290/290X」の戦力をチェック (1/4)|最新パーツ性能チェック
https://ascii.jp/ele[...]
[24]
기타
Graphics pipeline
http://www.answers.c[...]
Computer Desktop Encyclopedia
2005-12-13
[25]
웹사이트
https://terms.naver.[...]
[26]
서적
Real-Time Rendering
https://leonmercanti[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com