Open GL

Similar documents
Open GL

Microsoft PowerPoint - lecture16-ch6

Microsoft PowerPoint - lecture15-ch6.ppt

Microsoft PowerPoint - lecture11-ch4

PowerPoint 프레젠테이션

Microsoft PowerPoint - 13prac.pptx

Microsoft PowerPoint - lecture11-ch4.ppt

Łø·ŸÕ=¤ ¬ ÇX±xÒ¸ 06 - Èpº– 1

Open GL

Microsoft Word - cg07-midterm.doc

단국대학교멀티미디어공학그래픽스프로그래밍중간고사 (2011 년봄학기 ) 2011 년 4 월 26 일학과학번이름 중간고사 담당교수 : 단국대학교멀티미디어공학전공박경신 l 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤

(Microsoft PowerPoint - ADEFNJKEPXSQ.ppt [\310\243\310\257 \270\360\265\345])

(Microsoft PowerPoint - JXQEUPXIEBNZ.ppt [\310\243\310\257 \270\360\265\345])

Microsoft Word - cg09-midterm.doc

Microsoft PowerPoint - [2009] 02.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - 05geometry.ppt

Microsoft PowerPoint - lecture5-ch3.ppt [호환 모드]

Microsoft Word - cg08-final-answer.doc

Microsoft PowerPoint - lecture3-ch2.ppt

서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 (1/8) [CSE4170: 기초 컴퓨터 그래픽스] 중간고사 (담당교수: 임 인 성) 답은 연습지가 아니라 답안지에 기술할 것. 있는 변환 행렬은 일반적으로 어떤 좌표계 에서 어떤 좌표계로의

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - ch07 - 포인터 pm0415

UI TASK & KEY EVENT

chapter2.hwp

Microsoft PowerPoint - lecture18-ch8

Microsoft PowerPoint - lecture5-ch3 [호환 모드]

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Microsoft PowerPoint - lecture5-ch3

Microsoft PowerPoint - lecture4-ch2.ppt

서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 (1/7) [CSE4170: 기초 컴퓨터 그래픽스] 중간고사 (담당교수: 임 인 성) 답은 연습지가 아니라 답안지에 기술할 것. 답 안지 공간이 부족할 경우, 답안지 뒷면에 기술 하고, 해당

Microsoft PowerPoint - lecture17-ch8.ppt

Microsoft PowerPoint - lecture2-opengl.ppt [호환 모드]

슬라이드 1

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft Word - cg12-midterm-answer

PowerPoint 프레젠테이션

벡터(0.6)-----.hwp

Microsoft PowerPoint - additional01.ppt [호환 모드]

PowerPoint Presentation

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (2/8) 다음과같이설정되어있는데, cam.pos[0] = 0.0, cam.pos[1] = 0.0, cam.pos[2] = 500.0; 이때의 cam.naxis[] 벡터의세원소값을기술하라. Figure

(Microsoft PowerPoint - \301\24608\260\255 - \261\244\277\370\260\372 \300\347\301\372)

슬라이드 1

Microsoft PowerPoint - chap06-2pointer.ppt

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

슬라이드 1

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

슬라이드 1

Javascript

Microsoft PowerPoint - lecture2-opengl.ppt

Vector Differential: 벡터 미분 Yonghee Lee October 17, 벡터미분의 표기 스칼라미분 벡터미분(Vector diffrential) 또는 행렬미분(Matrix differential)은 벡터와 행렬의 미분식에 대 한 표

쉽게 풀어쓴 C 프로그래밍

OpenGL 프로그래밍 가이드 : OpenGL 1.2 공식 학습 가이드 제3판

컴퓨터그래픽스 소프트웨어

Why 3D Max?

슬라이드 1

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

0503중간고사.dvi

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

Microsoft Word - cg09-midterm-answer.doc

문제지 제시문 2 보이지 않는 영역에 대한 정보를 얻기 위하여 관측된 다른 정보를 분석하여 역으로 미 관측 영역 에 대한 정보를 얻을 수 있다. 가령 주어진 영역에 장애물이 있는 경우 한 끝 점에서 출발하여 다른 끝 점에 도달하는 최단 경로의 개수를 분석하여 장애물의

PowerPoint Presentation

11장 포인터

chap 5: Trees

API 매뉴얼

歯Lecture2.PDF

Microsoft Word - cg09-final-answer.doc

슬라이드 1

Structure and Interpretation of Computer Programs: Assignment 3 Seung-Hoon Na October 4, George (아래 3개의 문제에 대한 구현이 모두 포함된 george.rkt파일을 제출하시오.

01

adfasdfasfdasfasfadf

슬라이드 1

(Microsoft PowerPoint - FZBDPQDCSHAN.ppt [\310\243\310\257 \270\360\265\345])

(Microsoft PowerPoint - 11\300\345.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - chap11-포인터의활용.pptx

슬라이드 1

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - chap10-함수의활용.pptx

7. 인실수 에대하여 log 의지표를 이라할때, 옳 은것을보기에서모두고르면? ( 단, 는 를넘지않는최대의정수이다.) 7 ) ㄱ. log ㄴ. log 의지표는 이다. ㄷ. log log 이면 은 자리의정수 이다. 10. 다음은어느인터넷사이트의지도상단에있는버튼의기능을설명한

Microsoft PowerPoint - lecture12-ch5.ppt [호환 모드]

Microsoft PowerPoint - chap12-고급기능.pptx

슬라이드 1

Microsoft PowerPoint - lecture3-ch2.ppt [호환 모드]

<B1E2BCFAB9AEBCAD5FB9DABAB4B1D45F F F64746F72732E687770>

Microsoft PowerPoint - Chapter_04.pptx

Microsoft Word - cg07-final.doc

Microsoft PowerPoint - ch02-1.ppt

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

C 프로그래밊 개요

Chap 6: Graphs

Microsoft PowerPoint - 알고리즘_5주차_1차시.pptx

제8장 자바 GUI 프로그래밍 II

Visual Basic 반복문

Transcription:

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

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 glutsolidicosahedron(); 물체겉면이칠해진형태 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_MIDDLE_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 조명이다각형의뒷면에도적용될것인지를결정

Lighting 예제