방통대2/컴퓨터 그래픽스
컴퓨터 그래픽스 소프트웨어
book_lover
2024. 4. 3. 00:44
컴퓨터 그래픽스 영상의 표현
래스터 그래픽스 영상이란?
- CRT의 래스터 주사방식에서 사용된 용어
- 사각형 격자 좌표 형태의 픽셀 배열로 표현됨
- 디지털 카메라, 스캐너 등을 통해 입력한 영상, MS Paint나 Photoshop, GIMP와 같은 영상 편집기를 이용하여 만든 영상
- BMP, PNG, GIF, TIFF, JPEG 등의 파일 형식으로 저장
래스터 그래픽스 영상의 특성
- 색 표현의 정밀도 : 각 픽셀당 색을 표현하는데 사용되는 비트 수에 의해 결정됨
- 영상으 크기 : 영상의 가로 픽셀 수 X 세로 픽셀 수로 표현
- 영상을 저장하기 위한 메모리 양은 영상의 크기 및 색 표현의 정밀도에 의해 결정됨
- 그림을 확대해도 더 세밀한 그림을 얻을 수는 없음
초 해상도를 이용해 정밀도를 얻을 수는 있음
벡터 그래픽스 영상이란
- 벡터 : 크기와 방향을 동시에 나타내는 값
- 벡터 그래픽스 영상 : 점, 직선, 곡선, 다각형과 같은 기하학적 도형을 이용하여 표현한 그림
- Adobe illustator, CorelDRAW 등의 그래픽스 에디터로 제작
- 3dsMax, Maya 등의 3차원 그래픽스 패키지에서도 벡터 방식으로 물체를 설계함
- SVG, WMF, DXF, STL, VRML 등의 파일 형식
벡터 그래픽스 영상의 특성
- 영상을 저장하는데 필요한 메모리 양은 영상의 크키가 아니라 영상에 들어 있는 그래픽스 기본요소(도형) 의 수에 의해 결정됨
- 렌더링을 통해 래지터 영상을 만들어 디스플레이 함
와이어 프레임 영상(래스터 형식으로 보여준 결과임) | 렌더링 결과 |
![]() |
- 영상을 확대해도 화질이 떨어지지 않으며, 자연스럽게 형체를 유지하며 확대됨
우리가 보는 화면의 이미지는 좀 더 크게 그림을 그려주는것 일뿐 래지터 형식임
- 사진과 같은 영상을 표현하기에는 적절하지 않음
- 래스터 이미지 벡터화 : 수 많은 도형이 생기기 때문에 크기가 용량이 느려남
raster vectorization, image tracing 이라는 기술을 활용 함
- 래스터 이미지 벡터화 : 수 많은 도형이 생기기 때문에 크기가 용량이 느려남
래스터 그래픽스 | 벡터 그래픽스 |
![]() |
![]() |
그래픽스 소프트웨어의 유형
1. 컴퓨터 그래픽스패키지
특수목적 패키지
- 응용분야에 맞는 그림을 생성하기 위한 그래픽스 패키지
- CAD 패키지 : 건축, 기계, 전자회로 등의 제품 설계
- 페인트 패키지 : 래스터 그림이나 사진 등을 제작하거나 편집
- 3차원 모델링 및 애니메이션 : 3ds Max, Maya, Unity 등
범용 그래픽스 API
- 전문 프로그래머가 C/C++, Java 등의 프로그래밍 언어에서 사용할 수 있는 그래픽스 라이브러리
- 장면 설계 및 렌더링을 위한 최적하된 함수를 제공함
2. 그래픽스 API의 역할
저수준 그래픽스 API
- 그래픽 기본요소 및 그 속성 지정, 기하변환, 뷰잉 등 장면을 정의하면 컴퓨터 화면에 표시하는 일련의 과정을 지시하는 함수들을 제공
- 프로그래머는 이 함수들을 이용하여 장면을 구성하고, 이를 화면에 그리기 위한 세부적인 처리 과정을 하나하나 프로그램으로 작성
- GL, OpenGL, Direct3D 등
고수준 그래픽스 API
- 장면 묘사를 위주로 하는 기능을 제공
- 다양한 모형 (큐브, 다각형, 재질, 카메라, 광원 등)을 제공
- 기존 모형을 새로운 모형으로 쉽게 변형할 수 있게 함
- 모형들로 구성된 객체들을 계층적으로 조직화하여 장면을 구성함
- 고수준 그래픽스 API의 예
- Open Inventor : OpenGL에 기반을 둔 객체지향 3D 그래픽스 API
- VRML(Virtual-Reality Modeling Language)
- Java 3D
OpenGL 프로그래밍
1. OpenGL 개요
OpenGL이란
- SGL의 그래픽 워크스테이션에 IRIS GL(Integrated Raster Imaging System Graphics Libray)이라는 그래픽스 API를 제공
- GL을 다양한 워크스테이션에서 활용할 수 있도록 하드웨어에 독립적인 버전인 OpenGL을 개발
- SGI, DEC, IBM, Apple, Microsoft, Nvidia 등과 함께 OpenGL Architecture Review Board(ARB)를 구성하여 OpenGL을 유지,관리
- 2006년부터 Khronos Group에서 관리
- 저수준 절차적 API
OpenGL의 진화
- 그래픽스 하드웨어 발전에 맞추어 새로운 버전으로 진화
- OpenGL 1.0(1992) - 고정 기능 그래픽스 파이프라인
- OpenGL 2.0(2004) - GLSL(OpenGL Shading Language), 그래픽카드를 동작시키는 언어
- OpenGL 3.0(2008) - 디프리케이션(deprecation) 모델 도입, 앞으로 사라지는 기술 설명 및 유도
- OpenGL 4.0(2010) - 두 단계의 새로운 테셀레이션 셰이더 추가
- OpenGL 4.6(2017)
- 고정 기능 파이프라인에서 프로그램 가능 파이프라인으로 진화
2. OpenGL의 라이브러리
OpenGL core profile
- 셰이더 프로그램의 준비
- 셰이더가 사용할 데이터의 준비
- 2, 3차원 기하학적 구조, 텍스처 이미지 등
- 여러 가지 OpenGL 상태 설정, 기하학적 구조의 그리기 지시 명령 등
- OpenGL compatibility profile : 구 버전과의 호환성을 위해 제공되는 기능을 포함
OpenGL의 확장 기능
- OpenGL은 하드웨어 발전에 맞추어 진화하는 API임
- 하드웨어 공급업체에서 확장 기능을 제공
- 다수의 공급자의 동의 하에 구현 - EXT
- ARB의 승인 - ARB
- 새로운 버전의 OpenGL에 수용
- 하드웨어 공급업체에서 확장 기능을 제공
- OpenGL의 확장 기능을 관리하는 라이브러리 활용
- GLEW(OpenGL Extension Wrangler)
- GLEE(OpenGL Easy Extension)
윈도 입출력을 위한 라이브러리
- OpenGL은 장치 독립적인 라이브러리
특정 윈도 시스템을 위한 기능은 해당 윈도 시스템을 위한 라이브러리가 필요함 - Microsoft Windows : WGL 인터페이스 루틴 사용
- X Winodw : GLX 루틴 사용
- 애플 시스템 : AGL 루틴 사용
윈도 시스템에 의존적 프로그램이 되어 더이상 독립적인 라이브러리가 아님
윈도시스템 독립적 윈도 인터페이스 라이브러리
- GLUT(OpenGL Utility Toolkit) 라이브러리
- 함수에는 'glut'라는 접두사를 사용
- 현재는 더 이상 유지보수가 제공되지 않음
- freeglut 라이브러리
- GLUT를 대신할 수 있는 라이브러리
- freeglut32.lib 라이브러리 파일 및 freeglut.h헤더파일을 사용
3. OpenGL의 자료형
4. OpenGL의 함수 이름 형식
5. 셰이더
OpenGL 파이프라인
고정된 파이프라인 | 프로그래밍 가능한 파이프라인 |
● 꼭짓점 전달(Vertex Puller) ● 테셀레이션 기본 요소 발생기(Tessellation Primitive Gen.) ● 래스터화 (Rasterization) |
● 꼭짓점 셰이더(Vertex Shader) ● 테셀레이션 제어 셰이더(Tessellation Controll Shader) ● 테셀레이션 계산 셰이더(Tessellation Evaluation Shader) ● 기하구조 셰이더(Geometry Shader) ● 프레그먼트 셰이더(Fragment Shader) |
GLSL(OpenGL Shading Language)
- OpenGL ARB가 셰이더 프로그램 작성용 언어로 만든 C언어 형태의 프로그래밍 언어
- OpenGL 그래픽스 파이프라인 중 프로그램 가능 단계를 수행하는 셰이더 프로그램 가능 단계를 수행하는 셰이더 프로그램을 작성함
- 꼭지점 셰이더, 테셀레이션 제어 셰이더, 테셀레이션 계산 셰이더, 기하구조 셰이더, 프래그먼트 셰이더
6. OpenGL 프로그램 예제
전체적인 프로그램 구성
// 선언부
#include <stdio.h> // 기본 입출력 헤더 파일
#include <gl/glew.h> // 확장기능 라이브러리
#include <gl/freeglut.h>
// 윈도우 시스템과 독립적으로 활용하는 함수 라이브러리,
//freeglut에서 gl.h가 include되어있어 따로 할 필요가 없음
typedef struct { // 3차원 좌표를 표현하기 위한 구조체
float x, y, z;
} Vec3f;
enum {TRIANGLE, N_VBOs};
GLuint VBO[N_VBOs]; // 꼭짓점 버퍼 객체
// 셰이더 프로그램
// 꼭지점을 저장하는 버퍼생성 함수
void InitVBOs()
{
Vec3f Vertices[3] ={ // 삼각형의 꼭짓점 좌표
{-0.5f, -5.0f, 0.0f},
{5.0f, -5.0f, 0.0f},
{0.0f, 5.0f, 0.0f}
};
// 꼭짓점 버퍼를 생성하여 삼각형의 꼭짓점 좌표 전달
glGenBuffers(N_VBOs, VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO[TRIANGLE]);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
};
// 화면 렌더링 콜백 함수(RenderCB 함수)
{
glClearColor(1.0f, 1.0f, 1.0f, 1.of); // R, G, B, Alfa
glClear(GL_COLOR_BUFFER_BIT); // 백색으로 화면 지움
glEnableVertexAttribArray(0); //
glBindBuffer(GL-ARRAY_BUFFER, VBO[TRIANGLE]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glFinish();
};