Chapter 5 Lighting glut Init Display ModeGLUTDEPTH gl

  • Slides: 93
Download presentation
Chapter 5. 라이팅(Lighting)

Chapter 5. 라이팅(Lighting)

은면제거 예제 glut. Init. Display. Mode(GLUT_DEPTH | …); gl. Enable(GL_DEPTH_TEST); … while (1) {

은면제거 예제 glut. Init. Display. Mode(GLUT_DEPTH | …); gl. Enable(GL_DEPTH_TEST); … while (1) { gl. Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); get_viewing_point_from_mouse_position(); draw_3 d_object_A(); draw_3 d_object_B(); } 2009 -2학기

빛이 비춰진 구 그리기: light. c #include <GL/glut. h> #include <stdlib. h> void init(void)

빛이 비춰진 구 그리기: light. c #include <GL/glut. h> #include <stdlib. h> void init(void) { GLfloat mat_specular[] = { 1. 0, 1. 0 }; GLfloat mat_shininess[] = { 50. 0 }; GLfloat light_position[] = { 1. 0, 0. 0 }; gl. Clear. Color (0. 0, 0. 0); gl. Shade. Model (GL_SMOOTH); gl. Materialfv(GL_FRONT, GL_SPECULAR, mat_specular); // 추가하기 gl. Materialfv(GL_FRONT, GL_SHININESS, mat_shininess); // 추가하기 gl. Lightfv(GL_LIGHT 0, GL_POSITION, light_position); // 추가하기 2009 -2학기

gl. Enable(GL_LIGHTING); gl. Enable(GL_LIGHT 0); gl. Enable(GL_DEPTH_TEST); } void display(void) { gl. Clear (GL_COLOR_BUFFER_BIT

gl. Enable(GL_LIGHTING); gl. Enable(GL_LIGHT 0); gl. Enable(GL_DEPTH_TEST); } void display(void) { gl. Clear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glut. Solid. Sphere (1. 0, 20, 16); gl. Flush (); } 2009 -2학기

void reshape (int w, int h) { gl. Viewport (0, 0, (GLsizei) w, (GLsizei)

void reshape (int w, int h) { gl. Viewport (0, 0, (GLsizei) w, (GLsizei) h); gl. Matrix. Mode (GL_PROJECTION); gl. Load. Identity(); if (w <= h) gl. Ortho (-1. 5, -1. 5*(GLfloat)h/(GLfloat)w, -10. 0, 10. 0); else gl. Ortho (-1. 5*(GLfloat)w/(GLfloat)h, -1. 5, -10. 0, 10. 0); gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); } 2009 -2학기

void keyboard(unsigned char key, int x, int y) { switch (key) { case 27:

void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } 2009 -2학기

int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE

int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glut. Init. Window. Size (500, 500); glut. Init. Window. Position (100, 100); glut. Create. Window (argv[0]); init (); glut. Display. Func(display); glut. Reshape. Func(reshape); glut. Keyboard. Func(keyboard); glut. Main. Loop(); return 0; } 2009 -2학기

조명의 속성 gl. Light*() 의 pname 매개변수에 대한 기본 값 매개변수 이름 기본값 설명

조명의 속성 gl. Light*() 의 pname 매개변수에 대한 기본 값 매개변수 이름 기본값 설명 GL_AMBIENT (0. 0, 1. 0) Ambient 라이트의 세기 GL_DIFFUSE (1. 0, 1. 0), (0. 0, 1. 0) Diffuse 라이트의 세기 GL_SPECULAR (1. 0, 1. 0), (0. 0, 1. 0) Specular 라이트의 세 기 GL_POSITION (0. 0, 1. 0, 0. 0) 조명의(x, y, z, w) 위치 GL_SPOT_DIRECTION (0. 0, -1. 0) 조명의(x, y, z) 방향 GL_SPOT_EXPONENT 0. 0 스포트라이트 지수 GL_SPOT_CUTOFF 180. 0 스포트라이트 절단각 GL_CONSTANT_ATTENUATION 1. 0 감쇠율 상수 GL_LINEAR_ATTENUATION 0. 0 선형 감쇠율 GL_QUADRATIC_ATTENUATION 0. 0 2009 -2학기 2차 감쇠율

그림 5 -2 GL_SPOT_CUTOFF 매개변수 GL_SPOT_CUTOFF 2009 -2학기

그림 5 -2 GL_SPOT_CUTOFF 매개변수 GL_SPOT_CUTOFF 2009 -2학기

gl. Lightfv(GL_LIGHT 1, gl. Lightfv(GL_LIGHT 1, GL_AMBIENT, Light 1_ambient); GL_DIFFUSE, Light 1_diffuse); GL_SPECULAR, Light

gl. Lightfv(GL_LIGHT 1, gl. Lightfv(GL_LIGHT 1, GL_AMBIENT, Light 1_ambient); GL_DIFFUSE, Light 1_diffuse); GL_SPECULAR, Light 1_specular); GL_POSITION, Light 1_position); GL_CONSTANT_ATTENUATION, 1. 5); GL_LINEAR_ATTENUATION, 0. 5); GL_QUADRATIC_ATTENUATION, 0. 2); gl. Lightfv(GL_LIGHT 1, GL_SPOT_CUTOFF, 45. 0); gl. Lightfv(GL_LIGHT 1, GL_SPOT_DIRECTION, spot_direction); gl. Lightfv(GL_LIGHT 1, GL_SPOT_EXPONENT, 2. 0); gl. Enable(GL_LIGHT 1); 2009 -2학기

