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一样,相关联的数据只提供一个接口,虽然有点强硬,但是也免去了很多挑挑拣拣的麻烦。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章