D3d fov(视野范围) 的理解

近日在学习对D3d的hook操作,目标是想对第三方的D3d程序进行添加Logo等修改,开始的时候对SDK October 2006里面的Tut06_Meshes进行hook,偶然发现当我把它的窗口拉大了之后,他们的backbuffer并没有发生相应的变化,还是保持createwindow是的大小,所以图像拉伸了之后很难看了,而且拉伸变形了。之后我悟出了两点道理:

1.backbuffer的问题确实是这样的,你必须自己在WM_SIZE中处理重新生成device,我粗略看了一下DXUT里面处理的代码DXUTChangeDevice,真他妈的要命,又长又烦。看来微软这时候的sdk还是没有好的解决方式给出来。留给开发者的是繁重的系统处理代码,开发者哪有时间去做他自己的应用啊?如果拿来跟今天苹果App开发的方便度比较,我想相信很多都会选择去“吃苹果”了。

2.图像变形的问题,则跟backbuffer无关的,而跟X,Y方向上的fov(视野范围)有关。像我看得这个例子Tut06_Meshes,他在设置投影矩阵时,把fov的比例限定为1.0了,那么窗口拉伸的时候(宽高比例不是1:1),图像自然就变形了。我有选了了另外一个例子StateManager,发现他的窗口拉伸之后能看到的东西(场景)更多了,而且没有变形。仔细研究里面的代码之后我发现,它使用了窗口的宽高比例作为fov的比例来设置投影矩阵。这样我的窗口开的越大,能看得场景越多了。

 

那这样讲来,事实上这个fov的比例是可以调整的,并不一定就是w/h,这点对于VR融合这是比较关键的地方,因为可以保持图像的比例不变性,又可以在宽屏融合中真正看到更大的场景。

 

还有一点想说的是,我曾想在device的SetTransform中hook到而修改其投影矩阵,但在看StateManager的时候才发现,这不是唯一的接口,还有shader这玩意!这可就真没办法了。

posted @ 2012-08-31 10:57  slowtech-QQ914100608  阅读(1075)  评论(0编辑  收藏  举报