[렌더링 파이프 라인] 🤯
해당 포스팅은 21년 9월에 정리한 자료이므로, 현재 최신 정보와 상이한 정보가 있을 수 있습니다.
문제가 되는 부분 혹은 현재와 상이한 정보가 있을 시, 댓글 남겨주시면 확인 후 수정하겠습니다 :)
그래픽스 파이프라인이란?
3D 컴퓨터 그래픽스에서 그래픽스 파이프라인(Graphics Pipeline)이란 3차원의 도형 혹은 이미지를 2차원 래스터* 이미지로 표현을 하기 위한 단계적 방법을 의미한다.
여기서 래스터(raster)란? 컴퓨터에서 어떠한 도형 혹은 이미지를 픽셀로 구성하고, 이 점들의 모습을 조합, 일정한 간격의 픽셀들을 나열하여 하나의 화면을 표현하는 것을 의미한다.
OpenGL과 Direct3D가 3차원 그래픽 표준이며, 비슷한 그래픽스 파이프라인을 가지고 있다. 이를 다른 단어로, 렌더링 파이프라인 (Rendering Pipeline) 이라고도 한다.
파이프 라인의 종류는 아래와 같이 나뉘어진다.
- 1. 고정 기능 파이프 라인
- 2. 프로그래머블 파이프 라인
1. 고정 기능 파이프 라인
* D3D(Direct3D) 에 미리 정해진 연산을 수행할 수 있도록 제공되는 기능이 고정기능 파이프라인이라고 한다.
* 정해진 연산만 수행하므로 프로그래머가 GPU 연산에 관여할 수 없다.
2. 프로그래머블 파이프 라인
* 고정 기능 파이프 라인에서 제공하는 것 이외의 효과를 내기 위해서 생겨난 프로그래머블 파이프 라인이다.
* 프로그래머가 GPU의 직접 관여할 수 있다.
* 고정적으로 제공하던 셰이더를 프로그래머가 다양한 효과를 낼 수 있게끔 제공하게 되었다.
즉, 고정 기능 파이프라인과 프로그래머블 파이프라인의 차이점이라고 하면 프로그래머가 GPU 연산에 관여할 수 있냐? 없냐?의 차이일 뿐이다. 보다 정확하게 말하면, Fixed -> Programmable로 대체된 것이다.
랜더링 파이프라인의 과정
프로그래머블 파이프라인의 버텍스 쉐이더는 고정 기능 파이프라인 과정 중 모델과 뷰스페이스 변환, 조명, 투명변환의 역할을 수행한다.
그래픽스 파이프라인 과정 설명
1. 3D 모델 구축 (=로컬 스페이스)
* 이미 모델링 된 파일의 정보를 불러오고 로컬 좌표계를 통해 3차원 모델의 정점들을 구축하는 단계이다.
* 해당 과정의 연산은 CPU가 담당한다.
* 여기서 로컬(모델) 좌표계는 모델 하나의(오브젝트 자신 기준) 좌표계이다.
* 좌표는 모든 오브젝트에 독립적으로 존재한다.
2. 가상 공간 배치 (=월드 스페이스)
* 불러온 3D 오브젝트를 월드 좌표계로 변환하여 하나의 장면을 구성하는 단계
* 마찬가지로 해당 과정의 연산은 CPU가 담당한다.
여기서 월드 좌표계는 각각의 오브젝트(모델)들을 월드라는 가상의 개념의 원점을 두고 상대적 위치를 표현하기 위해 사용되는 좌표계이다.
월드 좌표계와 로컬 좌표계 개념이 처음에는 많이 어렵고 헷갈린다. 보다 쉽게 설명하면 로컬 좌표계는 우리의 몸이라고 생각하면 된다. 우리 몸은 수 많은 관절로 이루어져 있다. 그 관절의 위치, 회전, 크기 등이 각 관절의 고유한 정보이고 그 정보들이 하나가 되어 우리 몸이 되는 것이다. 그리고 그 몸이 이 우주 안에 어느 한 위치(월드좌표계)에 존재를 하는 상태이다.
3. 정점 단위의 음영 계산
* 정점 쉐이더를 통해 각 점들의 음영(그림자)을 처리하는 단계이다.
* 정점 쉐이더는 정점의 위치에 대한 정보를 입력으로 받아 화면 상의 정점 위치를 반환하는 쉐이더이다.
* 즉 데이터 상의 위치를 화면 상의 위치로 변환시켜준다.
* 이 과정의 연산은 GPU가 담당합니다.
4. 카메라 공간의 전개 (=뷰 스페이스)
월드 좌표계로 변환된 좌표계를 한 카메라 좌표계를 기준으로 변환하는 단계이다.
5. 컬링
최종 화면에서 보이지 않는 부분을 제거하여 렌더링 연산에서 제외하는 단계이다.
컬링의 종류로는 시각 절두체 컬링, 후면 제거 컬링, 폐쇄 컬링이 있다. 면접에서 영어로도 물어볼 수 있으니 영어로도 알아두면 편리하다. 각각의 개념들이 글로 읽어도 이해가 되지 않는다면 아래 이미지를 참고하자.
* 시각 절두체 컬링(View-frustrum Culling) : 카메라 시야 범위에 포함되는 오브젝트만 렌더링 하고 나머지는 오브젝트들은 렌더링하지 않는 기법. 카메라 시야 바깥에도 오브젝트들은 존재하지만 이를 렌더링 및 연산하지 않는다.
* 후면 제거 컬링(Back-face Culling) : 보이지 않는 후면을 예외 처리하는 기법으로 버텍스를 그리는 순서에 따라 시계 방향, 반시계 방향을 판정한다. 오른손 좌표계 기준으로 후면은 시계방향이다.
* 폐쇄 컬링(Occlusion Culling) : 다른 오브젝트에 의해 가려지는 부분은 비 활성화하는 기법이다. 오브젝트가 다른 오브젝트의 가려져서 카메라에 보이지 않을 때에 해당 오브젝트를 렌더링 및 연산하지 않는 기법이다. 보이지 않는 오브젝트 그 자체를 전부 컬링한다.
6. 조명
* 광선으로 밝게 비춤 또는 그 광선 자체를 나타낸다.
* 3D 공간에는 빛이 없지만 현실 세계의 빛을 3요소로 만들어 흉내낸다.
* 조명의 요소에는 크게 3가지 정반사광, 난반사광, 환경광 등이 있다.
* 광원의 3가지인 방샹성 광원, 점 광원, 스포트 광원이 있다.
* 이보다 더 다양한 조명 요소, 광원들이 있으니 이는 그때 그떄마다 검색하는 것을 추천한다
7. 클리핑
* 카메라의 시야로부터 사라진 폴리곤을 렌더링하지 않거나 시야에 걸친 폴리곤을 추려내어 처리하는 단계.
* 오브젝트에 따라 직선 클리핑, 다각형 클리핑으로 나눌 수 있고, 카메라의 범위를 기준으로 완전한 내부, 부분적 내부, 완전한 외부로 나눌 수 있다. 이를 프러스텀 클리핑이라 한다.
* 완전한 내부 : 삼각형이 완전히 시야 안에 위치하면 보존된다.
* 완전한 외부 : 삼각형이 완전히 시야 외부에 위치하면 그리지 않는다.
* 부분적 내부 : 삼각형이 부분적으로 내부에 위치하면 삼각형이 두 개의 부분으로 분리된다.
8. 투영
* 3D 물체를 2D 평면에 표현하기 위해 3D 모델 좌표를 2D 평면 좌표로 변환하는 단계.
* 투영에는 두개의 종류가 있다. 이는 직교 투영과 원근 투영 이다.
* 직교 투영 : 2D 기준으로 좌표를 변환하는 것이며 주로 3D 게임을 만들 때 UI 등에 사용된다.
* 원근 투영 : 3D 좌표계를 좌표를 변환하는 것이며 3D 모델들이 주로 사용된다.
9. 뷰포트 변환 (=윈도우 좌표계 변환)
* 프로젝트 윈도우의 뷰포트라 불리는 화면의 직사각형으로 변환하는 과정을 말한다.
* 모니터에서 화면을 전개하기 전에 해당 클라이언트의 화면 사이트로 바꾸는 단계이다.
* 윈도우와 상대적이며 이때 좌표계는 윈도우 좌표계로 변경되어 이용한다.
10. 폴리곤 셋업과 래스터 라이즈
폴리곤 셋업
* 정점 파이프라인에서 정점 단위로 출력된 결과를 픽셀 단위로 분해하여 픽셀 파이프라인으로 보내주는 작업
* 랜더링 파이프라인의 래스터라이즈에 해당한다.
레스터 라이즈.
* 스크린 좌표로 버텍스들을 변환하면 폴리곤 정보를 가지게 되는데 레스터라이즈는 각각의 폴리곤을 출력하는데 필요한 픽셀 컬러를 계산하는 과정이다. 단순하게 얘기하면 폴리곤을 픽셀로서 변환하는 과정이다.
* 여기서 래스터란 컴퓨터에서 화상 정보를 표현하는 한 가지 방법으로 이미지를 2차원 배열 형태의 픽셀로 구성하고 이 점들의 모습을 조합하여 일정한 간격의 픽셀들로 하나의 화상 정보를 표현하는 것이다. 즉 한 줄에서 연속된 픽셀들의 집합이다.
11. 픽셀 단위의 음영 계산
* 픽셀로 변환된 것을 픽셀 쉐이더를 통해 음영을 계산한다.
* 픽셀 쉐이더는 래스터 라이즈된 결과물을 입력으로 받아 픽셀의 색을 반환한다.
12. 텍스쳐 적용 (= 맵핑)
* 3D 모델에 텍스쳐를 적용한다.
* 폴리곤의 광원, 조명의 조합만으로는 실감나는 3D 오브젝트를 표현하는데 한계와 더불어 광원 및, 조명 효과와 같은 많은 계산량을 요구하는 작업으로 인해 생기는 단점을 극복하기 위해 대안으로 나온 기술
13. 렌더 백엔드
* 현재까지의 과정이 잘 되었는지 검증하는 단계로 알파, 깊이, 스텐실 테스트 등을 수행할 수 있다.
* 알파 테스트 : α성분을 비교하여 그에 따른 출력을 결정
* 깊이 테스트 : 렌더링 순위가 정해져 있지 않을 때에 깊이 값으로 정렬하여 후면 버퍼의 깊이 버퍼와 비교하는 테스트
* 스텐실 테스트 : 사용자가 원하는 부분은 출력에서 제외 (거울, 그림자 효과 등)
14. 출력
이렇게 나온 화면을 최종적으로 출력한다.
출처 : https://tech-interview.tistory.com/91
출처 : https://m.blog.naver.com/kim2733137/221878677072
출처 : https://m.blog.naver.com/jsjhahi/206651669
파일 비밀번호 힌트 '8K'
'공부 > 그래픽스' 카테고리의 다른 글
노멀 맵(Normal Map)이란? (0) | 2023.06.12 |
---|---|
더블 버퍼링(Double Buffering)이란? (0) | 2023.06.12 |