방통대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임
    • 하드웨어 공급업체에서 확장 기능을 제공
      1. 다수의 공급자의 동의 하에 구현 - EXT
      2. ARB의 승인 - ARB
      3. 새로운 버전의 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();
};