게임엔진 제 8 강광원과재질 이대현교수 한국산업기술대학교게임공학과
학습목차 조명모델 광원의색상설정 재질 분산성분의이해 분산재질의구현 경반사성분의이해 경반사재질의구현
조명 (Illumination) 모델 조명모델 광원으로부터공간상의점들까지의조도를계산하는방법. 직접조명과전역조명 직접조명 (direct illumination) 모델 물체표면의점들이장면내의모든광원들로부터직접적으로받는빛만을고려. 전역조명 (global illumination) 모델 다른물체를거쳐서받는빛까지모두포함한모델. 계산량이많이요구됨.
광원의색상설정 주변광색상설정 void Ogre::SceneManager::setAmbientLight ( const ColourValue & colour ) 분산색상설정 void Ogre::Light::setDiffuseColour ( const ColourValue & colour ) void Ogre::Light::setDiffuseColour ( Real red, Real green, Real blue) 전반사색상설정 void Ogre::Light::setSpecularColour ( const ColourValue & colour ) void Ogre::Light::setSpecularColour ( Real red, Real green, Real blue)
재질 (Material) 재질이란? 물체가가지고있는고유의색상. 우리가물체를볼수있는것은광자가그물체의표면에부딪혀팅겨나와우리눈에도달하기때문인데, 그물체의표면에서튕겨나올때의광자의속성은물체표면의재질에따라달라지게됨. 재질의색상의종류 주변재질색상 (Ambient Material Color) 주변광원에대한재질의색상 분산재질색상 (Diffuse Material Color) 물체표면자체의색상 전반사재질색상 (Specular Material Color) 광원이반사되어물체의가장밝게빛나는부분의색상. 방사재질색상 (Emmisive Material Color) 발광체인물체를표현할때사용하는색상.
재질색상의해석 재질표면에도달한광자를재질표면이반사시키는비율로해석할수있음. Ex. 적색공이적색공으로보이는이유는? 1. 주변광원의색상순백색 (R=1,G=1,B=1) 임. 2. 적색공의주변재질색상이적색 (R=1,G=0,B=0) 임. 3. 적색공은주변광원으로받는광자를모두다반사시킴. 따라서적색으로나타남. Ex. 주변광원색상이순녹색 (R=0, G=1, B=0) 으로바뀌게되면?
직접조명모델 빛의난반사에의한성분. 주변광원에따른성분. 빛의전반사에의한성분. I = I + I + a d I s
주변광 (Ambient) 성분 주변광성분 주변광원에대한재질의반응을표현. 직접조명모델에서는물체가광원으로부터직접받는빛만을고려하기때문에, 다른물체에반사된빛을처리하지못함. 따라서다른물체를통해서반사된빛을근사적으로간략하게처리하기위해도입한성분임. I a = K a L a 주변재질색상 광원색상. setambientlight() 로설정.
분산 (Diffuse) 성분 분산성분 광원으로부터빛이들어올때, 모든방향으로똑같은양을반사시키는완전한난반사체를모델링. 재질의거친표면을모델링. 관찰자의위치에상관없이동일한양의빛이반사됨.
분산성분의계산 반사되는빛의세기는빛의입사각에따라달라짐. θ 빛의입사각 I d = ( K L ) cosθ d d 재질색상 광원색상. setdiffusecolor() 로설정.
실습 LightDiffuse 분산성분의실험
PlayState.cpp void PlayState::enter() { 중략 mlightd = mscenemgr->createlight("lightd"); mlightd->settype(light::lt_directional); mlightd->setdirection( Vector3( 0, -0.5f, -1 ) ); mlightd->setdiffusecolour(0.0f, 0.0f, 0.0f); 중략 } 실습 bool PlayState::frameStarted(GameManager* game, const FrameEvent& evt) { 중략 } else if (game->iskeydown(kc_r)) { r = (r > 0.99f)? 0.0f : r + 0.01f; mlightd->setdiffusecolour(r, g, b); } else if (game->iskeydown(kc_g)) { g = (g > 0.99f)? 0.0f : g + 0.01f; mlightd->setdiffusecolour(r, g, b); } else if (game->iskeydown(kc_b)) { b = (b > 0.99f)? 0.0f : b + 0.01f; mlightd->setdiffusecolour(r, g, b); } 중략 }
광원의분산색상을 R 로만설정
광원의분산색상을 G 로만설정
광원의분산색상을 B 로만설정
전반사 (Specular) 성분 전반사성분 매끄러운재질의표면을모델링. 관찰자의시점의따라서반짝거리는정도가달라짐. 전반사재질색상과반사도에따라영향을받음.
전반사성분의계산 α θ θ 반사도. 클수록반사범위가좁아짐. s ( K L )(cosα n I = ) s s 재질색상 광원색상. setspecularcolor() 로설정.
반사도에따른변화
실습 LightSpecular 전반사성분의실험
PlayState.cpp void PlayState::enter() { 중략 mlightd = mscenemgr->createlight("lightd"); mlightd->settype(light::lt_directional); mlightd->setdirection( Vector3( 0, -0.5f, -1 ) ); mlightd->setdiffusecolour(0.0f, 0.0f, 0.0f); mlightd->setspecularcolour(0.0f, 0.0f, 0.0f); 중략 } 실습 bool PlayState::frameStarted(GameManager* game, const FrameEvent& evt) { 중략 } else if (game->iskeydown(kc_s)) { r = (r > 0.99f)? 0.0f : r + 0.01f; g = (g > 0.99f)? 0.0f : g + 0.01f; b = (b > 0.99f)? 0.0f : b + 0.01f; mlightd->setspecularcolour(r, g, b); } 중략 }
전반사성분의실험
파란색점적광원
노란색지향광원 + 파랑색점적광원
실습과제 #5 닌자나이트클럽의구현 닌자는 Y축을중심으로계속회전. 싸이키조명효과를닌자위에비춤.