핚국산업기술대학교 제 15 강지형, 하늘, 및안개의렌더링 이대현교수
학습안내 학습목표 지형, 하늘, 안개등과같이읷반적읶 3D 모델로표현하기에적합하지않은오브젝트들을렌더링하는방법을익힌다. 학습내용 지형렌더링하늘렌더링 육면체하늘 (SkyBox) 반구하늘 (SkyDome) 평면하늘 (SkyPlane) 안개렌더링 선형안개 (linear fog) 지수안개 (exponential fog) 안개와하늘 안개로암흑구현하기
실습 Terrain 지형의렌더링
class LectureApp void go(void) {... 중략... mscenemgr = mroot->createscenemanager(st_exterior_close, main );... 중략... 실습 } mscenemgr->setworldgeometry("terrain.cfg");
실행결과
지형장면관리자의설정 장면관리자의종류 옥트리 (Octree: 8진트리 ) 장면관리자 기본장면관리자 대부분의장면에사용가능 BSP(Binary Surface Partition) 장면관리자 건물내부와같이벽과복도등으로구성된장면에최적화된성능. 지형 (Terrain) 장면관리자 정적지형을가지는비교적소규모의장면에적합 고해상도의지형에적합 mscenemgr = mroot->createscenemanager(st_exterior_close); 장면관리자를지형장면관리자로설정.
지형의배치 mscenemgr->setworldgeometry("terrain.cfg"); 지형을 terrain.cfg 파일의정보를이용하여구성함.
terrain.cfg 의내용 # The main world texture WorldTexture=terrain_texture.jpg # The detail texture DetailTexture=terrain_detail.jpg 지형의전체모습 ( 평면색상 ) 을지정. 정적그림자가포함되어있슴. 지형의세부재질을지정. 일종의타일로볼수있음.
DetailTexture=BeachStones.jpg 사용
DetailTexture=KPU_LOGO.png 사용
높이맵 # Heightmap-source specific settings Heightmap.image=terrain.png 지형의높이를나타냄. 그레이레벨로높이를표시.(0-255) 백색 : 가장높은곳. 255 흑색 : 가장낮은곳. 0
# Maximum height of the terrain MaxHeight=100 지형의높이의최대값. 높이맵의 0~255 값이 0~100 값으로스케일링.
MaxHeight=400 으로핚실행결과
몇가지일러두어야점들 지형장면관리자를사용핛경우, 지형은광원과는영향이없다. 지형자체의그림자는텍스쳐를통해서만들어진다. 엔터티의그림자를드리우려면, 반드시 SHADOWTYPE_STENCIL_MODULATIVE 그림자기법을사용해야핚다.
실습 Sky 하늘의렌더링
class LectureApp void go(void) {... 중략... 실습 } mscenemgr->setskybox(true, "Sky/SpaceSkyBox");
실행결과
하늘텍스쳐및재질정의 material Sky/SpaceSkyBox { technique { pass { lighting off depth_write off 어차피다른오브젝트보다멀리있는것을가정하기때문에 depth buffer 를채울필요가없음. 속도향상 } } } texture_unit { cubic_texture stevecube.jpg separateuv tex_address_mode clamp }
육면체하늘 (SkyBox) 커다란정육면체로써, 장면안의모든오브젝트들을에워쌈. 육면체하늘의생성 void Ogre::SceneManager::setSkyBox ( bool enable, const String & materialname, Real distance = 5000, bool drawfirst = true, const Quaternion & orientation = Quaternion::IDENTITY, const String & groupname = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME) enable: 하늘의사용여부. true 면표시. false 는표시하지않음. materialname: 하늘에사용될재질스크립트이름. distance: 하늘과카메라사이의거리. drawfirst: 하늘의출력순서. true 면하늘이먼저그려지고, 그다음에씬오브젝트들이그려짐. fasle 면반대순서. 하늘을맨나중에그리는것이속도향상이됨.( 공간을 pixel 로채우는 rasterization 은시간이많이요구되는동작임.)
mscenemgr->setskybox(true, Sky/SpaceSkyBox, 200, false); 하늘이카메라와장면사이에존재함. 장면이먼저그려지고그다음에하늘이그려짐. 하늘이장면보다카메라와가깝기때문에, 하늘만보이게됨.
mscenemgr->setskybox(true, Sky/SpaceSkyBox, 800, false);
mscenemgr->setskybox(true, Sky/SpaceSkyBox, 5000, false);
반구하늘렌더링 mscenemgr->setskydome(true, Sky/CloudySky", 2, 8); 실습
실행결과
반구하늘 (SkyDome) 기본적으로정육면체의하늘이지만, 텍스쳐가입혀질때반구면안으로입혀져서, 반구로보인다. 반구하늘의생성 void Ogre::SceneManager::setSkyDome ( bool enable, const String & materialname, Real curvature = 10, Real tiling = 8, Real distance = 4000, bool drawfirst = true, const Quaternion & orientation = Quaternion::IDENTITY, int xsegments = 16, int ysegments = 16, int ysegments_keep = -1, const String & groupname = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME) enable: 하늘의사용여부. true 면표시. false 는표시하지않음. materialname: 하늘에사용될재질스크립트이름. curvature: 반구의곡률. 2-65 사이의값을설정. 값이작을수록거리감 ( 깊이감 ) 이좋으며, 클수록부드러운효과를얻을수있다. tiling: 하늘을텍스쳐재질의타읷로구성했을때, 사용되는타읷의개수.
반구하늘텍스쳐및재질설정 mscenemgr->setskydome(true, Sky/CloudySky, 2, 8); material Examples/CloudySky { technique { pass { lighting off depth_write off clouds.jpg } } } texture_unit { texture clouds.jpg scroll_anim 0.15 0 } x 회전속도, y 회전속도
반구하늘은밑바닥이없다.
curvature=65 로핚결과
curvature=65, tiling=40 로핚결과
curvature=2, tiling=40 로핚결과
평면하늘구현 Plane plane; plane.d = 1000; plane.normal = Vector3::NEGATIVE_UNIT_Y; 실습 mscenemgr->setskyplane(true, plane, "Sky/CloudySky", 1500, 75);
평면하늘 (SkyPlane) 평면을생성핚후, 텍스쳐를입혀서하늘로사용핚다. 그래픽부하량은세종류의평면중가장작다. 평면하늘의생성 void Ogre::SceneManager::setSkyPlane ( bool enable, const Plane & plane, const String & materialname, Real scale = 1000, Real tiling = 10, bool drawfirst = true, Real bow = 0, int xsegments = 1, int ysegments = 1, const String & groupname = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME) plane: 하늘로사용될평면. scale: 평면하늘의크기. bow: 0 이면평평한완젂평면. 값이커질수록휘어진면이됨. xsgements, ysegments: 평면의 x 축및 y 축방향의분할개수.
평면을생성. 원점과의거리 1000. 평면의법선벡터는 y 축음의방향. Plane plane; plane.d = 1000; plane.normal = Vector3::NEGATIVE_UNIT_Y; mscenemgr->setskyplane(true, plane, "Examples/CloudySky", 1500, 75);
평면지형문제점의해결 모든시야방향에높은벽이나언덕이있어서지평선을완전히가릴수있을경우에만사용. 곡률을부여함으로써반구형하늘처럼만든다. 이때는그래픽부하량이늘어난다. mscenemgr->setskyplane(true, plane, "Sky/CloudySky", 1500, 50, true, 2.0f, 150, 150); 곡률을 2.0 으로, 평면하늘을 x 축, y 축방향으로 150 등분한사각형으로구성.
하늘의선택 하늘의선택은실제프로그램에서사용자의시야의특성에따라다르게선택해야핚다. 모든방향을다볼수있는상황이라면? 육면체하늘. 지형또는마루가있어서음의 y 방향은가려지는상황이면? 반구형하늘. 사방이산으로둘러쌓이거나, 성의내부에갇혀서지평선을볼수없는경우라면? 평면하늘. 그래픽부하를줄이려면? 평면하늘. 안개효과를사용하려면? 평면하늘.
실습 Fog 안개렌더링
안개의구현방법 안개를실제로공간상에만드는것이아니다. 일종의필터로써, 씬위의오브젝트들에적용된다. 따라서, 오브젝트들이없으면안개역시보이지않는다. 뷰포트의배경색만을보는결과가나옦다. 안개를정확히보이도록하려면, 배경색을안개의색상과읷치시켜야한다.
안개의설정 void Ogre::SceneManager::setFog ( FogMode mode = FOG_NONE, const ColourValue & colour = ColourValue::White, Real expdensity = 0.001, Real linearstart = 0.0, Real linearend = 1.0) mode: 선형 (linear) 또는지수형 (exponential) 의선택. colour: 안개의색상. expdensity: 지수형안개에사용되는농도값. linearstart, linearend: 선형안개에서만사용됨. 안개가끼는범위카메라로부터의거리로나타냄. linearstart( 가장엷음 ) 에서시작해서 linearend( 가장짙음 ) 에서안개가끝남.
선형안개와지수형안개 선형안개 안개의농도가거리에비례하여짙어진다. 안개설정시, FOG_LINEAR 를사용. 지수형안개 안개의농도가거리에지수적으로비례하여짙어진다. 안개설정시, FOG_EXP 또는 FOG_EXP2 FOG_EXP2 의경우는안개가짙어지는정도가훨씬크다.
class LectureApp Ogre::ColourValue fadecolor(0.7, 0.7, 0.7); mviewport->setbackgroundcolour(fadecolor); mscenemgr->setfog(ogre::fog_linear, fadecolor, 0.0, 500, 1000); 실습
실행결과
선형안개구현 뷰포트의배경색상을안개색상과동일하게설정. Ogre::ColourValue fadecolor(0.7, 0.7, 0.7); mviewport->setbackgroundcolour(fadecolor); mscenemgr->setfog(ogre::fog_linear, fadecolor, 0.0, 500, 1000); 카메라로부터 500~1000 단위의거리사이에 facecolour 의안개를표시. 선형안개로설정함.
지수형안개 FOG_EXP2 타입설정 mscenemgr->setfog(fog_exp2, fadecolour, 0.001);
암흑구현실습 실습 안개의색상을매우어두운색으로설정하면카메라에위에점조명을설치핚효과를얻을수있다. Ogre::ColourValue fadecolor(0.01, 0.01, 0.01); mviewport->setbackgroundcolour(fadecolor); mscenemgr->setfog(ogre::fog_linear, fadecolor, 0.0, 500, 1000);
학습정리 지형렌더링 씬매니저를지형씬매니저로선택 ( ST_EXTERIOR_CLOSE ) Height Map 과 Texture 를이용하여효과적읶렌더링가능 하늘렌더링 육면체하늘, 반구하늘, 평면하늘 상황에따라적젃한하늘구현필요. 안개렌더링 선형설정및지수형설정가능.