조명 이동하기 조명의 위치에 대해 회전 변환이나 이동 변환을 적용, 오브젝트를 중심으로 움직이기 위해서는

조명 이동하기 조명의 위치에 대해 회전 변환이나 이동 변환을 적용, 오브젝트를 중심으로 움직이기 위해서는 l 모델변환 수행 후, 조명의 위치 지정하는 방법 사용 예제 5 -5 독립적으로 이동하는 광원 static GLdouble spin; void display(void){ GLfloat light_position[] = { 0. 0, 1. 5, 1. 0}; gl. Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gl. Push. Matrix(); glu. Look. At(0. 0, 5. 0, 0. 0, 1. 0, 0. 0); gl. Push. Marix(); gl. Rotated(spin, 1. 0, 0. 0); gl. Lightfv(GL_LIGHT 0, GL_POSITION, light_position); gl. Pop. Matrix(); glut. Solid. Torus(0. 275, 0. 85, 8, 15); gl. Pop. Matrix(); gl. Flush() 2009 -2학기 }

모델링 변환으로 조명 움직이기 [예제 5 – 6] #include <GL/glut. h> #include <stdlib. h>

모델링 변환으로 조명 움직이기 [예제 5 – 6] #include <GL/glut. h> #include <stdlib. h> static int spin = 0; /* 모델변환을 호출한 뒤 조명의 위치 리셋, 조명을 워드 좌표계상의 *새로운 위치에 놓는다 육면체는 조명의 위치 */ void init(void) { gl. Clear. Color (0. 0, 0. 0); gl. Shade. Model (GL_SMOOTH); gl. Enable(GL_LIGHTING); gl. Enable(GL_LIGHT 0); gl. Enable(GL_DEPTH_TEST); } 2009 -2학기

