2. 그래픽스프로그래밍의소개 2.1 OpenGL 이란? 2.1.1 OpenGL 의정의 2차원또는 3차원드로잉을위한표준그래픽스라이브러리 - 그래픽스하드웨어에대한소프트웨어인터페이스 - C나 C++ 과같은프로그래밍언어는아님 - 그래픽스하드웨어에잘구현될수있음 -C언어기반라이브러리 - 상태기반아키텍쳐 - 즉시모드 (Immediate mode) 기반 그래픽스라이브러리 = 수백개의함수들 - Primitive functions : 무엇을그릴것인가? = 점, 삼각형, 사각형, 도형모양 - Attribute functions : 어떻게그릴것인가? = 색상, 패턴모양, 선분의두께, 점의크기등 -Viewingfunctions: 카메라를어떻게다룰것인가? = 카메라의위치, 방향 - Transformation functions : 변환을어떻게처리할것인가? = 위치변환, 크기변환, 회전변환, 투영변환 - Input functions : 입력을어떻게받아들일것인가? = 마우스의좌( 우) 측버튼, 드래깅여부, 키보드, 조이스틱 - Control functions : 윈도우를어떻게관리할것인가? = 윈도우의크기, 위치, 이벤트처리방법 2.1.2 OpenGL 라이브러리종류 GL (Graphics Library): 저수준렌더링루틴으로구성된기본그래픽스라이브러리 - 표기법 : gl---- 로시작, 예) glcolor(1.0, 0.0, 0.0); GLU (OpenGL Utility Library) : 고수준함수들을제공하는 OpenGL의보완물 -2D 이미지확대/ 축소 - 구, 원통, 원반등을포함한 3D 객체들의렌더링 - 하나의이미지로자동적으로여러단계의 mipmap 이미지생성 - NURBS를통한곡면지원 - 오목다각형의테셀레이션지원 - 특수용도의변환과행렬 - 표기법 : glu---- 로시작, 예) glusolidsphere(1.0); GLUT(OpenGL Utility Toolkit) : - 윈도우설정 - 윈도우처리 주요플랫폼에서사용할수있는보조라이브러리
- 이벤트처리 - 표기법 : glut--- 로시작, 예) glutmainloop(); 2.2 OpenGL 2.2.1 자료형 기본구조 OpenGL 자료형 내부표현방식 C언어자료형 C 언어접미사 GLbyte 8-bit integer signed char b GLshort 16-bit integer short s GLint, GLsizei 32-bit integer long i GLfloat, GLclampf 32-bit floating point float f GLdouble, GLclampd 64-bit floating point double d GLubyte, GLboolean 8-bit unsigned integer unsigned char ub GLushort 16-bit unsigned integer unsigned short us GLuint, GLenum, GLbitfield 32-bit unsigned integer unsigned long ui 2.2.2 함수명령규칙 OpenGL 함수들은모두일정한규칙을가지고있다. 그래서그함수가어느라이브러리속하는지, 몇개의인자를받고각인자의타입이무엇인지, 어떤역할을하는지에관한내용을함수이름에서알수있도록한다. 각함수이름은다음의네부분으로구성된다. 라이브러리종류를나타내는접두사 command를나타내는어근 인자의개수 ( 선택) 인자의타입 ( 선택) 예 ) glcolor3f(1.0, 0.0, 0.0) gl : GL 라이브러리함수임을의미 Color : 색상에관련된함수임을의미 ( 첫글자는대문자로시작한다.) 3 : 3 개의인자를받겠다는의미 (red, green, blue) f: 받아지는인자들은 float형식의자료들임을의미 2.2.3 OpenGL 프로그램예제를통한이해 #include <windows.h> #include <gl/glut.h> // (or others, depending on the system in use) void init (void) { glclearcolor (1.0, 1.0, 1.0, 0.0) ; // Set display-window color to white. glmatrixmode (GL_PROJECTION); // Set projection parameters. gluortho2d (0.0, 200.0, 0.0, 150.0); } void RenderScene (void) {
} glclear (GL_COLOR_BUFFER_BIT); // Clear display window. glcolor3f(1.0, 0.0, 0.0); // Set line segment color to red. glbegin (GL_LINES); glvertex2i (180, 15); // Specify line-segment geometry. glvertex2i (10, 145); glend(); glflush (); // Process all OpenGL routines as quickly as possible. void main (int argc, char** argv) { glutinit (&argc, argv); // Initialize GLUT. glutinitdisplaymode (GLUT_SINGLE GLUT_RGB); // Set display mode. glutinitwindowposition (50, 100); // Set top-left display-window position. glutinitwindowsize (400, 300); // Set display-window width and height. glutcreatewindow ("An Example OpenGL Program"); // Create display window. init(); // Execute initialization procedure. glutdisplayfunc (RenderScene); // Send graphics to display window. glutmainloop(); // Display everything and wait. } 헤드파일부분 #include <windows.h> #include <gl/glut.h> "windows.h" 라는헤드파일은모든응용 windows 애플리케이션에필요하며 WIN32 함수프로토타입의 대부분을포함하고있다. 그러나이헤더파일을꼭추가할필요는없다. 그이유는 WIN32 버전의 GLUT 라이브러리는 window.h를 glut.h 에포함하고있기때문이다. glut.h는 OpenGL과 GLU 라이브러리 함수를정의하는헤드파일도포함한다. 만약 GLUT를사용하지않는다면두개의파일 gl.h 와 glu.h 도추가하여야한다. main 부분 void main (int argc, char** argv) { glutinit (&argc, argv); // Initialize GLUT. glutinitdisplaymode (GLUT_SINGLE GLUT_RGB); // Set display mode. glutinitwindowposition (50, 100); // Set top-left display-window position. glutinitwindowsize (400, 300); // Set display-window width and height. glutcreatewindow ("An Example OpenGL Program"); // Create display window. init(); // Execute initialization procedure. glutdisplayfunc (linesegment); // Send graphics to display window. glutmainloop(); // Display everything and wait. } 콘솔모드의 C나 C++ 프로그램은항상 main 함수에서시작한다. Windows 프로그램인경우에는 WInMain 이그역할을담당한다고볼수있다. 일반적으로 main 함수는다음과같은네개의과정을
포함한다. 시스템초기화 - 시스템에맞는윈도우를스크린에띄우는작업 - OpenGL를윈도우에결합하는작업 OpenGL 초기화 - OpenGL 좌표계설정 - 초기치상태값설정 답신함수등록 - 이벤트가발생하면실행될내용을하나의함수로설정 - 이벤트와답신함수연결 사건대기및실행 - 사건이발생하기를기다렸다가발생하면 - 사건에등록된함수를연결하여실행 glutinit 함수는 GLUT를초기화하는함수이고사용하려는윈도우의위치와크기를제어하기위해서는 glutinitwindowposition 함수와 glutinitwindowsize 함수를사용한다. 여기에서사용되는좌표계는윈도우좌표계로서모니터의상단좌측이 (0,0) 이되며오른쪽으로갈수록 x 값이증가하며, 아래로내려올수록 y 값이증가한다. 그림을그릴때사용되는 OpenGL 좌표계는좌측하단이 (0,0) 으로여겨지는데, 오른쪽으로갈수록 x 값이증가하며, 위로갈수록 y 값이증가한다. 즉, 윈도우좌표계와 OpenGL 좌표계는 y 축이반대임을명심하도록하자. GLUT 라이브러리가윈도우를생성할때어떤종류의디스플레이모드를사용할것인지를지정하는함수가 glutinitdisplaymode 이다. 함수안의인자는플래그로서싱글버퍼를사용할지아니면더블버퍼를사용할지를정하는플래그 (GLUT_SINGLE or GLUT_DOUBLE), 사용되는색상모드가 RGB인지 RGBA 인지를결정하는플래그 (GLUT_RGB or GLUT_RGBA), 3차원장면을표현할때보이지않는면을그리지않게할때사용되는깊이정보를저장하는 z- 버퍼를사용할지여부를알리는플래그 (GLUT_DEPTH) 들로구성된다. glutdisplayfunc(renderscene) 함수는이벤트가발생하였을때인자안에있는답신함수를실행하게하 는역할을하는함수의일종이다. 이함수는윈도우가처음화면에나타날때, 윈도우의크기를보벙 할때, 윈도우가다름윈도우에의해서가려졌다가다시나타날때 Display 이벤트를발생하여이함 수의인자인 RenderScene 이라는함수를실행하게된다. 이예제에서는빨간색의선분을그리게되는 셈이다. 이런 종류의 함수들은 이벤트를 발생할 수 있는 입력장치와 연관되는 경우도 있다. glutdisplayfunc, glutkeyboardfunc, glutmousefunc 그리고 glutreshapefunc, glutpostredisplay 등이추가로 알아두어야할중요한함수들이다. glutmainloop() 함수는그래픽스프로그램과일반프로그램과의차이를명확하게보여주는함수이다. 일반프로그램은내부프로그램을실행하고결과를얻은다음에는자동적으로종료하지만그래픽스프로그램은계속해서결과를보여주고사용자가직접종료명령을내리기전까지는종료되어서는안된다. 왜냐하면사용자의입력을계속받을준비가되어야하기때문이다. 이를가능하게하는것이이함수이다. 이함수는 GLUT 이벤트핸들링루프를시작한다. 이벤트루프에서모든키보드, 마우스, 다시그리기등과여러가지윈도우메시지를처리하게된다. 이함수는프로그램을종료할때까지는리턴하지않는다.
RenderScene 부분 void RenderScene (void) { glclear (GL_COLOR_BUFFER_BIT); // Clear display window. glcolor3f(1.0, 0.0, 0.0); // Set line segment color to red. glbegin (GL_LINES); glvertex2i (180, 15); // Specify line-segment geometry. glvertex2i (10, 145); glend(); glflush (); // Process all OpenGL routines as quickly as possible. } 이부분에서는프로그래머가그리고자하는물체들을만들어서그리는영역이다. main 부분에서는그리고자하는목적을위해전체적인환경을구성하는역할을한다면이부분은그래픽스프로그램의꽃인 scene 을형성하는곳으로나타내고자하는모든물체를자유롭게다루는곳이다. 그러므로 OpenGL 의대부분의함수들이이곳에서적용되는셈이다. 위예제를간단히설명하면, 현재그려져있는그림이저장되어있는 Color buffer를지우는작업을하는 glclear 함수를먼저실행하고빨간색을가지고 (180.15) 에서출발하여 (10.145) 에끝나는선분을그리는함수를수행하게되어있다. 그래픽스프로그램은내부적으로여러개의명령들을순차적으로처리하는렌더링파이프라인을사용한다. OpenGl 명령들은큐에저장되어있다가 OpenGL 드라이버가요청된여러개의작업을한꺼번에처리하게된다. 이러한구조를사용하면성능이향상되며복잡한물체를그릴때에는두드러진효과를얻을수있다. 그리는작업이가속되는원리는일정한드로잉명령들을한꺼번에하드웨어에액세스하기때문이다. glflush 함수는 OpenGL에게더이상드로잉명령들을받아들이지말고지금까지요청된명령들을처리하게하는임무를수행한다. 초기화부분 void init (void) { glclearcolor (1.0, 1.0, 1.0, 0.0) ; // Set display-window color to white. glmatrixmode (GL_PROJECTION); // Set projection parameters. gluortho2d (0.0, 200.0, 0.0, 150.0); } 이부분에서는 OpenGL 의상태들을초기화한다. window 의바탕색을어떤색으로할지, 카메라의위치, 카메라방향, 3차원물체를 2 차원화면으로투영하는방법, 관심영역을의미하는관측공간의정의, 마지막으로카메라로찍은사진을현상하고자할때현상되는영역을의미하는 Viewport의위치및크기를정하는과정을이곳에서처리한다.
2.3 OpenGL 설치 2.3.1 OpenGL Setup 과정 1 Microsoft visual studio 6.0 이상버전을설치한다. 이미설치되어있다면 C:\..\Microsoft Visual studio\vc98\include\gl 폴더에 gl.h, glaux.h, glu.h 파일들이있는지확인한다. 2 glut 라이브러리를 http://www.opengl.org/resources/libraries/glut/glut_downloads.html 에서 glut 라이브러리를다운로드한다. 3 Microsoft visual studio를실행하고다운로드한 GLUT-3.7폴더의경로를지정해준다. 2.3.2 GLUT 라이브로리다운로드과정 1 http://www.opengl.org/resources/libraries/glut/glut_downloads.html 를방문하여 Contents목록에나와있는 GLUT for Microsoft Windows 95 & NT users를클릭하고다음그림과같이3개의링크된 zip파일들을다운로드한다. glut37.zip, glut37data.zip, glutdlls37beta.zip 2 glut37.zip, glut37data.zip 압축해제하고 glut-3.7폴더를생성한다.( 예 D:\glut-3.7 경로로압축이풀렸다고가정 ) 3 glutdlls37beta.zip 압축해제하여다음을실행한다. *.lib D:\glut-3.7\lib\glut glut.h VC98\Include\GL glut.dll C:\WINNT\system32 glut32.dll C:\WINNT\system32
4 Microsoft visual studio 실행하고 GLUT-3.7폴더의경로를지정해야한다. 5 Microsoft visual studio의 메뉴바에서 Option 메뉴설정 Tools --> Options.. 를클릭 6 헤드파일경로설정 Option 탭메뉴에서 directories 선택 show directories for 에서 include files 선택 new버튼클릭 헤더파일의경로를찾기위해... 클릭
그림과같이헤더파일들이들어있는폴더를찾아클릭 7 라이브러리경로설정 Option 탭메뉴에서 directories 선택 Show directories for에서 Library files를선택,new 클릭 library 파일들의경로를찾기위해클릭
그림과같이 glut32.lib 가있는폴더를찾아클릭 ok 버튼클릭하면셋업과정완료 2.3.4 Visual C++ 에서의작업 1 예제프로그래밍 ( The display window and line segment 만들기 ) 예제프로그램을실행한결과 2 Project 만들기 [File] 메뉴의 new를클릭하여프로젝트생성마법사를실행 Project탭 win32 console Application을선택한다. Project name과프로젝트파일들이저장될폴더를지정한다.
An empty project 선택 Finish 클릭 3 새로운파일만들기 [File] 메뉴의 new를클릭 Files탭 C++ source File을선택한다. File name을지정한다. 4 프로그램작성하기 Text창에구현을한다.
5 예제코드
6 파일저장하기 7 컴파일하기 Ctrl + F7키를눌러컴파일 8 빌드하기 F7를눌러빌드
9 실행하기 Ctrl + F5를눌러실행