본문 바로가기
New/컴퓨터 그래픽스

컴퓨터 그래픽스 소프트웨어 (1)

by onenewkong 2024. 12. 22.

컴퓨터 그래픽스 영상의 표현

컴퓨터 그래픽스 영상은 도형을 표현하는 방식에 따라 크게 두 가지로 분류할 수 있다. 하나는 래스터 그래픽스 영상이고, 다른 하나는 벡터 그래픽스 영상이다.

래스터 그래픽스 영상은 사각형 격자 형태의 좌표에 맞추어 나열된 픽셀로 표현되며, 각각의 픽셀에는 그 위치에 해당하는 색이 지정된다. 래스터 영상은 스크린에 표시되는 영상과 픽셀 대 픽셀로 대응한다. 이는 컴퓨터 시스템에서 디스플레이 장치의 비디오 메모리에 영상을 저장하고 이를 디스플레이에 표현하는 것과 같은 형태이며, 일반적으로 장치 독립적이다. 래스터 영상의 크기는 영상을 이루고 있는 가로 픽셀 수와 세로 픽셀 수로 표현한다. 각 픽셀당 색을 표현하는 데 필요한 비트 수에 따라 색 표현의 정밀도가 결정된다.

래스터 그래픽스로 표현된 그림은 확대해도 더 세밀한 그림을 얻을 수는 없으며, 그림을 확대할 때 렌더링하여 화질을 유지하는 벡터 그래픽스 영상과 대조되는 단점이다.벡터 그래픽스는 수학 방정식을 기반으로 점, 직선, 곡선, 다각형과 같은 물체를 표현하는 것을 말한다. 예를 들어 직선을 표현하고자 할 때 래스터 그래픽스에서는 직선을 구성하는 모든 픽셀의 정보를 저장해야 한다. 하지만 벡터 그래픽스에서는 시작점과 끝점의 정보만 저장하기 때문에 적은 용량으로도 표현할 수 있다. 그리고 하나의 도형을 한 가지 색으로만 표현할 수 있기 때문에 정교한 색상을 사용해야 하는 사진과 같은 영상을 표현하기에는 적절하지 않지만, 수학적으로 표현되기 때문에 크게 확대해도 화질이 떨어지지 않는다는 장점이 있다. 벡터 그래픽스 영상은 글꼴의 디자인이나 그래픽 디자인에 유리한 반면, 래스터 그래픽스 영상은 사진이나 사진에 가까운 영상을 표현할 때 실용적이다.

 

컴퓨터 그래픽스 소프트웨어

일반적으로 컴퓨터 그래픽스를 위한 소프트웨어는 특수목적 그래픽스 패키지와 범용 그래픽스 응용 프로그래밍 인터페이스(API)로 구분할 수 있다.특수목적 패키지는 다양한 응용 분야에 맞는 그림을 생성하기 위한 기능 및 편리한 사용자 인터페이스를 지원하기 때문에 전문 프로그래머가 아니더라도 고품질의 그래픽스 출력물을 제작할 수 있다.범용 그래픽스 API는 전문 프로그래머가 C/C++, Java, Fortran 등과 같은 프로그래밍 언어에서 그래픽스 함수를 사용하여 프로그램을 작성할 수 있도록 하는 그래픽스 라이브러리를 의미한다. 그래픽스 API는 장면의 설계 및 렌더링 작업을 처리하기 위한 최적화된 함수를 제공한다. 이러한 함수들은 CPU 상에서 동작되는 소프트웨어로만 작성될 수도 있고, GPU에 의하여 가속되는 하드웨어의 지원을 받을 수도 있다. 그래픽스 API를 사용하면 프로그래머는 이러한 함수를 작성하고 최적화하는 부담을 덜게 되고, 그래픽스 응용 프로그램을 작성하는 데에만 몰두할 수 있다.범용 그래픽스 API는 저수준 그래픽스 API와 고수준 그래픽스 API로 나눌 수 있다. 저수준 그래픽스 API는 그림을 구성하는 점, 선, 다각형과 같은 그래픽스 기본 요소 및 이들에 대한 색상, 문양 등의 속성을 정의하고, 객체의 기하변환, 장면의 뷰잉 등 장면을 정의하여 이를 컴퓨터 화면에 표시하는 일련의 과정을 지시하는 함수들이 포함된다. 저수준 그래픽스 API를 이용하여 장면을 만들고자 할 때에는 장면 내의 물체를 구성하는 기본 요소들을 개별적으로 정의하고, 이들을 그리기 위한 세부적인 처리 과정을 일일이 프로그램으로 작성해야 한다.고수준 그래픽스 API는 장면 묘사를 위주로 하는 기능을 제공한다. 이러한 기능들은 내부적으로 저수준 API를 이용하여 구현될 수 있다. 고수준 그래픽스 API는 그래픽스 작업을 보다 단순하고 효율적으로 구현할 수 있도록 다양한 모형을 제공하고, 이를 새로운 모형으로 쉽게 변형할 수 있게 한다. 장면의 구성은 이러한 모형들로 구성된 객체들을 계층적으로 조직화하여 처리한다.

 

셰이더

[ OpenGL 파이프라인 ]

[ Vertex Puller → Vertex Shader  → Tessellation Controll Shader →  Tessellation Primitive Gen → Tessellation Evaluation Shader → Geometry Shader → Rasterization → Fragment Shader → 프레임 버퍼 동작 ]Vertex Shader는 꼭짓점 버퍼 객체를 통해 전달한 꼭짓점 및 관련 데이터에 대해 각각의 정점 단위로 프로그램에 의해 지정된 처리를 하여 다음 단계로 전달한다. 꼭짓점 셰이더는 OpenGL 프로그램에 반드시 있어야 하는 단계이다.Tessellation Shader는 OpenGL 파이프라인 내에서 추가적으로 기하구조를 발생시킬 수 있는 단계이다. 이 단게는 선택적 단계로, 응용 프로그램에서 명시적으로 제공한 기하구조만 사용하도록 건너뛸 수 있다.Geometry Shader는 OpenGL 파이프라인 내에서 전체 기하구조 기본 요소들을 수정할 수 있는 단계다. 이 단계 역시 선택적 단계다.마지막 단계는 Fragment Shader이다. 프래그먼트는 그래픽스 기본 요소를 프레임 버퍼에 그리기 위한 하나하나의 픽셀값을 구하는 것과 관련한 데이터를 의미한다. 이 데이터에는 프래그먼트의 래스터 좌표, 깊이 정보, 색, 알파, 텍스처 좌표 등이 포함된다. 프래그먼트 셰이더는 래스터화 단계에서 발생된 개별 프래그먼트의 색 정보와 깊이 정보를 계산하여 후속 처리 단계로 보낸다. 프래그먼트 셰이더는 OpenGL 프로그램에서 반드시 있어야 하는 단계이다.