Equalizer中的視口(viewport)與像素視口(pixel viewport)
來源:互聯網
上載者:User
這兩天在做Ogre向Equalizer的移植,中間遇到了一個小問題。
在Equalizer中需要將實際的幀渲染過程放在eq::Channel::frameDraw中完成,其中需要根據伺服器的配置對渲染過程中的緩衝、視口、透視矩陣、模型-視矩陣進行更新,以實現視窗間的負載劃分與最終映像的合成。
由於Ogre中的視口設定是一組(0,1)範圍的向量,所以我在實現的時候很自然的選擇了eq::Channel::getViewport來獲得視口資料,因為它的返回資料也是(0,1)範圍的,然後根據它來設定Ogre中的視口。我用的是兩個視窗,sort-first的配置(2-window.2d.eqc)。雖然兩個視窗都能夠繪製正確的畫面,但是合成視窗總是無法正確的獲得另一個視窗的畫面來進行合成。在查了Eq的源碼後發現,eq::Channel在進行映像拷貝時不是根據其內部的視口資料進行的,而是根據一個像素視口(pixel viewport)的資料進行的,而後者在我所用的版本中是根據設定檔中定義的視口資料計算的,其中的x與y都被定義為0(這是個初期為了簡便所做的設定,0.4版中已經改為根據外部配置進行計算獲得了),也就是說無論我的視口如何定義,所拷貝的地區始終都是從視窗的左下角開始的。
當然我根據像素視口進行設定後,映像合成過程就基本正確了(同步還有點問題,後面慢慢改進吧),但就所遇到的問題我還是向Eilemann請教了一下。他建議大家仍然是根據pixel viewport來設定自己的視口,因為viewport只是在eq::Channel中接收來自與外部的配置或者據此計算一些過程資料,比如視窗的比例或者對pixel viewport設定初始量等。而在eq::Channel的其它處理過程中都是採用pixel viewport進行的。
Eilemann沒有說為什麼兩個資料都有公用介面,估計他希望能夠給開發人員提供更多的靈活性吧,不過我倒是覺得這樣其實聽容易造成使用者的困惑,要是像Ogre一樣,相關聯的資料只提供一個介面,雖然有點強硬,但是也免去了很多挑揀選揀的麻煩。