Graphics OpenGL 컴퓨터그래픽스연구실
OpenGL 관련참고사이트 OpenGL 공식사이트 http://www.opengl.org/ Khronos Group http://www.khronos.org/ Nehe Productions http://nehe.gamedev.net/
OpenGL 파일셋팅 압축을푼후다음경로로파일을복사 헤더파일 (glut.h) Microsoft Visual Studio\VC98\Include\GL (6.0) or Microsoft Visual Studio 8\VC\Include (8.0) 정적라이브러리파일 (glut32.lib & glut.def) Microsoft Visual Studio\VC98\Lib (6.0) or Microsoft Visual Studio 8\VC\Lib (8.0) 동적라이브러리파일 (glut32.dll) C:\WINDOWS\system32
프로젝트생성 [VS 6.0] (1/3) [File] [New] (Ctrl+N) [Win32 Console Application] 선택 Project Name 정한후 [OK] [An empty project] [Finish]
프로젝트생성 [VS 6.0] (2/3) [Project] [Settings ] (Alt+F7) Link 의 Object/library modules 에다음파일을추가 opengl32.lib glu32.lib glut32.lib glaux.lib
프로젝트생성 [VS 6.0] (3/3) [File] [New] (Ctrl+N) C++ Source File 선택 File 이름정한후 [OK] 완료
프로젝트생성 [VS 8.0] (1/3) [File] [New] [Project] (Ctrl+Shift+N) Visual C++ Win32 Win32 Console App 이름정한후 [OK] 빈프로젝트선택
프로젝트생성 [VS 8.0] (2/3) [Project] [ 속성 ] (Alt+F7) [ 구성속성 ] [ 링커 ] [ 입력 ] 추가종속성에다음파일을추가 opengl32.lib glu32.lib glut32.lib glaux.lib
프로젝트생성 [VS 8.0] (3/3) 소스파일선택후우클릭 새항목추가 코드 C++ 파일 (.cpp) 이름선택 추가 (A) 완료
Example 예제및실행결과
Viewing void glulookat GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble atx, GLdouble aty, GLdouble atz, GLdouble upx, GLdouble upy, GLdouble upz eyex, eyey, eyez : Camera, Position(x,y,z) atx, aty, atz : Camera Focus(x,y,z) upx, upy, upz : Camera Upvector(gradient) Default glutlookat(0.0, 0.0, 0.0, 0.0, 0.0, -100.0, 0.0, 1.0, 0.0);
Viewing void glulookat
View Volume void glortho GLdouble left, GLdouble right, GLdouble bottom, GLdouble top GLdouble znear, GLdouble zfar void glfrustum GLdouble left, GLdouble right, GLdouble bottom, GLdouble top GLdouble znear, GLdouble zfar void glperspective GLdouble fov, GLdouble aspect, GLdouble near, GLdouble fars fov : Field of View(degree : 0 ~ 180) aspect : Aspect Ratio(Width/Height) near : near clipping plane far : far clipping plane
View Volume void glfrustum
OpenGL 의그래픽기본요소 점 GL_POINTS 선 GL_LINES GL_LINE_STRIP GL_LINE_LOOP 도형 GL_POLYGON GL_TRIANGLES GL_TRIANGLE_STRIP GL_TRIANGLE_FAN GL_QUAD_STRIP
OpenGL 의그래픽기본요소 점 glbegin(gl_points); glvertex3f(v1x, v1y, v1z); glvertex3f(v2x, v2y, v2z); glvertex3f(v3x, v3y, v3z); glvertex3f(v4x, v4y, v4z); glend(); v1 v4 v2 v3
OpenGL 의그래픽기본요소 선 (GL_LINES) glbegin(gl_lines); glvertex3f(v1x, v1y, v1z); glvertex3f(v2x, v2y, v2z); glvertex3f(v3x, v3y, v3z); glvertex3f(v4x, v4y, v4z); glend(); v1 v4 v2 v3
OpenGL 의그래픽기본요소 선 (GL_LINE_STRIP) glbegin(gl_line_strip); glvertex3f(v1x, v1y, v1z); glvertex3f(v2x, v2y, v2z); glvertex3f(v3x, v3y, v3z); glvertex3f(v4x, v4y, v4z); glend(); v1 v4 v2 v3
OpenGL 의그래픽기본요소 도형 (GL_LINE_LOOP) glbegin(gl_line_loop); glvertex3f(v1x, v1y, v1z); glvertex3f(v2x, v2y, v2z); glvertex3f(v3x, v3y, v3z); glvertex3f(v4x, v4y, v4z); glend(); v1 v4 v2 v3
OpenGL 의그래픽기본요소 도형 (GL_TRIANGLES) glbegin(gl_triangles); glvertex3f(v1x, v1y, v1z); glvertex3f(v2x, v2y, v2z); glvertex3f(v3x, v3y, v3z); glend(); v1 v2 v3
OpenGL 의그래픽기본요소 도형 (GL_QUADS) glbegin(gl_quads); glvertex3f(v1x, v1y, v1z); glvertex3f(v2x, v2y, v2z); glvertex3f(v3x, v3y, v3z); glvertex3f(v4x, v4y, v4z); glend(); v1 v4 v2 v3
OpenGL 의그래픽기본요소 도형 (GL_POLYGON) glbegin(gl_polygon); glvertex3f(v1x, v1y, v1z); glvertex3f(v2x, v2y, v2z); glvertex3f(v3x, v3y, v3z); glvertex3f(v4x, v4y, v4z); glvertex3f(v5x, v5y, v5z); glvertex3f(v6x, v6y, v6z); glend(); v2 v1 v3 v6 v4 v5
OpenGL 의그래픽기본요소 도형 (GL_TRIANGLE_STRIP) glbegin(gl_triangle_strip); glvertex3f(v1x, v1y, v1z); glvertex3f(v2x, v2y, v2z); glvertex3f(v3x, v3y, v3z); glvertex3f(v4x, v4y, v4z); glvertex3f(v5x, v5y, v5z); glend(); v1 v2 v3 v4 v5
OpenGL 의그래픽기본요소 도형 (GL_TRIANGLE_FAN) glbegin(gl_triangle_fan); glvertex3f(v1x, v1y, v1z); glvertex3f(v2x, v2y, v2z); v5 v4 v3 glvertex3f(v3x, v3y, v3z); v2 glvertex3f(v4x, v4y, v4z); glvertex3f(v5x, v5y, v5z); v1 glend();
OpenGL 의그래픽기본요소 도형 (GL_QUAD_STRIP) glbegin(gl_quad_strip); glvertex3f(v1x, v1y, v1z); glvertex3f(v2x, v2y, v2z); v1 v3 v5 glvertex3f(v3x, v3y, v3z); glvertex3f(v4x, v4y, v4z); glvertex3f(v5x, v5y, v5z); v2 v4 v6 glvertex3f(v6x, v6y, v6z); glend();
그래픽함수관련 ( 속성설정 ) glpointsize(glfloat size) 점의크기 gllinewidth(glfloat width) 선의두께 glgetfloatv(gl_line_size_range) 드라이버가지원하는최대선의두께를반환
그래픽함수관련 ( 속성설정 ) glshademodel(mode) 다각형내부채움모드설정 mode GL_FLAT: 다각형의내부를모두동일한색으로 GL_SMOOTH: 정점의색을 Weighted Average 보간 기본값
Example
Example
Example
직교투영함수 Clipping glortho(gldouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); left : 클리핑공간좌측끝의좌표값 right : 클리핑공간우측끝의좌표값 bottom : 클리핑공간하단끝의좌표값 top : 클리핑공간상단끝의좌표값 near : 원점과관측자사이의최대거리 far : 원점과관측자의반대편사이의최대거리 ex) glmatrixmode(gl_projection); // 투영좌표계설정 glloadidentity(); // 초기화 glortho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
직교투영함수 glortho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); Projection glortho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); Projection
직교투영함수 glortho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); => projection glortho(-3.0, 3.0, -3.0, 3.0, -1.0, 1.0); => projection
Viewport 함수 윈도우의영역을설정한다. glviewport(glint x, GLint y, GLsizei width, GLsizei height); x: 좌하단x좌표 y: 좌하단y좌표 width : 너비 height : 높이 Ex) glutinitwindowsize(200, 200); glviewport(0, 0, 100, 100); (0, 200) (0, 100) (0, 0) (100, 0) (200, 0)
Example
GLUT 모델링 정 6 면체 void glutsolidcube(gldouble size); 물체겉면이칠해진형태 void glutwirecube(gldouble size); 물체뼈대만선으로표시 size : 정육면체모서리의길이
GLUT 모델링 원구 void glutsolidsphere(gldouble radius, GLint slices, GLint stacks); 물체겉면이칠해진형태 void glutwiresphere(gldouble radius, GLint slices, GLint stacks); 물체뼈대만선으로표시 radius : 원구의반지름 slices : 경선의수 ( 세로 ) stacks : 위선의수 ( 가로 )
GLUT 모델링 원환체 void glutsolidtorus(gldouble innerradius, GLdouble outerradius, GLint nsides, GLint rings); 물체겉면이칠해진형태 void glutwiretorus(gldouble innerradius, GLdouble outerradius, GLint nsides, GLint rings); 물체뼈대만선으로표시 innerradius : 원환체의안쪽반지름 outerradius : 원환체의바깥쪽반지름 nsides: 튜브단면을몇개의선분으로근사화 rings : 튜브윤곽을몇개의선분으로근사화
GLUT 모델링 원뿔 void glutsolidcone(gldouble base, GLdouble height, GLint slices, GLint stacks); 물체겉면이칠해진형태 void glutwirecone(gldouble base, GLdouble height, GLint slices, GLint stacks); 물체뼈대만선으로표시 base : 원뿔밑면의반지름 height : 원뿔높이 slices : z축둘레를몇개의선분으로근사화 stacks : z축을따라서몇개의면으로근사화
GLUT 모델링 정 4 면체 void glutsolidtetrahedron(); 물체겉면이칠해진형태 void glutwiretetrahedron(); 물체뼈대만선으로표시
GLUT 모델링 정 20 면체 void glutsolidcosahedron(); 물체겉면이칠해진형태 void glutwirecosahedron(); 물체뼈대만선으로표시
GLUT 모델링 주전자 void glutsolidteapot(gldouble size); 물체겉면이칠해진형태 void glutwireteapot(gldouble size); 물체뼈대만선으로표시 size : 주전자의상대적크기
Example
Reshape Callback 함수 void glutreshapefunc(void(*func)(int width, int height)); 윈도우의크기 / 모양이바뀔때 GLUT 가호출하는콜백함수를등록시키는함수 width : 윈도우의새로운너비 height : 윈도우의새로운높이 ex) Void myreshape(int NewWidth, int NewHeight) { } void main(int argc, char** argv) { glutreshapefunc(myreshape); // 함수등록 }
Keyboard Callback 함수 void glutkeyboardfunc(void(*func)(unsigned char key, int x, int y)); ASCII 코드의키보드입력이일어날때마다 GLUT 가호출하는콜백함수를등록시키는함수 key : 눌러진키 x: 마우스의 X좌표, y : 마우스의 Y좌표 ex) void mykeyboard(unsigned char key, int x, int y) { } void main(int argc, char** argv) { glutkeyboardfunc(mykeyboard); // 함수등록 }
Keyboard Callback 함수
Mouse Click Callback 함수 void glutmousefunc(void(*func)(int button, int state, int x, int y)); 마우스이벤트가발생할때마다 GLUT 가호출하는마우스클릭콜백함수를등록시키는함수 button : 버튼의종류 GLUT_LEFT_BUTTON, GLUT_RIGHT_BUTTON, GLUT_MIDDEL_BUTTON state : 해당버튼이눌러진상태인지아닌지 GLUT_DOWN, GLUT_UP x: 마우스 x좌표,y: 마우스 y좌표
Mouse Click Callback 함수 void glutmousefunc(void(*func)(int button, int state, int x, int y)); ex) void mymouseclick(glint button, GLint state, GLint x, GLint y) { if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { } } void main(int argc, char** argv) { glutmousefunc(mymouseclick); // 함수등록 }
Mouse Motion Callback 함수 void glutmotionfunc(void(*func)(int x, int y)); 마우스버튼을누른상태에서마우스를움직일때호출되는마우스움직임콜백함수를등록시키는함수 x: 마우스의 X좌표 y: 마우스의 Y좌표 ex) void mymousemotion(glint x, Glint y) { } void main(int argc, char** argv) { glutmotionfunc(mymousemotion); // 함수등록 }
Mouse 함수관련예제
Double Buffering 프레임버퍼 그래픽프로세스가프레임버퍼에영상을그리는역할을담당한다면비디오컨트롤러는그내용을읽어서화면에뿌림 비디오컨트롤러가프레임버퍼를읽는작업은매우빠른반면그래픽프로세서가프레임버퍼에쓰는작업은비디오컨트롤러가프레임버퍼를읽는속도에비해휠씬느림
Double Buffering 버퍼가하나일경우 그림 (a) 같이오른쪽에서왼쪽으로이동하는애니메이션을만들기위해서는화면에그림 (b) 를보여준후바로그림 (d) 를그려야함 만약프레임버퍼에기록하는속도가느리다면프레임버퍼에아직그림 (c) 의내용이기록되어있을수도있음 즉, 아직새로운내용이완전히기록되지않은중에비디오컨트롤러가프레임버퍼를읽어감으로써불완전한프레임내용이출력됨 (a) (b) (c) (d)
Double Buffering Front Buffer, Back Buffer 각각영상하나를온전히저장할수있는용량을가지고있음 Double Buffer 를사용하면아래그림과같이비디오컨트롤러가 Front Buffer 내용을읽고출력하는동안그래픽프로세서는 Back Buffer 에새로운내용을기록 만약비디오컨트롤러가쓰기를완전히마치면비디오컨트롤러는 Back Buffer 로스위칭하여새로기록된내용을읽어감 동시에그래픽프로세서는 Front Buffer 로스위칭하여다시새로운내용을기록
Double Buffering void glutinitdisplaymode(unsigned int mode) GLUT 윈도우의디스플레이모드를초기화한다. mode: 초기화와관련된상수값 void glutswapbuffers(void) 현재 GLUT 윈도우가 Double Buffering 모드로실행될때, 이함수는 OpenGL 파이프라인을모두실행시킨후버퍼스위칭 ex) // 마우스움직임콜백함수선언 void MyDisplay() { glutswapbuffers(); // 버퍼를교환한다. } int main(int argc, char** argv) { glutinitdisplaymode(glut_rgb GLUT_DOUBLE); // 더블버퍼를사용한다. }
Idle Callback Function void glutidlefunc(void (*func)(void)) 처리할이벤트가없을때 GLUT 가호출하는콜백함수를등록시키는함수 ex> // 아이들콜백함수선언 void MyIdle(){} int main(int argc, char** argv) { glutidlefunc (MyIdle); // 아이들콜백함수등록 }
Double Buffering Double Buffering 예제
Vertex Array GLuint glfrontface(glenum mode) 시계방향으로감긴것이앞면인지반시계방향으로감긴것이앞면인지를설정 기본값 : glfrontface(gl_ccw); - 반시계방향을앞면으로설정한다. mode GL_CCW: 반시계방향 GL_CW: 시계방향 glfrontface(gl_ccw); // 반시계방향을앞면으로 glfrontface(gl_cw); // 시계방향을앞면으로
Vertex Array GLuint glcullface(glenum mode) 폴리곤의앞면혹은뒷면을그리기에서제거할지를설정한다. mode GL_FRONT : 앞면을컬링하고뒷면을보여준다. GL_BACK : 뒷면을컬링하고앞면을보여준다. 디폴트 : glcullface(gl_back); - 뒷면을컬링하고앞면을보여준다. glfrontface(gl_ccw); glcullface(gl_front); // 앞면을컬링하고뒷면을보여준다. glfrontface(gl_ccw); glcullface(gl_back); // 뒷면을컬링하고앞면을보여준다.
Vertex Array void glenable/gldisable (GLenum feature) OpenGL 기능 ( 상태 ) 를 enable/disable 한다. feature GL_CULL_FACE : 폴리곤컬링기능 디폴트 : gldisable(gl_cull_face); - 컬링기능을사용하지않는다. glfrontface(gl_ccw); glcullface(gl_back); glenable(gl_cull_face); // 킬링사용 // 앞면만그려짐 glfrontface(gl_ccw); glcullface(gl_back); gldisable(gl_cull_face); // 컬링사용안함 // 앞, 뒷면다그려짐
Geometry Transformation void glmatrixmode(glenum mode) 현재행렬을설정 mode GL_MODELVIEW : 행렬연산이모델관측스택에적용된다. 장면상에서물체를이동할때사용한다. GL_PROJECTION : 행렬연산이투영행렬스택에적용된다. 클리핑공간을정의할때사용한다. GL_TEXTURE : 행렬연산이텍스쳐행렬스택에적용된다. 텍스쳐좌표를조작한다. void glloadidentity() 현재변환행렬을주어진단위행렬로바꾼다. ex> glmatrixmode(gl_modelview); glloadidentity();
Geometry Transformation void glloadmatrixf(const GLfloat *M) 현재행렬을주어진행렬로설정한다. void glmultmatrixf(const GLfloat *M) 현재행렬을주어진행렬과곱한다. *M : 이배열은현재변환행렬로설정될 4X4 행렬을나타낸다. 이배열은 16 개의연속된값을가지며, 열우선순위로저장되어있다. ex> glmatrixmode(gl_modelview); float m[] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }; glloadmatrixf(m); glmultimatrixf(m);
Geometry Transformation void gltranslatef(glfloat dx, GLfloat dy, GLfloat dz) 현재행렬을이동변환행렬과곱한다. dx, dy, dz :x,y,z 축좌표값 void glscalef(glfloat sx, GLfloat sy, GLfloat sz) 현재행렬과크기변환행렬을곱한다. sx, sy, sz :x,y,z 축에대한크기변환인수 void glrotatef(glfloat angle, GLfloat x, GLfloat y, GLfloat z) 현재행렬과회전변환행렬을곱한다. angle : 회전각을도 (degree) 단위로나타낸다. x, y, z : 회전축이되는방향벡터의 x, y, z 성분
Geometry Transformation 기하변환예제
Geometry Transformation void glpushmatrix() 현재행렬을행렬스택에 push 한다. void glpopmatrix() 현재행렬을행렬스택에서 pop 한다. glpushmatrix(); //Push GotoBodyCoordinates(); Draw_Body(); glpushmatrix(); //Push GotoRightShoulderCoordinates(); Draw_RightUpperArm(); glpushmatrix(); //Push GotoRightElbowCoordinates(); Draw_RightLowerArm (); glpopmatrix(); //Pop glpopmatrix(); //Pop glpushmatrix(); //Push GotoRightCoxaCoordinates(); Draw_RightUpperLeg(); glpushmatrix(); //Push GotoRightKneeCoordinates(); Draw_RightLowerLeg(); glpopmatrix(); //Pop glpopmatrix(); //Pop glpopmatrix(); //Pop
Geometry Transformation Push/Pop 행렬예제
Lighting void gllightfv (GLenum light, GLenum pname, const GLFloat* params) 사용가능한 8 개의광원중하나를광원인자로지정하여광원의여러가지특성을설정한다. light 어느광원을설정할지를지정한다. (GL_LIGHT0 ~ GL_LIGHT7) pname 이함수를호출할때사용할조명인자를지정한다. params 설정될값들의배열 ex> float ambientlight[] = {1.0f, 1.0f, 1.0f, 1.0f}; // 밝은흰색주변광 gllightfv(light0, GL_AMBIENT, ambientlight); // 주변광을지정
Lighting gllightfv 의 pname 인자에넣을수있는값 파라미터명 기본값 의미 GL_POSITION (0.0, 0.0, 1.0, 0.0) 광원위치를지정하는좌표 (x, y, z, w) GL_SPOT_DIRECTION (0.0, 0.0, -1.0) 스포트라이트의방향을지정하는벡터 (x, y, z) GL_SPOT_CUTOFF 180.0 스포트라이트절단각도 GL_SPOT_EXPONENT 0.0 스포트라이트지수 GL_AMBIENT (0.0, 0.0, 0.0, 0.0) 주변광의세기 GL_DIFFUSE (1.0, 1.0, 1.0, 1.0) 확산광의세기 GL_SPECULAR (1.0, 1.0, 1.0, 1.0) 반사광의세기 GL_CONSTANT_ATTENUNATION 1.0 불변감쇠값 GL_LINEAR_ATTENUATION 0.0 선형감쇠값 GL_QUADRATIC_ATTENUNATION 0.0 2차감쇠값
Lighting 광원의배치 GL_POSITION (x,y,z,w) 에서 w=0 이아니면 (x/w, y/w, z/w) 에위치한위치성광원을,w= 0 이면좌표 (x,y,z) 로빛이들어오는방향을가지는방향성광원이된다. 방향성광원 ex> GLfloat LightPosition[] = {0.0, 1.0, 0.0, 0.0}; gllightfv(gl_light0, GL_POSITION, LightPosition); GLfloat LightPosition[] = {-1.0, 1.0, 0.0, 0.0}; gllightfv(gl_light0, GL_POSITION, LightPosition);
Lighting 스포트라이트 스포트라이트를설정할때에는위치성광원을설정한후스포트라이트에국한된몇가지속성들을설정해야한다. 스포트라이트절단각 (GL_SPOT_CUTOFF) 스포트라이트방향 (GL_SPOT_DIRECTION) 스포트라이트초점 (GL_SPOT_EXPONENT) 초점은스포트라이트가원뿔의축에어느정도집중되는지를결정원뿔의축으로부터멀어질수록빛은점차감쇠되며, 원뿔의가장자리에이르면빛이사라짐
Lighting 재질설정 void glmaterialfv(glenum face, GLenum pname, GLfloat *param) 조명계산에쓰일현재재질속성을정의한다. face : 객체의다각형들에재질이적용되는방식지정 GL_FRONT, GL_BACK, GL_FRONT_AND_BACK pname : 설정하고자하는속성 param : 속성에설정할값 pname 인자에사용하는상수들 상수 GL_AMBIENT GL_DIFFUSE GL_AMBIENT_AND_DIFFUSE GL_SPECULAR GL_SHININESS GL_EMISSION 의미재질의주변광색재질의분산광색재질의주변광과분산광색재질의반사광색반사율재질의방사광색
Lighting 조명모델들 void gllightmodeli(glenum pname, GLint param) void gllightmodelfv(glenum pname, Glfloat* param) 조명모델설정함수 pname : 조명모델인자를지정한다. param : 주변광의세기 pname 인자에사용하는상수들 상수 의미 GL_LIGHT_MODEL_AMBIENT 장면의주변광세기 (RGBA) : 기본값은 (0.2, 0.2, 0.2, 1.0) GL_LIGHT_MODEL_LOCAL_VIWER 시점의국소또는무한여부 : 기본값은 GL_FALSE( 무한 ) GL_LIGHT_MODEL_TWO_SIDE 단면또는양면조명 : 기본값은 GL_FALSE ( 단면 )
Lighting pname 인자 GL_LIGHT_MODEL_AMBIENT 특정한방향없이장면전체에고르게비춰지는주변광을적용 전역주변광 (Global Ambient Light) GL_LIGHT_MODEL_LOCAL_VIEWER 반사광의경우시점의위치에따라하이라이트의세기가좌우됨 OpenGL 에서는시점의위치를정의된곳에그대로위치시키기도하지만시선반대방향에따라서무한대로보내기도함 GL_TRUE로설정되면시점위치가물체에매우가까운것으로간주하여모든다각형마다별도의시점벡터가계산되고이렇게하면정확한반사광이계산되어사실적인결과를얻을수있으나계산시간이오래걸림 GL_FALSE로설정되면시점이시점벡터방향으로무한대거리에있는것으로간주하고모든폴리곤에대해동일한시점벡터를사용하므로계산시간을줄일수있음 GL_LIGHT_MODEL_TWO_SIDE 조명이다각형의뒷면에도적용될것인지를결정
Geometry Transformation Lighting 예제