Open GL

Size: px
Start display at page:

Download "Open GL"

Transcription

1 Graphics OpenGL 컴퓨터그래픽스연구실

2 GLUT 모델링 정 6 면체 void glutsolidcube(gldouble size); 물체겉면이칠해진형태 void glutwirecube(gldouble size); 물체뼈대만선으로표시 size : 정육면체모서리의길이

3 GLUT 모델링 원구 void glutsolidsphere(gldouble radius, GLint slices, GLint stacks); 물체겉면이칠해진형태 void glutwiresphere(gldouble radius, GLint slices, GLint stacks); 물체뼈대만선으로표시 radius : 원구의반지름 slices : 경선의수 ( 세로 ) stacks : 위선의수 ( 가로 )

4 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 : 튜브윤곽을몇개의선분으로근사화

5 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축을따라서몇개의면으로근사화

6 GLUT 모델링 정 4 면체 void glutsolidtetrahedron(); 물체겉면이칠해진형태 void glutwiretetrahedron(); 물체뼈대만선으로표시

7 GLUT 모델링 정 20 면체 void glutsolidicosahedron(); 물체겉면이칠해진형태 void glutwirecosahedron(); 물체뼈대만선으로표시

8 GLUT 모델링 주전자 void glutsolidteapot(gldouble size); 물체겉면이칠해진형태 void glutwireteapot(gldouble size); 물체뼈대만선으로표시 size : 주전자의상대적크기

9 Example

10 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); // 함수등록 }

11 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); // 함수등록 }

12 Keyboard Callback 함수

13 Mouse Click Callback 함수 void glutmousefunc(void(*func)(int button, int state, int x, int y)); 마우스이벤트가발생할때마다 GLUT 가호출하는마우스클릭콜백함수를등록시키는함수 button : 버튼의종류 GLUT_LEFT_BUTTON, GLUT_RIGHT_BUTTON, GLUT_MIDDLE_BUTTON state : 해당버튼이눌러진상태인지아닌지 GLUT_DOWN, GLUT_UP x: 마우스 x좌표,y: 마우스 y좌표

14 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); // 함수등록 }

15 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); // 함수등록 }

16 Mouse 함수관련예제

17 Double Buffering 프레임버퍼 그래픽프로세스가프레임버퍼에영상을그리는역할을담당한다면비디오컨트롤러는그내용을읽어서화면에뿌림 비디오컨트롤러가프레임버퍼를읽는작업은매우빠른반면그래픽프로세서가프레임버퍼에쓰는작업은비디오컨트롤러가프레임버퍼를읽는속도에비해휠씬느림

18 Double Buffering 버퍼가하나일경우 그림 (a) 같이오른쪽에서왼쪽으로이동하는애니메이션을만들기위해서는화면에그림 (b) 를보여준후바로그림 (d) 를그려야함 만약프레임버퍼에기록하는속도가느리다면프레임버퍼에아직그림 (c) 의내용이기록되어있을수도있음 즉, 아직새로운내용이완전히기록되지않은중에비디오컨트롤러가프레임버퍼를읽어감으로써불완전한프레임내용이출력됨 (a) (b) (c) (d)

19 Double Buffering Front Buffer, Back Buffer 각각영상하나를온전히저장할수있는용량을가지고있음 Double Buffer 를사용하면아래그림과같이비디오컨트롤러가 Front Buffer 내용을읽고출력하는동안그래픽프로세서는 Back Buffer 에새로운내용을기록 만약비디오컨트롤러가쓰기를완전히마치면비디오컨트롤러는 Back Buffer 로스위칭하여새로기록된내용을읽어감 동시에그래픽프로세서는 Front Buffer 로스위칭하여다시새로운내용을기록

20 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); // 더블버퍼를사용한다. }

21 Idle Callback Function void glutidlefunc(void (*func)(void)) 처리할이벤트가없을때 GLUT 가호출하는콜백함수를등록시키는함수 ex> // 아이들콜백함수선언 void MyIdle(){} int main(int argc, char** argv) { glutidlefunc (MyIdle); // 아이들콜백함수등록 }

22 Double Buffering Double Buffering 예제

23 Vertex Array GLuint glfrontface(glenum mode) 시계방향으로감긴것이앞면인지반시계방향으로감긴것이앞면인지를설정 기본값 : glfrontface(gl_ccw); - 반시계방향을앞면으로설정한다. mode GL_CCW: 반시계방향 GL_CW: 시계방향 glfrontface(gl_ccw); // 반시계방향을앞면으로 glfrontface(gl_cw); // 시계방향을앞면으로

24 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); // 뒷면을컬링하고앞면을보여준다.

25 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); // 컬링사용안함 // 앞, 뒷면다그려짐

26 Geometry Transformation void glmatrixmode(glenum mode) 현재행렬을설정 mode GL_MODELVIEW : 행렬연산이모델관측스택에적용된다. 장면상에서물체를이동할때사용한다. GL_PROJECTION : 행렬연산이투영행렬스택에적용된다. 클리핑공간을정의할때사용한다. GL_TEXTURE : 행렬연산이텍스쳐행렬스택에적용된다. 텍스쳐좌표를조작한다. void glloadidentity() 현재변환행렬을주어진단위행렬로바꾼다. ex> glmatrixmode(gl_modelview); glloadidentity();

27 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);

28 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 성분

29 Geometry Transformation 기하변환예제

30 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

31 Geometry Transformation Push/Pop 행렬예제

32 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); // 주변광을지정

33 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 스포트라이트절단각도 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차감쇠값

34 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);

35 Lighting 스포트라이트 스포트라이트를설정할때에는위치성광원을설정한후스포트라이트에국한된몇가지속성들을설정해야한다. 스포트라이트절단각 (GL_SPOT_CUTOFF) 스포트라이트방향 (GL_SPOT_DIRECTION) 스포트라이트초점 (GL_SPOT_EXPONENT) 초점은스포트라이트가원뿔의축에어느정도집중되는지를결정원뿔의축으로부터멀어질수록빛은점차감쇠되며, 원뿔의가장자리에이르면빛이사라짐

36 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 의미재질의주변광색재질의분산광색재질의주변광과분산광색재질의반사광색반사율재질의방사광색

37 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 ( 단면 )

38 Lighting pname 인자 GL_LIGHT_MODEL_AMBIENT 특정한방향없이장면전체에고르게비춰지는주변광을적용 전역주변광 (Global Ambient Light) GL_LIGHT_MODEL_LOCAL_VIEWER 반사광의경우시점의위치에따라하이라이트의세기가좌우됨 OpenGL 에서는시점의위치를정의된곳에그대로위치시키기도하지만시선반대방향에따라서무한대로보내기도함 GL_TRUE로설정되면시점위치가물체에매우가까운것으로간주하여모든다각형마다별도의시점벡터가계산되고이렇게하면정확한반사광이계산되어사실적인결과를얻을수있으나계산시간이오래걸림 GL_FALSE로설정되면시점이시점벡터방향으로무한대거리에있는것으로간주하고모든폴리곤에대해동일한시점벡터를사용하므로계산시간을줄일수있음 GL_LIGHT_MODEL_TWO_SIDE 조명이다각형의뒷면에도적용될것인지를결정

39 Lighting 예제