【转】3D图形引擎(DX9): FX

做图形程序已经很多年了,积累了一些经验。
来这个论坛也有好几年了,遇到问题的时候,也会在这里发帖子问,也很感谢大家的回答与帮助,希望能多认识一些朋友,大家多交流、分享。
做这款项目也有蛮多年了,终于上线了,端游,整整6年的时间耗费在这上面,身心疲惫,不过总算是有收获,上线了,也算给了自己一个交代。这款项目,图形这块花了大概3年多,后面2年多基本就是在做管理了,顺便改改Bug,增加一些美术提的小需求。这个文档去年就整理了,但是游戏没上线,没有经过验证,也是没有心思来处理这事,就放下了。今年产品上线了,7月台湾版本也要上了,今天在公司整理资源时,发现了这篇文档,也就来这里发一下帖子。
以下是引擎的相关技术文档:


 

写在前面:图形引擎技术是为游戏服务的,所以它的宗旨是:在目前主流硬件的基础上做与之相应的功能。所有技术都应该考虑效率,如果在效果与效率两者之间选择,那么我的选择是:效率。
经过几年的技术积累,工具非常齐全,包括场景编辑器,技能编辑器,关卡编辑器,剧情编辑器等,这些编辑器都应该属于图形引擎。寻路系统集成了Google的recast导航网格,物理碰撞系统集成了intel的havok物理引擎。在需要的时候,可以再增加很多的功能,让画面更好,让功能更强。因为美术成本的问题,放弃了NormalMap。


1,DeferredShading,支持无限多盏灯光,在游戏场景中最多时会有几百盏实时点光源存在,且角色、怪物本身或者法术都可能带有实时的点光源。如下图,每一个蓝色线框球都是一盏点光源。

2,无缝LOD地形技术,根据视点远近以及地形起伏坡度判定网格细密程度,在避免画面突变的情况下,尽量减少三角面的数量。并且在整个地形设计时采用贴图与地块分离技术,即地块的贴图数量和地块本身无关,而是与其贴图格相关,这样能让地块使用无限贴图,让美术能制作更加多样化的地形。

3,真实水体、海洋。倒影、水波、水体边缘、泡沫、阳光反射等构成了我们真实的水体。也能很方便的制作真实的河流,即把已经制作好的场景导回3dmax中,然后根据其河床,按照规范制作河流模型,再导出给场景编辑器使用,则可制作出有流向的河流。

4,PSSM,把整个视锥分割成几个部分,最后整合成一个屏幕级别的阴影图,再贴回场景。在此基础上,还做了几个变种,比如根据视距让阴影生成变频;对物件分类,增加大阴影图等,以提升效率。【并且对于点光源,也能使其产生能够有阴影的错觉,这样能方便做室内场景】
 


 


5,SSAO,根据屏幕空间的Normal以及Depth图,生成一张遮蔽图,再贴回场景,让场景立体感更强。并且在真实场景中做到了,在移动中肉眼很难感知遮蔽抖动的问题。


 


6,体积光,太阳光或者强光源通过一些物件的遮罩,出现类似光线的效果。


 


7,Edge-FXAA,关于抗锯齿,我们采用的是快速边缘抗锯齿的方法,FXAA是Nvidia主推的一种基于图像的抗锯齿的方法,在此基础上我们做了改进,不仅性能得到大幅提升,并且避免了其造成画面模糊的不好现象。


  


8,滤镜,让画面变得更清晰,参照CryEngine的类似效果。在游戏中一对比就会有很明显的感觉,下左图是原始画面,下右图是通过滤镜后的画面。


 


9,HDR,提升画质,下左图为关闭HDR,下右图为开启HDR的效果。


 


10,植被系统,我们有专门的植被系统,用于大规模铺设地面的植被,给予场景丰满的感受,且分等级让植被显示,适应于不同机器。当玩家在植被中走过时,植被会被玩家推向两边,造成动态植被的感觉。


 


11,OcclusionCulling,遮挡剪裁,对于大规模场景来说,需要用遮挡剪裁来大幅提升性能。如下图,把场景分成很多遮挡块(紫色线框),当一个遮挡块被场景挡住时,则整个遮挡块都不会被渲染,甚至更新,这样能极大提升性能。而这个功能是完全对美术屏蔽的,是引擎内部自动根据美术刷出的场景,以及摆放的物体的绑定盒而自动生成的。而对于角色、怪物来说,我们也给予其一个与之匹配的AABB,让它参加遮挡剪裁过程,如果当前帧不在视野内,它不会参与更新和渲染,这样也能极大的提升性能。


 


12,寻路系统。无缝3D地形的寻路是一个非常麻烦的事情,我们采用了路点+Recast的方式来做,使用Recast生成很多单独的导航网格,用路点把这些导航网格连接起来,这样就可以在无缝地形上进行寻路。如下图,红色线连接白色路点,这是路点的连通关系;绿色线框是地块,它会生成导航网格,最终这些红色连通路点线以及导航网格构成了我们的寻路系统。


 


13,碰撞系统。我们的碰撞系统采用Intel的havok物理系统,通过对Intel的havok以及Nvidia的Physx两个物理系统的评估后,Intel的havok是最适合做无缝地形的物理碰撞系统。在大规模物件的场景中,特别是主城中,如果采用老的碰撞box来堆积,对美术来说,这是噩梦,所以为了方便美术制作场景,以及性能上能满足我们需求,采用havok是很好的选择。美术可以直接对物体做简模,和物体一起放到场景中,并不需要其他额外的操作,引擎会自动识别且生成碰撞数据,提供给客户端使用。


 


14,区域系统。为了方便策划编辑区域,定义一些玩法,我们增加了区域系统。在场景我们给予黄色线构成的未填充的方格来确定区域,蓝色填充方格的地方为当前使用的区域。策划可以给予这样的区域以属性。


 


15,三维高度数据系统【服务器使用】。红色、绿色、蓝色等线框分别代表不同的层级,最终会生成一组组的数据提供给服务器使用,使之可以简单的判定高度层级、阻挡以及做一些逻辑处理。


 


16,角色Avartar系统,整个角色的身体,除去头发以及肩膀外,都合并成一个部件,且在贴图上采用了我们独特的方法,在贴图尽量小的基础上,让整个画质更好。如下图角色,整个角色的贴图只有一张512*512的Base图,以及与之配套的Specular图,并且还有优化空间,比如Specular图可以减少为256或者128。如下图,虽然才512的贴图,但是实际精度并不差。
 
17,角色动作系统,我们做了3dmax导出插件,使之与引擎匹配识别Bip骨骼,把角色分为上下半身,让整个角色可以做到完美的上下半身分离,在动作合并的时候,让玩家可以在移动中战斗。


18,航拍,能够把整个地形按照地块拍照,且能生成大地图,提供给美术以及客户端使用。


 


19,整体场景物件的两套坐标系系统,因为无缝地形太大,所以坐标会很大,如果用很大的坐标浮点数去shader里面计算顶点位置,可能会造成角色蒙皮的抖动、阴影的抖动等,所以我们采用了双坐标系系统,即:实际world坐标提供给客户段使用,而渲染坐标系的零点根据摄像机world坐标在移动,让渲染坐标系下的参与计算的顶点坐标数据尽量小。


其他,还有很多其他的功能,细节等,比如:DOF、倒影优化、触发器、物件链接、地形高度图使用、shader合并渲染等小功能、小系统就不一一列出了。
 
posted @ 2018-02-22 12:32  时空观察者9号  阅读(782)  评论(0编辑  收藏  举报