void display(void) { GLfloat position[] = { 0. 0, 1. 5, 1. 0 };

void display(void) { GLfloat position[] = { 0. 0, 1. 5, 1. 0 }; gl. Clear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gl. Push. Matrix (); glu. Look. At (0. 0, 5. 0, 0. 0, 1. 0, 0. 0); gl. Push. Matrix (); gl. Rotated ((GLdouble) spin, 1. 0, 0. 0); gl. Lightfv (GL_LIGHT 0, GL_POSITION, position); 2009 -2학기

gl. Translated (0. 0, 1. 5); gl. Disable (GL_LIGHTING); gl. Color 3 f (0.

gl. Translated (0. 0, 1. 5); gl. Disable (GL_LIGHTING); gl. Color 3 f (0. 0, 1. 0); glut. Wire. Cube (0. 1); gl. Enable (GL_LIGHTING); gl. Pop. Matrix (); glut. Solid. Torus (0. 275, 0. 85, 8, 15); gl. Pop. Matrix (); gl. Flush (); } 2009 -2학기

void reshape (int w, int h) { gl. Viewport (0, 0, (GLsizei) w, (GLsizei)

void reshape (int w, int h) { gl. Viewport (0, 0, (GLsizei) w, (GLsizei) h); gl. Matrix. Mode (GL_PROJECTION); gl. Load. Identity(); glu. Perspective(40. 0, (GLfloat) w/(GLfloat) h, 1. 0, 20. 0); gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); } void mouse(int button, int state, int x, int y){ switch (button) { case GLUT_LEFT_BUTTON: 2009 -2학기

if (state == GLUT_DOWN) { spin = (spin + 30) % 360; glut. Post.

if (state == GLUT_DOWN) { spin = (spin + 30) % 360; glut. Post. Redisplay(); } break; default: break; } } void keyboard(unsigned char key, int x, int y){ switch (key) { case 27: exit(0); break; } } 2009 -2학기

void keyboard(unsigned char key, int x, int y) { switch (key) { case 27:

void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } 2009 -2학기

int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE

int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glut. Init. Window. Size (500, 500); glut. Init. Window. Position (100, 100); glut. Create. Window (argv[0]); init (); glut. Display. Func(display); glut. Reshape. Func(reshape); glut. Mouse. Func(mouse); glut. Keyboard. Func(keyboard); glut. Main. Loop(); return 0; } 2009 -2학기

2009 -2학기

2009 -2학기

2009 -2학기

2009 -2학기

시점에 따라 광원 움직이기 l l 시점에 위치를 그러면 여기서 따라 조명을 움직이게 하려면

시점에 따라 광원 움직이기 l l 시점에 위치를 그러면 여기서 따라 조명을 움직이게 하려면 뷰잉 변환 이전에 조명의 지정해야 함 뷰잉 변환을 빛과 시점에 동시에 적용 조명이 눈 좌표계에 저장된다. 예제 5 -7 시점에 따라 이동하는 광원 GLfloat light_position[] = {0. 0, 1. 0}; gl. Viewport(0, 0, (GLint) w, (GLint) h); gl. Matrix. Mode(GL_PROJECTION); gl. Load. Identity(); glu. Perspective(40. 0, (GLfloat) w / (GLfloat) h, 1. 0, 100. 0); gl. Matrix. Mode (GL_MODELVIEW); gl. Load. Identity(); gl. Lightfv(GL_LIGHT 0, GL_POSITION, light_position); 2009 -2학기

static GLdouble ex, ey, ez, upx, upy, upz; void display (void) { gl. Clear(GL_COLOR_BUFFER_BIT

static GLdouble ex, ey, ez, upx, upy, upz; void display (void) { gl. Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gl. Push. Matrix(); glu. Look. At(ex, ey, ez, 0. 0, upx, upy, upz); glut. Solid. Torus(0. 275, 0. 85, 8, 15); gl. Pop. Matrix(); gl. Flush(); } 2009 -2학기

gl. Light. Model*()의 pname 매개변수 값 매개변수 이름 기본값 설명 GL_LIGHT_MODEL_ AMBIENT (0. 2,

gl. Light. Model*()의 pname 매개변수 값 매개변수 이름 기본값 설명 GL_LIGHT_MODEL_ AMBIENT (0. 2, 1. 0) 전체 장면의 ambient RGBA 세기 GL_LIGHT_MODDEL_ LOCAL_VIEWER 0. 0 또는 GL_FALSE Specular 반사 각도를 계 산하는 방법 GL_LIGHT_MODEL_ TWO_SIDE 0. 0 또는 GL_FALSE 단면 라이팅과 양면 라이 팅 중에서 하나 선택 GL_LIGHT_MOD DEL_COLOR_CONTROL GL_SINGLE_COLOR Specular 컬러를 ambient 및 diffuse 컬러와 별도로 계산할지 여부 2009 -2학기

전역적 ambient 라이트 l 각각의 광원으로 부터 장면에 ambient 라이트를 형성할 수 있다. l

전역적 ambient 라이트 l 각각의 광원으로 부터 장면에 ambient 라이트를 형성할 수 있다. l 전역적 ambient 라이트에 대한 RGBA 세기를 지정하려면 GL_LIGHT_MODEL_AMBIENT 매개변수를 사용 l l glfloat lmodel_ambient[] = { 0. 2, 1. 0 }; gl. Light. Modelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); 2009 -2학기

pname 매개변수에 대한 기본값 매개변수 이름(pname) 기본값 설명 GL_AMBIENT (0. 2, 1. 0) 재질의

pname 매개변수에 대한 기본값 매개변수 이름(pname) 기본값 설명 GL_AMBIENT (0. 2, 1. 0) 재질의 ambient 컬러 GL_DIFFUSE (0. 8, 1. 0) 재질의 diffuse 컬러 GLAMBIENT_AND_DIFFU SE 재질의 ambient & diffuse 컬러 GL_SPECULAR (0. 0, 1. 0) 재질의 specular 지수 GL_SHININESS 0. 0 Specular 지수 GL_EMISSION (0. 0, 1. 0) 재질의 emissive 컬러 GL_COLOR_INDEX (0, 1, 1) ambient, diffuse, specular 컬러 인덱스 2009 -2학기

예제 5 -8 다양한 재질 속성: material. c #include <stdlib. h> #include <GL/glut. h>

예제 5 -8 다양한 재질 속성: material. c #include <stdlib. h> #include <GL/glut. h> void init(void) { GLfloat ambient[] = { 0. 0, 1. 0 }; GLfloat diffuse[] = { 1. 0, 1. 0 }; GLfloat specular[] = { 1. 0, 1. 0 }; GLfloat position[] = { 0. 0, 3. 0, 2. 0, 0. 0 }; GLfloat lmodel_ambient[] = { 0. 4, 1. 0 }; GLfloat local_view[] = { 0. 0 }; 2009 -2학기

gl. Clear. Color(0. 0, 0. 1, 0. 0); gl. Enable(GL_DEPTH_TEST); gl. Shade. Model(GL_SMOOTH); gl.

gl. Clear. Color(0. 0, 0. 1, 0. 0); gl. Enable(GL_DEPTH_TEST); gl. Shade. Model(GL_SMOOTH); gl. Lightfv(GL_LIGHT 0, GL_AMBIENT, ambient); gl. Lightfv(GL_LIGHT 0, GL_DIFFUSE, diffuse); gl. Lightfv(GL_LIGHT 0, GL_POSITION, position); gl. Light. Modelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); gl. Light. Modelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view); gl. Enable(GL_LIGHTING); gl. Enable(GL_LIGHT 0); } 2009 -2학기

void display(void) { GLfloat no_mat[] = { 0. 0, 1. 0 }; GLfloat mat_ambient[]

void display(void) { GLfloat no_mat[] = { 0. 0, 1. 0 }; GLfloat mat_ambient[] = { 0. 7, 1. 0 }; GLfloat mat_ambient_color[] = { 0. 8, 0. 2, 1. 0 }; GLfloat mat_diffuse[] = { 0. 1, 0. 5, 0. 8, 1. 0 }; GLfloat mat_specular[] = { 1. 0, 1. 0 }; GLfloat no_shininess[] = { 0. 0 }; GLfloat low_shininess[] = { 5. 0 }; GLfloat high_shininess[] = { 100. 0 }; GLfloat mat_emission[] = {0. 3, 0. 2, 0. 0}; gl. Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 2009 -2학기

gl. Push. Matrix(); gl. Translatef (-3. 75, 3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT,

gl. Push. Matrix(); gl. Translatef (-3. 75, 3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, no_mat); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, no_mat); gl. Materialfv(GL_FRONT, GL_SHININESS, no_shininess); gl. Materialfv(GL_FRONT, GL_EMISSION, no_mat); glut. Solid. Sphere(1. 0, 16); gl. Pop. Matrix(); 2009 -2학기

gl. Push. Matrix(); gl. Translatef (-1. 25, 3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT,

gl. Push. Matrix(); gl. Translatef (-1. 25, 3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, no_mat); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, mat_specular); gl. Materialfv(GL_FRONT, GL_SHININESS, low_shininess); gl. Materialfv(GL_FRONT, GL_EMISSION, no_mat); glut. Solid. Sphere(1. 0, 16); gl. Pop. Matrix(); 2009 -2학기

gl. Push. Matrix(); gl. Translatef (3. 75, 3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT,

gl. Push. Matrix(); gl. Translatef (3. 75, 3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, no_mat); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, no_mat); gl. Materialfv(GL_FRONT, GL_SHININESS, no_shininess); gl. Materialfv(GL_FRONT, GL_EMISSION, mat_emission); glut. Solid. Sphere(1. 0, 16); gl. Pop. Matrix(); 2009 -2학기

gl. Push. Matrix(); gl. Translatef (-3. 75, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, mat_ambient); gl.

gl. Push. Matrix(); gl. Translatef (-3. 75, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, mat_ambient); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, no_mat); gl. Materialfv(GL_FRONT, GL_SHININESS, no_shininess); gl. Materialfv(GL_FRONT, GL_EMISSION, no_mat); glut. Solid. Sphere(1. 0, 16); gl. Pop. Matrix(); 2009 -2학기

gl. Push. Matrix(); gl. Translatef (-1. 25, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, mat_ambient); gl.

gl. Push. Matrix(); gl. Translatef (-1. 25, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, mat_ambient); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, mat_specular); gl. Materialfv(GL_FRONT, GL_SHININESS, low_shininess); gl. Materialfv(GL_FRONT, GL_EMISSION, no_mat); glut. Solid. Sphere(1. 0, 16); gl. Pop. Matrix(); 2009 -2학기

gl. Push. Matrix(); gl. Translatef (1. 25, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, mat_ambient); gl.

gl. Push. Matrix(); gl. Translatef (1. 25, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, mat_ambient); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, mat_specular); gl. Materialfv(GL_FRONT, GL_SHININESS, high_shininess); gl. Materialfv(GL_FRONT, GL_EMISSION, no_mat); glut. Solid. Sphere(1. 0, 16); gl. Pop. Matrix(); 2009 -2학기

gl. Push. Matrix(); gl. Translatef (3. 75, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, mat_ambient); gl.

gl. Push. Matrix(); gl. Translatef (3. 75, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, mat_ambient); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, no_mat); gl. Materialfv(GL_FRONT, GL_SHININESS, no_shininess); gl. Materialfv(GL_FRONT, GL_EMISSION, mat_emission); glut. Solid. Sphere(1. 0, 16); gl. Pop. Matrix(); 2009 -2학기

gl. Push. Matrix(); gl. Translatef (-3. 75, -3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT,

gl. Push. Matrix(); gl. Translatef (-3. 75, -3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, no_mat); gl. Materialfv(GL_FRONT, GL_SHININESS, no_shininess); gl. Materialfv(GL_FRONT, GL_EMISSION, no_mat); glut. Solid. Sphere(1. 0, 16); gl. Pop. Matrix(); 2009 -2학기

gl. Push. Matrix(); gl. Translatef (-1. 25, -3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT,

gl. Push. Matrix(); gl. Translatef (-1. 25, -3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, mat_specular); gl. Materialfv(GL_FRONT, GL_SHININESS, low_shininess); gl. Materialfv(GL_FRONT, GL_EMISSION, no_mat); glut. Solid. Sphere(1. 0, 16); gl. Pop. Matrix(); 2009 -2학기

gl. Push. Matrix(); gl. Translatef (1. 25, -3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT,

gl. Push. Matrix(); gl. Translatef (1. 25, -3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, mat_specular); gl. Materialfv(GL_FRONT, GL_SHININESS, high_shininess); gl. Materialfv(GL_FRONT, GL_EMISSION, no_mat); glut. Solid. Sphere(1. 0, 16); gl. Pop. Matrix(); 2009 -2학기

gl. Push. Matrix(); gl. Translatef (3. 75, -3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT,

gl. Push. Matrix(); gl. Translatef (3. 75, -3. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, no_mat); gl. Materialfv(GL_FRONT, GL_SHININESS, no_shininess); gl. Materialfv(GL_FRONT, GL_EMISSION, mat_emission); glut. Solid. Sphere(1. 0, 16); gl. Pop. Matrix(); gl. Flush(); } 2009 -2학기

void reshape(int w, int h) { gl. Viewport(0, 0, w, h); gl. Matrix. Mode(GL_PROJECTION);

void reshape(int w, int h) { gl. Viewport(0, 0, w, h); gl. Matrix. Mode(GL_PROJECTION); gl. Load. Identity(); if (w <= (h * 2)) gl. Ortho (-6. 0, -3. 0*((GLfloat)h*2)/(GLfloat)w, -10. 0, 10. 0); else gl. Ortho (-6. 0*(GLfloat)w/((GLfloat)h*2), -3. 0, -10. 0, 10. 0); gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); } 2009 -2학기

void keyboard(unsigned char key, int x, int y) { switch (key) { case 27:

void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } 2009 -2학기

int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE

int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glut. Init. Window. Size (600, 450); glut. Create. Window(argv[0]); init(); glut. Reshape. Func(reshape); glut. Display. Func(display); glut. Keyboard. Func (keyboard); glut. Main. Loop(); return 0; } 2009 -2학기

Lightmaterial 튜토리얼 2009 -2학기

Lightmaterial 튜토리얼 2009 -2학기

l l gl. Color. Material()을 호출한 뒤에는 GL_COLOR_MATERIAL을 인 자로 하는 gl. Enable() 호출

l l gl. Color. Material()을 호출한 뒤에는 GL_COLOR_MATERIAL을 인 자로 하는 gl. Enable() 호출 l 그러면, 장면을 그릴 때마다 gl. Color*()를 사용하여 현재 컬 러를 변경하거나, gl. Material*()로 재질을 변경할 수 있다. 정점들의 재질 속성을 하나씩 변경하려면 gl. Color. Material()을 사 용해야 한다 gl. Enable(GL_COLOR_MATERIAL); gl. Color. Material(GL_FRONT, GL_DIFFUSE); gl. Color 3 f(0. 2, 0. 5, 0. 8); // diffuse 반사 변경. . // 오브젝트를 그림 gl. Color. Material(GL_FRONT, GL_SPECULAR); gl. Color 3 f(0. 9, 0. 0, 0. 2): // specular 반사 변경. . // 다른 오브젝트를 그림 gl. Disable(GL_COLOR_MATERIAL); 2009 -2학기

예제 5 -9 gl. Color. Material() 사용하기: colormat. c #include <GL/glut. h> #include <stdlib.

예제 5 -9 gl. Color. Material() 사용하기: colormat. c #include <GL/glut. h> #include <stdlib. h> GLfloat diffuse. Material[4] = { 0. 5, 1. 0 }; void init(void) { GLfloat mat_specular[] = { 1. 0, 1. 0 }; GLfloat light_position[] = { 1. 0, 0. 0 }; gl. Clear. Color (0. 0, 0. 0); gl. Shade. Model (GL_SMOOTH); gl. Enable(GL_DEPTH_TEST); 2009 -2학기

gl. Materialfv(GL_FRONT, GL_DIFFUSE, diffuse. Material); gl. Materialfv(GL_FRONT, GL_SPECULAR, mat_specular); gl. Materialf(GL_FRONT, GL_SHININESS, 25. 0);

gl. Materialfv(GL_FRONT, GL_DIFFUSE, diffuse. Material); gl. Materialfv(GL_FRONT, GL_SPECULAR, mat_specular); gl. Materialf(GL_FRONT, GL_SHININESS, 25. 0); gl. Lightfv(GL_LIGHT 0, GL_POSITION, light_position); gl. Enable(GL_LIGHTING); gl. Enable(GL_LIGHT 0); gl. Color. Material(GL_FRONT, GL_DIFFUSE); gl. Enable(GL_COLOR_MATERIAL); } 2009 -2학기

void display(void) { gl. Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glut. Solid. Sphere(1. 0, 20, 16); gl.

void display(void) { gl. Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glut. Solid. Sphere(1. 0, 20, 16); gl. Flush (); } void reshape (int w, int h) { gl. Viewport (0, 0, (GLsizei) w, (GLsizei) h); gl. Matrix. Mode (GL_PROJECTION); gl. Load. Identity(); 2009 -2학기

if (w <= h) gl. Ortho (-1. 5, -1. 5*(GLfloat)h/(GLfloat)w, -10. 0, 10. 0);

if (w <= h) gl. Ortho (-1. 5, -1. 5*(GLfloat)h/(GLfloat)w, -10. 0, 10. 0); else gl. Ortho (-1. 5*(GLfloat)w/(GLfloat)h, -1. 5, -10. 0, 10. 0); gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); } 2009 -2학기

void mouse(int button, int state, int x, int y) { switch (button) { case

void mouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) { diffuse. Material[0] += 0. 1; if (diffuse. Material[0] > 1. 0) diffuse. Material[0] = 0. 0; gl. Color 4 fv(diffuse. Material); glut. Post. Redisplay(); } 2009 -2학기

case GLUT_MIDDLE_BUTTON: if (state == GLUT_DOWN) { diffuse. Material[1] += 0. 1; if (diffuse.

case GLUT_MIDDLE_BUTTON: if (state == GLUT_DOWN) { diffuse. Material[1] += 0. 1; if (diffuse. Material[1] > 1. 0) diffuse. Material[1] = 0. 0; gl. Color 4 fv(diffuse. Material); glut. Post. Redisplay(); } break; 2009 -2학기

case GLUT_RIGHT_BUTTON: if (state == GLUT_DOWN) { diffuse. Material[2] += 0. 1; if (diffuse.

case GLUT_RIGHT_BUTTON: if (state == GLUT_DOWN) { diffuse. Material[2] += 0. 1; if (diffuse. Material[2] > 1. 0) diffuse. Material[2] = 0. 0; gl. Color 4 fv(diffuse. Material); glut. Post. Redisplay(); } break; default: break; } } 2009 -2학기

void keyboard(unsigned char key, int x, int y) { switch (key) { case 27:

void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } 2009 -2학기

int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE

int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glut. Init. Window. Size (500, 500); glut. Init. Window. Position (100, 100); glut. Create. Window (argv[0]); init (); glut. Display. Func(display); glut. Reshape. Func(reshape); glut. Mouse. Func(mouse); glut. Keyboard. Func(keyboard); glut. Main. Loop(); return 0; } 2009 -2학기