n n gl EnableGLenum Light Source ID n
광원 정의 n 광원 활성화 n gl. Enable(GLenum Light. Source. ID); n n n Light. Source. ID: GL_LIGHT 0 ~ GL_light 7 광원의 종류: gl. Lightfv( ); void gl. Lightfv(GLenum Light. Source. ID, GLenum Parameter, Type *Value) (default: p 547 표 10 -1 참조) n Parameter 와 Value: 지정할 속성을 정의 n GL_AMBIENT : ambient 광의 세기 n GL_DIFFUSE : diffuse 광의 세기 n GL_SPECULAR : specular 광의 세기 n GL_POSITION : 광원의 위치(x, y, z, w) n GL_SPOT_DIRECTION : 조명의 방향(x, y, z) n GL_SPOT_CUTOFF : 조명각 설정 n GL_SPOT_EXPONENT : 승수 설정(광택계수와 유사) n GL_CONSTANT_ATTENUATION : 거리감쇄 상수 n GL_LINEAR_ATTENUATION : 선형계수 n GL_QUADRATIC_ATTENUATION : 이차항 계수
광원 정의 n 광원위치 결정: 위치성 혹은 방향성광원 n n n gl. Lightfv(GL_LIGHT 0, GL_POSITION, My. Light. Position); 예) GLfloat My. Light. Position[]={1. 0, 2. 0, 3. 0, 1. 0}; 광원 방향(spotlight 인 경우) 및 승수 설정 n n n gl. Lightfv(GL_LIGHTt 0, GL_SPOT_DIRECTION, My. Light. Direction); 예) GLfloat My. Light. Directionn[]={3. 0, 4. 0, 3. 0}; gl. Lightf(GL_LIGHT 0, GL_SPOT_EXPONENT, 2. 0); gl. Lightfv(GL_LIGHT 0, GL_SPOT_CUTOFF, My. Spot. Angle); 예) GLfloat My. Spot. Angle[]={50. 0}
광원 정의 n 광원의 색 n 주변광, 확산광, 경면광에 대해 R, G, B, A로 나누어 서 정의 n n n n GLfloat My. Light. Ambient[]={0. 0, 1. 0, 0. 0, 1. 0}; GLfloat My. Light. Diffuse[]={1. 0, 0. 0, 1. 0}; GLfloat My. Light. Specular[]={1. 0, 1. 0}; gl. Lightfv(GL_LIGHTt 0, GL_AMBIENT, My. Light. Ambient); gl. Lightfv(GL_LIGHT 0, GL_DIFFUSE, My. Light. Diffuse); gl. Lightfv(GL_LIGHT 0, GL_SPECULAR, My. Light. Specular); 거리에 따른 빛의 약화 n 방향성 광원과 전역주변반사에는 적용되지 않음 n gl. Lightf(GL_Light 0, GL_LINER_ATTENUATION, 2. 0);
광원 위치 제어 n n gl. Lightfv(…, GL_POSITION, . . ); 의 위치에 따라 결정 장면 내 광원 위치가 고정 n 광원의 좌표는 전역좌표인 경우 gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); gl. Look. At(. . ); gl. Lightfv(…, GL_POSITION, . . ); gl. Rotate(); gl. Solid. Cube(); n 물체는 고정된 상태에서 광원이 이동 gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); gl. Look. At(. . ); gl. Push. Matrix(); gl. Rotate(); gl. Lightfv(…, GL_POSITION, . . ); gl. Pop. Matrix(); gl. Solid. Cube();
광원 위치 제어 n 광원이 시점따라 움직일 때 n 광원은 시점좌표계 기준으로 고정 gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); gl. Lightfv(…, GL_POSITION, . . ); gl. Look. At(. . ); gl. Rotate(); gl. Solid. Cube(); n 음영모드 n gl. Shade. Model(GLenum mode); n n Flat shading : GL_FLAT Gouraud Shading : GL_SMOOTH
법선벡터 정의 n 반사광의 세기를 계산하기 위해 필수적 n n 정점의 법선벡터는 정점 선언 이전에 명시 정점의 법선벡터는 단위벡터 n 모든 법선벡터의 시점좌표계에서 자동 정규화: gl. Enable(GL_NORMALIZE); 평면의 법선벡터 void My. Display(){ gl. Begin(GL_TRIANGLE); gl. Normal 3 f(0. 0, 1. 0, 0. 0); gl. Vertex 3 f(0, 0, -1); gl. Vertex 3 f(0, 0, 0); gl. Vertex 3 f(-1, 0, 0); gl. End(); gl. Flush(); } 곡면의 법선벡터 void My. Display(){ gl. Begin(GL_TRIANGLE); gl. Normal 3 f(0. 0, 1. 0, 0. 0); gl. Vertex 3 f(0, 0, -1); gl. Normal 3 f(0. 0, 2. 0, 0. 0); gl. Vertex 3 f(0, 1, 0); gl. Normal 3 f(0. 0, 3. 0, 0. 0); gl. Vertex 3 f(-1, 0, 0); gl. End(); gl. Flush(); }
물체면 특성 정의 n n n gl. Materialfv (face , pname , params ) gl. Materialf (face , pname , params ) gl. Materialiv (face , pname , params ) Parameters face n n pname n n Specifies which face or faces are being updated. Must be one of GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK. Specifies the material parameter of the face or faces that is being updated. Must be one of GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION, GL_SHININESS, GL_AMBIENT_AND_DIFFUSE. params n Specifies a pointer to the value or values that pname will be set to.
물체면 특성 정의 n p 558 표 10 -2 default 값 참조 GLfloat My. Material. Ambient[]={0. 2, 1. 0}; My. Material. Diffuse[]={1. 0, 0. 0, 1. 0}; My. Material. Specular[]={1. 0, 1. 0}; My. Material. Shininess = 90. ; gl. Materialfv(GL_FRONT, GL_AMBIENT, My. Material. Ambient); gl. Materialfv(GL_FRONT, GL_DIFFUSE, My. Material. Diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, My. Material. Specular); gl. Materialf (GL_FRONT, GL_SHININESS, My. Material. Shininess);
조명모델 정의 n Global Ambient Light(전역 주변광) n 광원과 무관하게 전체적으로 조명 n n 시점위치 n n 시점 위치를 시점벡터 방향으로 무한대 경면광 계산에 영향 n n gl. Light. Modelfv(GL_LIGHT_MODEL_AMBIENT, My. Global. Ambient); gl. Light. Modelfv(GL_LIGHT_MODEL_LOCAL_VI EWER, GL_FALSE); 양면조명 n gl. Light. Modelfv(GL_LIGHT_MODEL_TWO_SID ED, GL_FALSE);
GL에서 정점의 색 I=Global Ambient Reflection + Emittion + Ambient Reflection + Diffuse Reflection + Specular Reflection =
2개의 광원 n n 왼쪽 원환체(torus)는 광원 기능을 활성화시 킨 후 default 상태에서 그린 결과이다. gl. Lightfv(…) default n n GL_AMBIENT : (0, 0, 0, 1) GL_DIFFUSE n n n GL_SPECULAR n n n n n gl. Materialfv(. . ) default: GL_AMBIENT : (0. 2, 1. 0) GL_DIFFUSE : (0. 8, 1. 0) GL_SPECULAR : (0, 0, 0, 1) GL_SHININESS : 0 GL_EMISSION : (0, 0, 0, 1) 전역주변광 default: (0. 2, 1. 0) n n n (1, 1, 1, 1) Light 0인 경우 (0, 0, 0, 1) 나머지 광원 GL_POSITION : (0, 0, 1, 0) GL_SPOT_DIRECTION : (0, 0, -1) GL_SPOT_EXPONENT: 0. 0 GL_SPOT_CUTOFF: 180. 0 GL_CONSTANT_ATTENUATION : 1 GL_LINEAR_ATTENUATION : 0 GL_QUADRATIC_ATTENUATION : 0
2개의 광원 n 광원 0(위치성 광원) ambient[] = {0. 5, 0. 4, 0. 3, 1. 0}; diffuse[] = {0. 5, 0. 4, 0. 3, 1. 0}; specular[] = {1. 0, 1. 0}; position[] = {0, 0, 2, 1}; n 광원 1(spotlight) ambient 1[] = {0, 0, 0, 1. 0}; diffuse 1[] = {0. 5, 0. 2, 0. 3, 1. 0}; specular 1[] = {0. 0, 1. 0}; Position[] = {1, 1, 1, 1} Light. Direction[] = {-0. 5, -1} Spot. Angle[] = {20. 0} Spot. Cutoff=1. 0 n Material n 전역주변광과 근접시점 추가 Ambient_m[] = {0. 3, 1. 0}; Diffuse_m[] ={0. 8, 1. 0}; Specular_m[] = {0. 0, 1. 0}; Shininess_m[] = {25. 0}; global_ambient[] = {0. 1, 1. 0};
광원 애니메이션 n 광원이 x축을 중심으로 물체 주위를 돌면서 조명 void My. Display(){ Glfloat Lightposition={0, 0, 1. 5, 1. 0}; gl. Clear(GL_COLOR_BUFFER_BIT|GL_DEPTH_ BUFFER_BIT); gl. Push. Matrix(); gl. Transelatef(0, 0, -5); gl. Push. Matrix(); //x축 중심 양의 방향으로 마우스 왼쪽 버튼 클릭 마다 15도씩 회전 // 광원 위치 지정 및 백색 구와 위치 일치 //현재 조명을 비활성화 시키고 백색 구를 만들고 gl. Color 3 f(0. 9, 0. 9); glut. Wire. Sphere(0. 06, 10); // 다시 조명 활성화 gl. Pop. Matrix(); glut. Solid. Sphere(1. 0, 400); gl. Pop. Matrix(); gl. Flush(); }
- Slides: 17