티스토리 뷰
1-1) OpenGL과 그래픽스 파이프라인
프로그램에서 만들어진 명령 → OpenGL → 그래픽스 하드웨어
이 과정에서 효율적이고 더 많은 명령처리를위해 '병렬화'로 작업을 진행.
'파이프라인 분할'과 '병렬화'를 조합하여 사용 → 그래픽 프로세서의 성능 극대화
OpenGL의 목표는 애플리케이션과 그 하부 그래픽스 subsystem의 '추상화 레이어'를 제공하는 것
# 출처 : 네이버
GPU(Graphics Processing Unit) : 그래픽카드의 핵심 칩
게임에 입체감을 부여하고자 3D 그래픽이 본격적으로 도입되었고, 화면을 보다 현실적으로 만들기 위한 각종 광원 효과 및 질감 표현 기법이 점차 발전하기 시작했다. 이러한 작업들을 CPU 혼자서 처리하기에는 버겁기 때문에 이를 보조할 3D 그래픽 연산 전용의 프로세서, 즉 GPU(Graphics Processing Unit)가 개발되어 그래픽카드에 탑재되기 시작했다.
GPU는 매우 유연해서 그래픽스와 관련 없는 물리 시뮬레이션, 인공지능, 오디오 프로세싱 등의 작업이 수행가능하다.
OpenGL의 설계 원칙은 추상화 수준의 균형을 이루는 것.
GPU는 '쉐이더'라 불리는 작은 프로그램(명령어 덩어리)을 실행하는 쉐이더 코어로 이루어 져 있다.
# 출처 : 위키백과
쉐이더(Shader) : 컴퓨터 그래픽스 분야에서 쉐이더(shader)는 소프트웨어 명령의 집합으로
주로 그래픽 하드웨어의 렌더링 효과를 계산하는 데 쓰인다.
쉐이더는 GPU의 프로그래밍 가능한 렌더링 파이프라인을 프로그래밍하는 데 쓰인다.
렌더링(Rendering) : literally (어떤 상태가 되게)만들다
# 출처 : 위키백과
렌더링(Rendering)은 컴퓨터 프로그램을 사용하여 모델(또는 이들을 모아놓은 장면인 씬(scene) 파일)로부터
영상을 만들어내는 과정을 말한다.
하나의 씬 파일에는 정확히 정의된 언어나 자료 구조로 이루어진 개체들이 있으며,
여기에는 가상의 장면(씬)을 표현하는 도형의 배열, 시점, 텍스쳐 매핑, 조명, 쉐이딩 정보가 포함될 수 있다.
씬 파일에 포함된 자료들은 렌더링 프로그램에서 처리되어 결과물로서 디지털이미지, 래스터 그래픽스 이미지 파일을 만들어낸다.
렌더링 방식은 기술적으로 매우 다양하지만, GPU같은 렌더링 장치를 통한 그래픽스 파이프라인을 따라
씬 파일에 저장되어있는 3차원 연출로부터 2차원의 그림을 만들어낸다는 점은 동일하다.
GPU는 CPU가 복잡한 렌더링 계산을 수행할 때 도움을 주도록 만들어진 장치다.
하나의 씬이 가상의 조명 아래에서 비교적 사실적이고 예측 가능한 상태로 보인다면
다음으로 렌더링 소프트웨어는 렌더링 계산을 수행해야 한다.
렌더링 계산은 모든 조명 효과를 계산하지는 않으며, 컴퓨터에서 만들어진 '비유적 조명'을 계산한다.
또한 '렌더링'은 마지막 비디오 출력물을 만들어내기 위해 영상 편집 파일의 효과를 계산하는 과정을 지칭하는 데 쓰이기도 한다.
3차원 컴퓨터 그래픽스의 주된 부차적 논제들 가운데 하나이며 현실적으로 렌더링과 다른 논제들과도 연결된다.
그래픽스 파이프라인에서 렌더링은 모델과 애니메이션에 최종 모습을 제공하는 마지막 단계이다.
1970년대 이후로 컴퓨터 그래픽스가 점차 복잡하게 바뀌어감에 따라 렌더링은 더 다양해지는 주제다.
렌더링은 아키텍쳐, 비디오 게임, 시뮬레이터, 영화, CG, 디자인 시각화에서 사용되며 분야마다 서로 다른 기능과 기술을 이용한다. 또 렌더링을 위해 다양한 렌더링 프로그램을 이용할 수 있다. 어떠한 프로그램들은 대형 모델링, 애니메이션 패키지를 만드는 데
통합되며 어떠한 것들은 독립형 제품이고 또 어떠한 것들은 자유 소스 프로젝트에 속해 있다.
렌더링 프로그램은 광학, 비주얼 시스템, 수학, 소프트웨어 개발과 관련된 선택적 혼합에 기반을 둔 공학 프로그램이기도 하다.
쉐이더 코어란 다수의 작은 프로그래밍이 가능한 프로세서다.
코어는 상대적으로 처리량이 낮고, 쉐이더의 명령하나를 여러 클록사이클로 수행한다.
하지만 각 GPU는 수십·수천의 코어수를 가지며, 이를 통합하여 엄청난 양의 일을 수행할 수 있다.
그래픽스 시스템은 여러 스테이지로 나뉜다.
각 스테이지는 쉐이더나 설정가능한 프로세싱 블록인 고정함수로 구분된다.
# 그래픽스 파이프라인
빨간박스 : 고정함수
- 버텍스패치, 테셀레이션, 래스터라이제이션, 프레임버퍼
흰박스 : 프로그래밍 가능
- 버텍스쉐이더, 테셀레이션 컨트롤쉐이더, 테셀레이션 이벨류에이션쉐이더, 지오메트리쉐이더, 프래그먼트쉐이더
1-2) OpenGL의 기원과 진화
OpenGL : 실리콘 그래픽스의 IRIS GL로 시작. 오픈소스 라이브러리
OpenGL의 두가지 profile
1) Core profile, 코어프로파일 / 2) Compatibility profile, 호환성프로파일
1-3) 프리미티브, 파이프라인, 픽셀
OpenGL은 '파이프라인'의 모델을 따른다. 데이터는 단방향이며, 프로그램에서 호출한 명령이 데이터 형태로
파이프라인의 앞단에 들어오고 각 스테이지를 거쳐 최종 파이프라인에 도달한다.
쉐이더나 다른 고정 파이프라인 블록들이 파이프라인 내에서 '버퍼'나 '텍스쳐' 등으로부터 추가 데이터를 받아서 처리한다.
이러한 '버퍼'나 '텍스쳐' 등의 자료구조는 렌더링시에 사용할 정보를 저장하는 용도다.
파이프라인의 특정 스테이지에서는 이러한 '버퍼'나 '텍스쳐'에 데이터를 저장하기도 하는데,
이를통해 애플리케이션이 데이터를 읽거나 저장하거나 저장한 데이터를 다시 읽을 수 있다.
OpenGL 렌더링의 기본단위 : 프리미티브(Primitive)
세가지 기본 렌더링 타입 : 점, 선, 삼각형
애플리케이션은 보통 복잡한 서피스를 많은 수의 삼각형으로 분할하고 OpenGL로 보내
'래스터라이저' 라는 하드웨어 가속기를 사용하여 렌더링한다.
래스터라이저 : 3차원으로 표현된 삼각형을 화면에 그려질 일련의 픽셀로 변환하는 전용 하드웨어.
삼각형 : 항상 볼록(Convex). 따라서 폴리곤을 그리는 규칙을 만들기도 쉽고, 구현하기도 쉽다.
오목(Concave)한 폴리곤은 둘 이상의 삼각형으로 분할 할 수 있기에, 하드웨어는 삼각형 렌더링을 직접 지원하고
다른 subsystem들을 통해 복잡한 지오메트리를 삼각형으로 분할 할 수 있다.
버텍스(Vertex) : 좌표 공간상의 하나의 점.
그래픽스 파이프라인은 두개의 주요파트로 분할된다.
1) 프론트앤드(Front-end) : 버텍스와 프리미티브를 처리하여 점, 선, 삼각형으로 구성하고 이를 래스터라이저에 보내는 역할
( = 프리미티브 어셈블리(Primitive Assembly))
래스터라이저 이후에는 지오메트리가 벡터 형태에서 대량의 각각의 픽셀로 변환된다.
2) 백앤드(Back-end) : 변환된 픽셀의 깊이 및 스텐실 테스트, 프래그먼트 쉐이딩, 블렌딩 등의 작업을 처리