wing of prey 座舱视角渲染方式调查
为了实现一个能够显示飞行员的座舱视角,调查了pix了模拟空战游戏wing of prey,以下是这次的调查记录。
首先通过pix进入游戏(需管理员身份开启),在option中开启座舱视角,按F12记录当前帧的渲染信息,退出游戏后,可以在pix的窗口中看到刚刚截取的一帧的详细渲染信息。
测试一:座舱视角是由几个camera完成的
由于每次准备camera时候,都会设置camera的投影矩阵,所以这里通过搜索以下字符串,来确定座舱视角是由几个摄像机完成的。
```IDirect3DDevice9::SetTransform(D3DTS_PROJECTION```
通过搜索结果、以及对应的渲染画面发现,在所截取的一帧中,为camera设置了两次D3DTS_PROJECTION,而两次的画面,也正式分别渲染座舱,和座舱外世界。因此在WOP中的座舱视角,是由两个相机共同完成的,暂且称两个camera分别为:“近相机”、“远相机”。其中,近相机负责渲染机舱以及机舱内设备,远相机负责渲染除此之外的其他物体。
测试二:近相机的far clip是多少,远相机的near clip是多少。
当飞机降落在地面上时,在游戏中调整camera朝向地面,按下F12截取这一帧的渲染信息,进行分析。
再次通过查找```IDirect3DDevice9::SetTransform(D3DTS_PROJECTION```可以找到设置camera投影矩阵的地方,通过该方法的第二个参数所传递的投影矩阵,可以算出两个相机的clip各是多少,然而这里得到的是一个内存地址,暂时没有找到矩阵本身信息。
测试三:muzzle flash由哪个相机负责渲染。
在飞机开枪时,按下F12,截取出一帧带有muzzle flash的渲染信息,进行分析。
通过搜索```IDirect3DDevice9::SetTransform(D3DTS_PROJECTION```,能够选定远相机和近相机分别渲染了什么,最终发现,muzzle flash是和机舱是同一个相机渲染出来的。
远相机是否渲染了muzzle flash不确定,即使渲了也可能因为其near clip比muzzle flash位置远而也被剔除掉。
测试四:导弹是由哪个camera渲染的
进入游戏中的座舱视角,发射一枚导弹后按F12截取当前帧的渲染信息。
方法同上,最终发现,导弹和地形是由同一个camera渲染的。
这里猜测,由于远相机的near clip设置的值很合适,所以没有出现这些粒子被cull的问题。
测试五:翼尖尾流特效是由哪个camera负责渲染的
方法同上,不再赘述,如图所示,是用远相机进行渲染的。
最终方案
通过以上的测试,以及根据项目本身情况的分析,最终确定的方案如下图:
posted on 2015-06-14 22:46 MobileFish 阅读(291) 评论(0) 编辑 收藏 举报