Ogre中的地形
使用terrain.cfg
WorldTexture=terrain_texture.jpg? //地形紋理
DetailTexture=terrain_detail.jpg? //細(xì)節(jié)紋理
DetailTile=3????????????????????? //細(xì)節(jié)紋理在一個(gè)地形小塊中的平鋪數(shù)
PageSource=Heightmap????????????? //高度圖數(shù)據(jù)源
Heightmap.image=terrain.png?????? //高度圖名稱,符合2^n+1
PageSize=513????????????????????? //高度圖大小
TileSize=65?????????????????????? //地形小塊大小
MaxPixelError=3?????????????????? //決定使用層次細(xì)節(jié)時(shí)充許誤差
PageWorldX=1500?????????????????? //地形在世界中的范圍x方向
PageWorldZ=1500?????????????????? //z方向
MaxHeight=100???????????????????? //世界中地形最大映射高度
MaxMipMapLevel=5????????????????? //層次細(xì)節(jié)上限
#VertexNormals=yes??????????????? //在緩沖中計(jì)算頂點(diǎn)法線,計(jì)算機(jī)光照或GPU程序用到時(shí)打開
#VertexColors=yes //在緩沖中設(shè)置頂點(diǎn)顏色,假如有GPU程序需要時(shí)打開
#UseTriStrips=yes???????????????? //對(duì)于現(xiàn)在的硬件,建議關(guān)掉
VertexProgramMorph=yes ????? //使用頂點(diǎn)程序進(jìn)行LOD融合處理
LODMorphStart=0.2???????????????? //LOD融合開始點(diǎn):高,低LOD之間距離之比
下列參數(shù)用于提供自己的著色程序時(shí)使用,這會(huì)提供自己定義的material,那么先前定義的
WorldTexture 與 DetailTexture的設(shè)置不再用到,多余的了。
MorphLODFactorParamName=morphFactor
//假設(shè)VertexProgramMorph被設(shè)為yes,定制的material中包括一個(gè)高級(jí)頂點(diǎn)程序。它指定了一個(gè)頂點(diǎn)
//程序的參數(shù)名,這個(gè)參數(shù)用于融合LOD,參數(shù)值從0-1,0表示不調(diào)整,1表示完全調(diào)整到下一級(jí)LOD
MorphLODFactorParamIndex???????? //用于materail中包含低級(jí)頂點(diǎn)程序的情況,意義同上
CustomMaterialName?????????????? //指定的materail名字
上述配置文件定義了基于高度圖的地形。這些參數(shù)定義可概括為兩類:Ogre使用第一類從高度圖產(chǎn)生地形
mesh與材質(zhì)。第二類是定制材質(zhì)與GPU頂點(diǎn)程序,這可以代替ogre自動(dòng)產(chǎn)生的著色程序。
另外的說明:
TerrainScenceManager會(huì)把高度圖分為向個(gè)pages,每個(gè)page由幾個(gè)tiles組成.而它們也不過是個(gè)方便的名字,
它們都定義了在產(chǎn)生的mesh中一組構(gòu)成正方形的頂點(diǎn)集。
WorldTexture定義的紋理不必與目標(biāo)地形一樣大。
PageWorldX,PageWorldZ可以縮放世界中的地形。
MaxHeight 在Y方向縮放地形。
DetailTexture 只使用一個(gè)紋理,如使用多層紋理,應(yīng)該使用自定義materail。
從程序加載地形
setWorldGeometry()有重載形式,一種用于加載配置文件,另一種我們可在程序中使用,以
達(dá)到手工加載的功能。這里,SceneData被 typedef 為std:map,它存儲(chǔ)了如我們?cè)趖errain.cfg
中看到那些值對(duì)。假設(shè)我們已經(jīng)從某個(gè)二進(jìn)制文件讀入我們想要的內(nèi)容到SceneData中。我們要做
的就是把讀入的內(nèi)容轉(zhuǎn)換成setWorldGeometry()需要的類型。先看一下函數(shù)原型:
Ogre::SceneManager::setWorldGeometry (? DataStreamPtr &? stream,?
? const String &? typeName = StringUtil::BLANK
?)?
DataStreamPtr是一個(gè)智能指針,因此從局部變量中返回是安全的,程序相當(dāng)直觀,不再多說了。
Ogre::DataStreamPtr Process_Loader::getSceneDataStream(SceneData &data) {
// create what looks like a config file for the edification of Ogre
std::string mem;
SceneData::iterator it;
for (it=data.begin(); it!=data.end(); it++) {
mem += it->first;
mem += "=";
mem += it->second;
mem += "\n";
}
void *pMem = (void *)new unsigned char[mem.length()+1];
memset(pMem, 0, mem.length()+1);
memcpy(pMem, mem.c_str(), mem.length() + 1);
// stuff this into a MemoryDataStream
Ogre::DataStreamPtr pStr(new Ogre::MemoryDataStream(pMem, mem.length() + 1));
return pStr;
}
// and then elsewhere in the world loader:
Ogre::DataStreamPtr pStr = getSceneDataStream(terrainDef);
m_sceneMgr->setWorldGeometry(pStr);
posted on 2007-03-09 17:25
清源游民 閱讀(2032)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
OGRE