그래픽API
응용프로그램 → 그래픽 라이브러리 → 그래픽 하드웨어 → 키보드/마우스/그래픽 카드 등
그래픽 라이브러리
- 컴퓨터 그래픽스에 관련되어 기본적으로 사용하게 되는 그래픽스 함수들의 모음
- CPU에서 실행되기 보다 GPU에 의해 하드웨어가 가속되는 PC에서 더 일반적으로 수행
- 각각의 라이브러리에 따라 사용법 및 특성이 다르지만 일반적으로 지원하는 함수/기능은 포함
- 그래픽 라이브러리의 초기화 또는 그래픽 카드 시스템의 초기화 미 설정 함수들
- 점, 선, 원, 타원 등을 그리는 기본 함수들
- 이미지 표현, 스프라이트 처리 등의 부가적 함수들
- 효과) 그래픽 하드웨어 관련 프로그래밍을 하지 않고 함수를 가지고 원하는 그래픽 프로그램을 작성 가능
- 3D, 2D 지원 라이브러리의 차이
- 2D를 지원하는 그래픽 라이브러리라고 해서 3D를 프로그램 할 수 없는 것은 아니다.
- 모니터 화면 상에서 3D도 2D로 표현되므로 결국 2D로 3D를 표현할 수 있는 것
- 따라서 라이브러리가 자체적으로 3D를 지원하는 함수 제공의 유무 차이
- 종류) Direct2D(2D), OpenGL(2D,3D), Skia(2D), Cairo(2D), GDI(2D)
한글과컴퓨터에서 2D 위주로 사용하여 2D 라이브러리 위주 조사
GDI (Graphic Device Interface), GDI+
- 소개 : MS가 제작한 윈도우 1.0부터 윈도우 XP 때까지 사용하였던 2D 그래픽 라이브러리(1985)
- 지원 OS : Windows
- GPU 사용 유무 : 전부 CPU에서 처리
- 특징 :
- 모니터, 프린터 등 출력 장치에 선, 직선, 도형, 비트맵 등의 그래픽 출력을 위해 프로그래머가 사용할 수 있는 함수와 구조체를 제공
- 하드웨어를 추상화 한다.
- GDI+ ) 수정 및 기능을 추가하여 Windows XP에서 GDI+로 출시
- 특이사항 :
- 장점 )응용 프로그램이 그래픽 출력 장치에 대한 종속성을 줄이기 위한 목적으로 만들어져 장치 독립적인 출력이 가능
- 단점 )
- 그래픽 카드에 구애 받지 않기 위해 그리는 동작 전부 CPU에서 처리 → 느린 속도
- 기능 부족 : 일반적인 업무용 프로그램 수준의 간단한 그래픽 처리는 가능하지만, 다채로운 기능을 지원하지 않는다 ⇒ DirectX, Vulkan, OpenGL로 대신 사용
- +DC (Device Context)
- Windows Application 에서 화면 출력을 위한 출력 속성을 정의하는 구조체
- GDI 오브젝트를 모아놓은 곳
- +Window의 기본 동적 연결 라이브러리(Dynamic Linked Library)
- Kernel) 메모리 관리, 프로그램 실행
- User) 유저 인터페이스, 윈도우 관리
- GDI) 화면 처리, 그래픽 등 모든 출력 장치 제어
- GDI &DC 정리 → GDI가 출력 장치를 제어 → GDI 모듈이 Device Context 관리 → DC는 GDI Object(화면에 출력하는 요소) 가짐 → 이를 활용하여 다양한 요소를 화면에 출력
Direct2D
- 소개 : GDI/GDI+의 후속 제품으로 MS의 Windows Vista부터 지원한 2D 기하 도형, 비트맵 및 텍스트에 대한 고성능 렌더링을 제공하는 2D 그래픽 라이브러리(2009)
- 제작 ****이유 : Windows XP까지 쓰이던 그래픽 드라이버 계층은 그래픽 카드의 성능 발전에 대응하지 못하는 단점이 있어 Windows Vista부터 새로운 그래픽 드라이버 계층을 만들었고 CPU에서 처리 하는 일을 줄이기 위해 제작되었다.
- 지원 OS : Windows
- GPU 사용 유무 : DirectX 9 이상 지원하는 GPU
- 특징 : GDI, GDI+를 대체한다. GDI 계열 API에서 CPU에 의존하던 처리를 GPU에 분산하여 빠르게 동작하고, 높은 화질의 2D 그래픽을 제공하도록 설계
- 특이사항 : 하드웨어 가속 → 빠른 속도, 높은 품질
- 많이 선호 되는 이유 : GDI, GDI+, Direct3D와 잘 상호 운용되도록 설계되었고, 다른 순수 윈도우 기술과 함께 동작한다.
- ex) GDI를 사용하면서 하드웨어 가속이 필요한 부분만 Direct2D로 구현
⇒ 최신 GPU를 더 잘 활용하는 것은 Direct2D를 사용하는 것 이다.
OpenGL(Open Graphics Library), OpenGL ES
- 소개 : 1992년 실리콘 그래픽스사에서 제작한 2D, 3D 그래픽 라이브러리
- 지원 OS : 다양한 플랫폼에서 사용 가능 (Windows, Linux, IOS, OS X 등)
- GPU 사용 유무 : GPU 사용 → 하드웨어 가속화
- 특징 :
- 오직 그래픽에 필요한 부분만 지원하여 GUI의 창에 대한 지원은 따라 해야 한다.
- 그래픽 카드마다 지원하는 세부적인 API에 대한 구현 여부가 다르므로 지원 API, 렌더링이 달라질 수 있다.
- Low Level API
- 특이사항 : MS의 DirectX 컴포넌트 일부인 Direct3D와 라이벌 → OpenGL은 전문적인 툴(CAD, 의학, 애니메이션)에서 주로 사용 → Direct3D는 게임에서 주로 사용 , Windows 플랫폼에서만 작동
- 많이 선호 되는 이유 :
- 크로스 플랫폼 그래픽 라이브러리, 다양한 언어에서 사용 가능하다.
- 리소스의 관리가 대부분 Direver 차원에서 이뤄지기 때문에 개발자에게 편리하다.
- OpenGL ES : 모바일 환경에서 구동할 수 있게 단순화한 버전
- OpenGL의 동작 Vertices → Pixels로 변환하는 과정 지원(Graphics Pipeline)
- Vertex : 도형을 구성하는 하나의 점
- Pixel : 모든 렌더링 연산이 끝난 후 화면에 보이는 하나의 점
Skia
- 소개 : 구글의 다양한 HW/SW 플랫폼에서 공통 API를 제공하는 벡터 그래픽 기반의 오픈 소스 2D 그래픽 라이브러리로 텍스트, 기하 도형 및 이미지 그리는데 사용 (2005)
- 벡터 그래픽 = 점, 선, 곡선 또는 다각형과 같은 기하학적 기본 요소를 사용하여 이미지를 표현하는 것 → 더 작은 크기 표현, 무한 확대 기능 , 편집으로 인한 화질 저하를 시키지 않는다.
- 지원 OS : Windows, MacOS, IOS, Android, Linux 등 다중 플랫폼 지원
- GPU 사용 유무 : GPU 사용 → 하드웨어 가속화
- 특징 :
- 구글 크롬, Chrome OS, Android, Flutter, Firefox, Firefox OS 등 많은 다른 제품들의 그래픽 엔진 역할을 한다.
- Flutter의 그래픽 엔진으로 사용되면서 유명해졌으며 Skia는 OpenGL을 통해 렌더링한다.
- PDF 출력
- C++ 언어로 작성
- 차별점 : 다중 플랫폼을 유지하기 위해 여러 백엔드를 지원한다. ex) PDF, OpenGL
- ”백엔드를 지원한다” = 어떤 방식으로 렌더링 할 것 인가
- 특이사항 : 자체 위젯 및 UI 등을 제공하는 정교한 API보다 그리기에 초점을 둔 Cairo와 목적이 가장 유사하다.
- 많이 선호 되는 이유 : 필요에 맞게 수정 가능하며 고품질의 기능을 제공 ex) Webkit, Canvas 포트
Cairo
- 소개 : 벡터 그래픽 기반의 장치 독립적 API를 제공하는 오픈소스 2D 그래픽 라이브러리
- 지원 OS : Linux, Windows, BSD 및 Mac OS 등 다중 플랫폼 지원 (2003)
- GPU 사용 유무 : GPU 사용 → 하드웨어 가속화
- 특징 :
- C언어로 작성, 바인딩이 작성되면 다른 언어로 사용 가능
- 다중 출력 장치를 지원한다.
- 지원되는 출력 대상 ex) PDF, SVG 파일, X Window System 등
- 안정적이고 많은 바인딩을 사용할 수 있다.
- 차별점 : 다중 플랫폼을 유지하기 위해 여러 백엔드를 지원한다. ex) OpenGL로 렌더링 +OpenGL과 혼합 이점) OpenGL에서 제공하지 않는 그래디언트 렌더링 기능에 액세스 가능
- 특이사항 :
- 도면 라이브러리일 뿐이므로 GUI 툴킷과 통합하는 것이 매우 유용하다. EX)FLTK
- 그래픽이 방정식 등을 사용하여 픽셀인 래스터/비트맵 그래픽과 대조적으로 이미지 생성
- 많이 선호 되는 이유 : 다양한 플랫폼에서 사용 가능
Skia vs Cairo
Skia | Cairo |
---|
C++ | C |
Custom build System | Standard build System |
context가 분리되어있다. ex) SkCanvas - drawing, SkPaint - style | cairo_t에 모든 Drawing context 포함 |
Windows, MacOS 플랫폼에서 우수 (*OpenGL 백엔드가 있는 Skia) | Linux/GTK 플랫폼에서 우수 |
탄생 순서 ) GDI(1985)→ OpenGL(1992) → Cairo(2003) → Skia(2005) → Direct 2D(2009)
그래픽 렌더링(Rendering)
- 물체의 위치나 조명 같은 외부의 환경을 고려하여 최종적으로 완성된 화상의 결과를 얻어내는 변환 기술 (= 이미지 합성 기술)
- 3차원 공간의 객체를 2차원 화면인 하나의 장면에 바꾸어 표현
3차원 장면에 여러 가지 렌더링 적용. 위키피디아