OpenGL?
OpenGL이란 무엇인가? (Open Graphics Library)
OpenGL은 그래픽 하드웨어를 제어하기 위한 소프트웨어 인터페이스입니다. 원래 SGI(Silicon Graphics)에서 시작된, 가장 널리 쓰이는 그래픽 API 중 하나입니다. 본질적으로는 3D를 “그리게” 해주는 도구예요. 2D에도 사용할 수 있지만, 2D만을 위해서는 Allegro, SDL 같은 다른 패키지도 존재합니다. OpenGL은 많은 애플리케이션에서 쓰이는 그래픽 라이브러리이며, 보통 3D 그래픽을 렌더링하는 API로 사용됩니다.
이 인터페이스는 수백 개의 서로 다른 명령으로 구성되어 있습니다. 핵심 OpenGL(GL) 명령들, 그리고 OpenGL Utility Library(GLU)의 추가 명령들이 존재하죠. 이런 명령들은 인터랙티브 3D 애플리케이션을 만들기 위해 필요한 오브젝트와 연산을 지정하는 데 사용됩니다. OpenGL은 하드웨어 독립적으로 설계되었습니다.
OpenGL이 “하지 않는 것들”
OpenGL은 다음을 제공하지 않습니다: 타이밍, 파일 I/O, 애니메이션, 이미지 파일 포맷 처리, GUI 등. 또한 OpenGL 자체는 윈도우 시스템(창)이나 입력 장치(마우스/키보드)와 연결하는 루틴을 제공하지 않기 때문에, 그 역할을 GLUT가 담당합니다. GLUT는 창을 띄우고, 입력을 처리하는 등의 윈도우/입력 처리 기능을 제공합니다.
아래 영상은 창 생성 → 창에 그리기 → 변환(transformations) → 리쉐이핑(reshaping) → 메뉴 → 마우스 입력까지의 기본 단계를 담고 있습니다.
GLSL
OpenGL Shading Language로 C언어 기반입니다( 여러분들은 드디어 C언어를 배운 보람을 느낄 수 있습니다..).
GLSL을 통해 OpenGL의 쉐이더를 다룰 수 있습니다.
OpenGL은 GPU인터페이스이기에, 쉽게 말해 GLSL을 통해 GPU에서 실행 가능한 프로그램을 구현할 수 있습니다.
일상적으로 여러분이 보시는 브라우저 화면, 또한 OpenGL을 통해 GPU와 통신하고, 게임, 영상 등.. 가시적인 화면에 대한 모든 어플리케이션은 OpenGL을 통해 GPU와 통신하고 그 결과 화려한 이펙트, 디자인 등, 모든 것들이 가능한 것입니다.
What is Shader?
쉐이더는, 구글링하면 장황한 설명들이 나오나, 그냥 GPU에서 돌아가는 프로그램입니다. 대표적으로 앞으로 매우 많이 볼 (Vertex Shader , Fragment Shader)가 있습니다.
일반적으로 앞서 말한것 처럼 Vertex Shader, Fragment Shader 처럼 앞에 붙은 단어에 맞게 구분되며, GPU의 렌더링(Hardware graphics acceleration) 파이프라인을 성공적으로 이루기 위해, 각 프로세스 마다 수행하는 일들이 있습니다.
Vulka??
Vulkan에 대해 들어본 적이 있을 수도 있는데, Vulkan은 Khronos Group이 OpenGL의 “대체재(replacement)”로 개발하고 있는 API입니다. Vulkan은 OpenGL 그래픽 API의 차세대 버전으로, GPU에 초점을 맞춘 차세대 그래픽 및 컴퓨트(연산) API입니다. 또한 데스크톱, 게임, 모바일, 임베디드(내장형) 플랫폼 전반에서 사용할 수 있는 단일 API가 되는 것을 목표로 합니다.
History/Overview (역사/개요)
OpenGL은 시간이 지나면서 계속 변화해왔습니다. 3.0 이후의 최신 버전들은 GPU 기술 발전 덕분에 더 강력해졌습니다.
초기 파이프라인(버전 1.0, 1994년 7월)은 고정 기능(fixed-function) 방식이었습니다.
버전 2.0에서는 **프로그래머블 셰이더(programmable shaders)**가 추가되었습니다.
3.0에서는 하드웨어 성능/구조에 맞게 파이프라인이 바뀌었습니다.
3.1(2009년 3월)에서는 파이프라인이 다시 변화하며, 데이터가 **GPU에 상주(GPU-resident)**하는 형태가 되었습니다.
3.2에서는 **지오메트리 셰이더(geometry shaders)**와 **컨텍스트 프로파일(context profiles)**이 도입되었습니다.
OpenGL 4.1(2010년 7월)에는 테셀레이션 컨트롤 셰이더와 테셀레이션 평가 셰이더가 포함되었습니다.
최신 버전은 4.5입니다.
따라서 GLSL이 매우 중요해집니다.
OpenGL의 파생(변형)
•
OpenGL ES 2.0: 휴대폰/핸드헬드 기기용. GL 3.1을 기반으로 하며 셰이더 기반
•
WebGL: ES 2.0의 자바스크립트 구현. 브라우저에서 실행됨
영향(예시)
예를 들어 Houdini는 GL3.0 코어를 채택했기 때문에, 이제 Houdini에서 OpenGL 버전을 직접 설정하는 옵션을 찾기 어렵습니다. 이는 스펙에 다음처럼 명시되어 있습니다:
“Houdini를 실행하려면 GL3 호환 그래픽 카드가 필요합니다. Windows와 Linux에서는 GL3 그래픽 카드와 GL3.3 드라이버가 필요합니다.”
파이프라인(아주 단순하게)
파이프라인은 간단히 말해
버텍스 처리(vertex processing) → (사용자가 제어하지 않는) 래스터라이저(rasterizer) → 프래그먼트 처리(fragment processing) 입니다.
GLUT이란? (OpenGL Utility Toolkit) / Freeglut이란?
GLUT은 OpenGL이 아닙니다.
GLUT은 OpenGL 창(window)을 만들기 위해 사용할 수 있는 라이브러리입니다.
우리는 GLUT(또는 아래에 따로 설명된 freeglut)를 사용할 예정입니다. GLUT는 OpenGL Utility Toolkit의 약자로, OpenGL 프로그램을 작성하기 위한 윈도우 시스템 독립적인 툴킷입니다.
“윈도우 시스템 독립적”이 무슨 뜻이냐면, GLUT가 OpenGL을 배우고 실험하기 쉽게 만들어주기 위해, 운영체제(OS)와 관련된 시스템 레벨 I/O 기능을 제공한다는 뜻입니다. 예를 들어:
•
창 정의(window definition)
•
창 제어(window control)
•
키보드/마우스 입력 모니터링
•
여러 가지 기본 도형(primitive shapes) 그리기
GLUT는 Silicon Graphics Inc(현재는 NVIDIA에 합류한 것으로 언급됨)에서 일하던 Mark J. Kilgard가 작성했고, Nate Robins가 Microsoft Windows(WGL)로 포팅했습니다.
GLUT는 창 관리, 메뉴, 입출력(I/O) 장치에 대해 플랫폼 독립적인 인터페이스를 제공하는 라이브러리입니다.
GLUT를 더 알아볼 수 있는 좋은 사이트 링크가 있고, freeglut 사이트 링크도 있습니다.
또한 MATERIALS 폴더에 단계별 예제 파일이 있으며, 이 예제들은 Linux와 Windows 모두에서 동작합니다. GLUT는 충분히 테스트되어 있습니다.
(참고: F15 기준으로 Windows에서는 glut가 freeglut로 대체되었다고 합니다.)
Freeglut
Freeglut은 (현재는 지원이 중단된) GLUT의 또 다른 대안입니다. GLUT와 매우 비슷하며, 글쓴이는 개인 Windows PC에서 테스트해봤다고 합니다. 만약 GLSL(그래픽 라이브러리 셰이딩 언어)까지 제대로 공부하고 싶다면, freeglut을 glew 또는 OpenGL Unofficial SDK와 함께 사용하는 것을 권장합니다. 다만 이 내용은 수업 범위를 넘어선다고 합니다. (reeglut, glew, glsl 조합)
Windows에서 집에서 freeglut을 사용하고 싶다면, Visual Studio에서 freeglut 설정하는 방법과 MinGW에서 freeglut 사용하는 방법에 대한 안내가 있다고 합니다. 또한 Linux에서도 freeglut을 사용하는 안내가 있고, CentOS에서 테스트했다고 합니다.
관심이 있다면 비슷한 훌륭한 자료들도 찾아볼 수 있으며, 위에서 GLUT를 설명했던 것처럼 freeglut도 링크에서 찾을 수 있다고 합니다.
이런 조언을 하는 주된 이유는, 많은 GLSL 예제 파일들이 freeglut과 glew를 기반으로 하거나, 혹은 freeglut이 포함된 OpenGL Unofficial SDK를 사용하기 때문입니다. Martin Payne의 사이트는 MSVC와 MinGW용 바이너리도 제공합니다. glew와 함께 설치하는 방법은 아래 링크에서 확인할 수 있다고 합니다.
(원문 링크: http://www.cs.uregina.ca/Links/class-info/315/WWW/Lab1/GLUT/windows.html)
또한 이 링크에는 Angel.zip에 대한 링크도 포함되어 있는데, Angel.zip은 freeglut에 의존하는 유틸리티 파일 세트이며 많은 GLSL 예제에서 사용된다고 합니다. Morten Nobel-Jorgensen의 블로그에는 훌륭한 스타터 예제도 있다고 합니다.
glew의 대안들도 링크에서 목록으로 제공되며, 그 목록에는 FreeGlut이 포함된 unofficial OpenGL SDK도 포함되어 있다고 합니다.
또 다른 관련 주제로는 **SFML(Simple and Fast Multimedia Library)**이 있는데, 이것도 API 인터페이스를 제공할 수 있습니다. 아주 간단한 개요를 다룬 토론 글 링크가 있으며, context 및 window toolkits 목록 링크도 있다고 합니다.
TIP(주의사항): freeglut을 사용할 때 변수 이름으로 far 또는 near를 쓰지 마세요. 이 변수명은 glut에서는 유효하지만 freeglut에서는 문제가 될 수 있습니다.
(원문 링크: http://sourceforge.net/p/freeglut/bugs/205/)
Computer Graphics Tools (컴퓨터 그래픽스 도구)
게임과 VSFX(비주얼 이펙트)는 다양한 방식으로 컴퓨터 그래픽스 도구를 사용합니다. 이 도구들은 하드웨어와 소프트웨어로 나뉩니다.
•
하드웨어 도구에는 다음이 포함됩니다:
◦
출력 장치: 비디오 모니터, 프린터
◦
입력 장치: 마우스/트랙볼, 펜/드로잉 태블릿, 키보드
◦
그래픽 카드
•
소프트웨어 도구에는 다음이 포함됩니다:
◦
운영체제(OS), 에디터(editor), 컴파일러(compiler), 디버거(debugger), 그래픽 라이브러리(OpenGL)
Computer Graphics Libraries (컴퓨터 그래픽스 라이브러리)
컴퓨터 그래픽스 라이브러리는 선, 원, 큐브 등의 도형을 그리기 위한 함수/명령(command)들로 구성됩니다.
요즘은 장치(플랫폼)에 독립적인 라이브러리들이 존재하며, 이를 API라고 부릅니다. 예: OpenGL, DirectX, Java3D
즉, OpenGL로 만든 프로그램은 Windows에서도, Linux에서도 실행될 수 있습니다.
참고 사항
OpenGL은 컴퓨터 그래픽스의 핵심 개념들을 많이 포함하는 아주 방대한 주제입니다. 우리는 OpenGL을 깊게 다루기보다는 간단히 훑어보고, 이 수업에서 여러분이 만들 최종 과제(또는 선택적으로 HDK)에 비주얼 인터페이스를 구현하기 위한 도구로서 OpenGL을 사용할 것입니다.
우리가 사용할 OpenGL 및 glut/freeglut 코드의 개요를 보려면 여기를 클릭하세요.
추가로 중요한 점
glutMouseFunc에서 전달되는 x, y 값은 윈도우(창) 기준 좌표입니다.
즉, 창의 왼쪽 위(upper-left)가 (0,0) 입니다.
하지만 OpenGL에서는 보통 왼쪽 아래(bottom-left)가 원점(origin)인 경우가 많습니다.
따라서 여러분이 오쏘(ortho) 뷰를 어떻게 설정하느냐에 따라, 좌표계를 맞추기 위해 **리매핑(remap)**이 필요할 가능성이 큽니다.

