게임엔진 제 10 강지형과하늘의렌더링 이대현교수 한국산업기술대학교게임공학과
학습목차 지형렌더링 하늘렌더링 육면체하늘 (SkyBox) 반구하늘 (SkyDome) 평면하늘 (SkyPlane)
실습 Terrain 지형의렌더링
장면설정 Y Step 1: 장면관리자설정 Step 2: 닌자의배치 Step 3: 광원생성및그림자표시 Step 4: 장면에지형을배치 X Z
PlayState.cpp bool PlayState::enter(void) { mroot = Root::getSingletonPtr(); mscenemgr = mroot->createscenemanager(st_exterior_close); 실습 중략 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 사용
실행결과
높이맵 # Heightmap-source specific settings Heightmap.image=terrain.png 지형의높이를나타냄. 그레이레벨로높이를표시.(0-255) 백색 : 가장높은곳. 255 흑색 : 가장낮은곳. 0
# Maximum height of the terrain MaxHeight=100 지형의높이의최대값. 높이맵의 0~255 값이 0~100 값으로스케일링.
MaxHeight=200 으로한실행결과
몇가지일러두어야점들 지형장면관리자를사용할경우, 지형은광원과는영향이없다. 지형자체의그림자는텍스쳐를통해서만들어진다. 엔터티의그림자를드리우려면, 반드시 SHADOWTYPE_STENCIL_MODULATIVE 그림자기법을사용해야한다.
주변광원, 지향광원으로모두없애고실행한결과
SHADOWTYPE_STENCIL_ADDITIVE 사용
실습 Sky 하늘의렌더링
육면체하늘실습 PlayState.cpp bool PlayState::enter(void) { 실습 중략 mscenemgr->setskybox(true, "Examples/SpaceSkyBox"); }
실행결과
하늘텍스쳐및재질정의 material Examples/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, Examples/SpaceSkyBox, 10, false); 하늘이카메라와장면사이에존재함. 장면이먼저그려지고그다음에하늘이그려짐. 하늘이장면보다카메라와가깝기때문에, 하늘만보이게됨.
mscenemgr->setskybox(true, Examples/SpaceSkyBox, 800, false);
mscenemgr->setskybox(true, Examples/SpaceSkyBox, 5000, false);
반구하늘실습 PlayState.cpp bool PlayState::enter(void) { 실습 중략 mscenemgr->setskydome(true, "Examples/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, Examples/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 로한결과
평면하늘실습 PlayState.cpp bool PlayState::enter(void) { 실습 중략 Plane plane; plane.d = 1000; plane.normal = Vector3::NEGATIVE_UNIT_Y; mscenemgr->setskyplane(true, plane, "Examples/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, "Examples/CloudySky", 1500, 50, true, 2.0f, 150, 150); 곡률을 2.0 으로, 평면하늘을 x 축, y 축방향으로 150 등분한사각형으로구성.
하늘의선택 하늘의선택은실제프로그램에서사용자의시야의특성에따라다르게선택해야한다. 모든방향을다볼수있는상황이라면? 육면체하늘. 지형또는마루가있어서음의 y 방향은가려지는상황이면? 반구형하늘. 사방이산으로둘러쌓이거나, 성의내부에갇혀서지평선을볼수없는경우라면? 평면하늘. 그래픽부하를줄이려면? 평면하늘. 안개효과를사용하려면? 평면하늘.
실습과제 #6 석양하늘의구현 인터넷검색이미지사용.