110 likes | 441 Views
실습 내용 (5 월 11 일 ). 실습 내용 그래픽스 실습 D.6 조명 설정하기 D.7 재질 설정하기 OpenGL 의 조명과 음영 주 우석저 10 장 2 개의 광원 광원 애니메이션 숙제 없음. 조명과 음영을 위한 6 가지 작업. 조명 기능 활성화 (Enabling Lighting) glEnable(GL_LIGHTING), glDisable(GL_LIGHTING) 광원의 정의 (Light source) glLightfv 음영 모드의 정의 (Shading Mode)
E N D
실습 내용 (5월 11일) • 실습 내용 • 그래픽스 실습 • D.6 조명 설정하기 • D.7 재질 설정하기 • OpenGL 의 조명과 음영 • 주 우석저 10장 • 2개의 광원 • 광원 애니메이션 • 숙제 • 없음.
조명과 음영을 위한 6가지 작업 • 조명 기능 활성화 (Enabling Lighting) • glEnable(GL_LIGHTING), glDisable(GL_LIGHTING) • 광원의 정의 (Light source) • glLightfv • 음영 모드의 정의 (Shading Mode) • glShadeModel(Gl_FLAT), glShadeModel(GL_SMOOTH) • 법선벡터 정의(Surface Normal) • glNormal3f(0.0, 1.0, 0.0), glEnable(GL_NORMALIZE) • 물체면 특성(재질)의 정의(Surface material) • glMaterialv • 조명 모델의 정의(Lighting Model) • glLightModelfv
광원의 정의 • 광원의 활성화 • glEnable(GL_LIGHT0), • GL_LIGHT0 에서 GL_LIGHT7 까지 총 8개 • 광원의 종류 • 위치성 광원 (w 값이 0 이 아닌 경우) • glLightfv(GL_LIGHT0, GL_POSITION, MyLightPosition) • 방향성 광원 (Spotlight) • glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, MyDirection) • glLightfv(GL_LIGHT0, GL_SPOT_CUTOFF, MySpotAngle) • glLightfv(GL_LIGHT0, GL_SPOT_EXPONENT, 2.0) • 광원의 색 • glLightv(GL_LIGHT0, GL_AMBIENT, MyLightAmbient) • glLightv(GL_LIGHT0, GL_DIFFUSE, MyLightDiffuse) • glLightv(GL_LIGHT0, GL_SPECULAR, MyLightSpecular) • 거리에 따른 빛의 약화 • 광원의 위치 제어
광원의 정의 • 거리에 따른 빛의 약화 • glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0) • glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 2.0) • glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 3.0) • 광원의 위치 제어 • glLightfv ( … , GL_POSITION, … ) • 고정 위치 광원 • 움직이는 광원 • 시점을 따라가는 광원
물체면 특성(재질)의 정의 • 물체의 특성 • 물체의 색 : 주변 반사, 난반사, 정반사 • 매끄러움 : 광택 계수 • 특성 정의 • glMaterialv(GL_FRONT, GL_AMBIENT, MyMaterialAmbient); • glMaterialv(GL_FRONT, GL_DIFFUSE, MyMaterialDiffuse); • glMaterialv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, MyMaterialDiffuse); • glMaterialv(GL_FRONT, GL_SPECULAR, MyMaterialSpecular); • glMaterialv(GL_FRONT, GL_SHINENESS, MyShineness); • 발광체 • 스스로 빛을 내지만 광원으로는 작용하지 않음. • glMaterialv(GL_FRONT, GL_EMISSION, Emission)
조명 모델 정의 • 전역 주변광 • glLightModelfv(GL_LIGHT_MODEL_AMBIENT, MyGlobalAmbient); • 시점 위치 • glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); // 시점의 위치가 물체에 가까운 경우 • glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE); // 시점의 위치가 물체에 먼 경우 • 양면 조명 • glLightModelfv(GL_LIGHT_MODEL_TWO_SIDED, GL_TRUE); // 양면 모두에 광원이 적용된다. • glLightModelfv(GL_LIGHT_MODEL_TWO_SIDED, GL_FALSE);
D.6 조명 설정하기 • D4. PerspectiveSolar 프로젝트로 시작한다. • 태양계 애니메이션에 광원을 추가한다. • 전체 조명(주변광) • OpenGL 프로그램에 전체 조명을 추가하려면 먼저 조명의 사용을 알려야 한다. • glEnable(GL_LIGHTING); • 다음으로 해야 할 일은 조명 효과 모델을 설정하는 것이다. • glLightModelfv(GLenum pname, const GLfloat *params); • pname에는 보통 GL_LIGHT_MODEL_AMBIENT를 사용한다. • params에는 주변광의 색과 밝기 값을 저장한 float array를 대입한다.
D.6 조명 설정하기 • 특정 광원을 설정하기 위해서는 다음과 같은 과정을 거친다. • 광원의 주변광과 난반사광 값을 정하고, 이 값을 광원에 설정한다. • SetupRC()에서 설정하면 된다. • GLfloat ambientLight[] = {0.3f, 0.3f, 0.3f, 1.0f};GLfloat diffuseLight[] = {0.7f, 0.7f, 0.7f, 1.0f};glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); • 광원을 활성화한다. 역시 SetupRC()에서 설정한다. • glEnable(GL_LIGHT0); • OnSize()에서 광원의 위치를 설정한다. • GLfloat lightPos[] = { -50.0f, 50.0f, 100.0f, 1.0f };glLightfv(GL_LIGHT0, GL_POSITION, lightPos); • OpenGL에서는 조명도 변환 행렬의 영향을 받으므로 하나의 기하학적 객체로 다루는 것이 타당하다.
D.7 재질 설정하기 • 객체의 재질 • 재질의 정의에 따라 빛이 객체에 반사될 때 객체 표면에 어떤 효과가 나타나는 지가 달라진다. 먼저 설정하는 명령을 내린다. • glEnable(GL_COLOR_MATERIAL); • OpenGL에서는 5가지의 재질 성분을 가지고 물체의 재질을 표현. 현재 색상에 하나 이상의 재질 속성을 지정하는 것이 가능하다. • DIFFUSE Reflection , AMBIENT Reflection , SPECULAR Reflection , SHINENESS , EMISSION • 어떤 모드를 설정할 것인지는 다음의 함수를 사용하여 선택할 수 있다. 사용자가 색상 값만 입력하면 알아서 해당 조명에 대한 재질의 속성을 계산해준다. • glColorMaterial(enum face, enum mode); • face는 현재 색이 영향을 주는 면으로 FRONT, BACK 또는 FRONT_AND_BACK를 지정할 수 있다. • mode는 AMBIENT, DIFFUSE, SPECULAR, SHINENESS, EMISSION, AMBIENT_AND_DIFFUSE중에서 선택한다.
D.7 재질 설정하기 • OpenGL에서 조명 및 재질을 정의함수. • glMaterial{ifv}(enum face, enum mode, T param); • glLight{ifv}(enum face, enum mode, T param); • glLightModel{ifv}(enum face, enum mode, T param);