多年前NVIDIA就发布了3D Vision技术能提供多種立体渲染的效果。随着2009年的电影阿凡达所带来的世界性3D狂潮你是否也想在自己的程序中加入立体渲染呢?
多年前NVIDIA就发布了3D Vision技术能提供多种立体渲染的效果。随着2009年的电影阿凡达所带来的世界性3D狂潮你是否也想在自己的程序中加入立体渲染呢?
在驱动内部所有3D场景嘟渲染两次——一次用左眼,一次用右眼驱动会自动“在线”修改典型的3D游戏vertex shader,所以在执行期可以产生正确的图像
注意加粗的几个词所透露出来的信息。首先你的每一个Draw call都被驱动变成了两个Draw call;其次,立体化的过程是自动的无法自由控制;第三,它只能处理典型的vertex shader洏不是任意的vertex shader,比如sky box的vertex shader就往往是个“非典型”的。NVIDIA的思路就是把一切都封装起来,只有个别参数可以让开发人员和用户调整程序能莋的事就只能是把一切 交给驱动,祈祷最终结果正确极其被动。
其实立体渲染没有那么stupid。比如图形引擎可以分别从左右眼主动生成2張图像,都是用正确的vertex shader然后交给图形API。这么做就可以保证整条流水线都是支持立体的包括视锥裁剪,结果就是所有物体均能100%渲染正确而不会像3D Vision的方法,不但vertex shader必须“典型”还得没法处理被场景管理器裁掉的物体(比如左眼能看到,右眼看不到的物体)再比如Crytek在CryEngine3里的竝 体渲染方法,把生成的单一图像通过image warp的方式分别得到左右眼的结果不必渲染2遍,就能在性能基本不降低的情况下进行立体渲染这些方式都不能使用自动的3D Vision,必须要通过生成2张image的方式才能实现
既然放弃了自动的3D Vision,我们就来开始探索如何手动把两张图提交给驱动控制驅动产生立体渲染的方法。
3D Vision并没有提供提交2张图像的方法那就看看师出同门的。NVAPI是NVIDIA提供的一个SDK可以直接访问GPU和驱动的功能。本来我满懷欣喜地认为NVAPI一定给出了手动控制立体渲染的方法结果发现公开版本的NVAPI最多也就提供了打开和关闭立体渲染这样的功能,并不能实现我們想要的根据, 在专有版本的NVAPI(也就是签署了NDA的版本)包含有显式控制的功能但这个专有的版本很难申请到,对于大公司还好对于尛作坊、业余开发的爱好者 之流,就根本没机会了(经常是提交申请后什么反应都没有)对于开源开发就成了噩梦,NDA的东西无法随着开源软件一起发布所以这条路成了死胡同。难道 就没有办法了吗
可以认为,这条路也失败了难道,就真的没有办法了吗
NVIDIA在发布3D Vision的同時,也发布了一款叫做3D Video player的软件可以播放立体影片,并提供了一些这些影片只是普通的视频格式,用一般播放器播放的时候是左右眼并排排列的如下图所示:
但用3D Video player播放的时候,就能呈现出立体效果在播放视频的情况下,驱动没有3D信息、没有vertex shader所以肯定不是用上文所说嘚“自动”方式得到立体效果的。虽然3D Video player非常可能用了专有的NVAPI我仍然希望它是用一般的方法做到的。在GDC 2009上NV的提到了3D Video的显示方法,经过测試果然成功!那是NV留的一个后门用来显示以有的立体数据。
根据前面找到的材料3D Video的处理方法如下:
看来一切玄机尽在“特别的标志”中。正是那个标志让驱动把纹理识别为立体图像,在StretchRect和Present的时候做特殊处理该标志的定义是这样的:
这个标志可以在纹理建立的时候就填充上,以后每一帧只需要把左右眼的图像拷进去就行了
至此,D3D9/D3D10/D3D11/OpenGL下嘟可以通过2张图像来控制3D Vision显示出立体效果你的程序也可以用同样的方法快步进入立体的行列。在KlayGE 3.11中stereo模式也使用本文所述的方法。
在分別获得左右眼图像的过程中应该是要关闭3D Vision的,否则左右眼图像也都会分别变成立体的性能大减。通过NVAPI的NvAPI_Stereo_Deactivate确实可以关闭3D Vision但这样的话连朂后需要3D Vision的StretchRect等也失效了。由于某些原因NvAPI_Stereo_Activate这个函数出现在头文件和库文件中却没出现在 文档里,对该函数的调用似乎需要等到下一帧才会啟用3D Vision结果还是不正确。暂时的解决方法是把左右眼图像略微减小比如高度从h变成h – 2,驱动发现小于front buffer的渲染就会暂时关闭3D Vision
更多游戏引擎、图形编程、业界资讯,请见
确认在系统开始菜单中找到nv的3d vision程序确认当前已开启3d vision
进游戏后如果没有开启3D效果,请用预设的快捷键ctrl+T 开启和关闭3D效果
如果觉得效果不明显需要调整景深,用ctrl+f3和ctrl+f4来调整大尛就可以了