Ogre實現渲染大量向量快速更新顏色的方法

2021-06-12 10:03:00 字數 2180 閱讀 8901

三維gis的渲染不得不考慮的是效率問題,顯示卡的工作方式是可以高效的處理大量少批次的三角面,而不是處理少量大批次的三角面。所以為了保證效率,將相同渲染規格的渲染實體合併到乙個批次去渲染,會大大提高渲染效率。但是這樣也帶來乙個問題,就是雖然效率提高了,但是可編輯性降低了,合併在一起的實體很難去編輯。

本文介紹一種大量向量渲染的快速更新顏色的方法,重點是更新顏色,因為合併向量渲染實體很簡單,這裡不做太多的介紹。

首先說一下思想,在頂點快取中加入顏色快取,加入紋理座標快取(用一維紋理座標代替向量的id)。在修改顏色時,鎖定紋理座標快取,和顏色快取,根據id遍歷,將顏色賦值即可。

新增顏色快取**如下:

//建立顏色資料

vbuf =

hardwarebuffermanager::getsingleton().createvertexbuffer(

decl->getvertexsize(colourbuffer),

vertexcount,

hardwarebuffer::hbu_dynamic_write_only);

//繫結顏色頂點

mrenderop.vertexdata->vertexbufferbinding->setbinding(colourbuffer, vbuf);

上面的colourbuffer

指的是繫結的id,我們應該將想要修改的頂點快取分類,用不同的id繫結,以便下面能夠方便得到該頂點快取,比如定義下面幾個快取id:

const int positionbuffer = 0;

const int colourbuffer = 1;

const int vectoridbuffer = 2;

新增紋理座標快取

//新增向量索引頂點

decl->addelement(vectoridbuffer, 0, vet_float1, ves_texture_coordinates,0);

//建立向量索引頂點

vbuf =

hardwarebuffermanager::getsingleton().createvertexbuffer(

decl->getvertexsize(vectoridbuffer),

vertexcount,

hardwarebuffer::hbu_dynamic_write_only);

//繫結向量索引頂點

mrenderop.vertexdata->vertexbufferbinding->setbinding(vectoridbuffer, vbuf);

更新顏色的**如下:

//得到向量id快取

hardwarevertexbuffersharedptr vbuf_id =mrenderop.vertexdata->vertexbufferbinding->getbuffer(vectoridbuffer);

//得到顏色快取

hardwarevertexbuffersharedptr vbuf_clr =mrenderop.vertexdata->vertexbufferbinding->getbuffer(colourbuffer);

int icount = mrenderop.vertexdata->vertexcount;

float* pid = static_cast(vbuf_id->lock(hardwarebuffer::hbl_discard));

rgba *pdest = static_cast(vbuf_clr->lock(hardwarebuffer::hbl_discard));

*pdest++;

} }vbuf_id->unlock();

vbuf_clr->unlock();

其中mapidcolour

為typedef

std::map

mapidcolour

,即id和顏色對應的雜湊表。

通過上面**即可以快速的更新顏色,即使是在乙個批次中渲染。

如下圖所示即為乙個批次渲染的兩個不同顏色的三角行,如若改變顏色呼叫上面的**即可。

轉 ogre 渲染流程

ogre渲染流程 1.fireframestarted 2.按某種優先順序更新所有渲染目標 2.1 firepreupdate 2.2 更新所有視口 2.2.1 fireviewportpreupdate 2.2.2 場景管理的渲染函式 2.2.2.1 更新陰影 2.2.2.2 更新動畫 2.2.2...

Ogre 渲染佇列(一)

渲染佇列在 ogre 中是乙個重要的概念,在場景中的所有物體都會在繪製前被 ogre 放入到乙個特定的渲染佇列中。渲染佇列主要起兩個作用 1.確保正確的繪製順序。比如先繪製天空盒再繪製一般物體,最後繪製介面。2.提高渲染效率。ogre 將具有相同 pass 的物體放在一起進行繪製,目的是盡可能減少渲...

Ogre的渲染優化心得

做商業網路遊戲的話,效率是乙個不可避免的話題,為了留更多的空間給客戶端的邏輯,那麼渲染模組就應該盡量高效.小弟只 一下ogre的渲染優化,以大家熟悉的天龍八部為例.以網上流傳版本的天龍 來看,ogre和cegui部分的渲染都有嚴重的效能問題,ogre 地形的實現,乙個tile,只按材質做了批次優化,...