Equalizer中的視口(viewport)與像素視口(pixel viewport)

這兩天在做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一樣,相關聯的數據只提供一個接口,雖然有點強硬,但是也免去了很多挑挑揀揀的麻煩。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章