做图形程序已经很多年了,积累了一些经验。
来这个论坛也有好几年了,遇到问题的时候,也会在这里发帖子问,也很感谢大家的回答与帮助,希望能多认识一些朋友,大家多交流、分享。
做这款项目也有蛮多年了,终于上线了,端游,整整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合并渲染等小功能、小系统就不一一列出了。
 

【转】3D图形引擎(DX9): FX的更多相关文章

  1. 3D图形引擎决定三维产业差异化

    从2009年中国3D产业初步兴起开始,短短几年间中国的3D技术得到了飞速的发展,3D打印机.3D投影仪.Web3D.虚拟现实.场景漫游等等产业应用应运而生,设备制造商和内容提供商都开始发挥自主创新的优 ...

  2. 3d引擎列表

    免费引擎 Agar - 一个高级图形应用程序框架,用于2D和3D游戏. Allegro library - 基于 C/C++ 的游戏引擎,支持图形,声音,输入,游戏时钟,浮点,压缩文件以及GUI. A ...

  3. Java 3D游戏引擎——JME(java Monkey Engine)

    转自:http://bbs.gameres.com/forum.php?mod=viewthread&tid=180732 JME(java Monkey Engine),一个非常棒的Java ...

  4. HTML5拓扑3D机房,电力工控Web SCADA

    http://www.hightopo.com/cn-index.html 一套丰富的JavaScript界面类库, 提供完整的基于HTML5图形界面组件库.使用HT for Web您可以轻松构建现代 ...

  5. 安卓3d引擎

    很 多初学Android游戏开发 href="http://edu.gamfe.com/gamedev.html">游戏开发的朋友,往往会显得有些无所适从.他们经常不知道该从 ...

  6. 3D图形处理库

    转自 3D图形处理库 高性能软件光栅化渲染器 OpenSWR OpenSWR —— 用于OpenGL的高性能,高度可扩展的软件光栅化渲染器 OpenSWR的目的是提供一个高性能,高度可扩展的OpenG ...

  7. 三星核S5PV210AH-A0 SAMSUNG

    三星S5PV210AH-A0 S5PV210又名“蜂鸟”(Hummingbird),是三星推出的一款适用于智能手机和平板电脑等多媒体设备的应用处理器,S5PV210和S5PC110功能一样,110小封 ...

  8. 八款常见的Android游戏引擎

    原文地址:http://bbs.csdn.net/topics/380203732 1.Angle  Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGL  ...

  9. 值得推荐的C/C++框架和库

    值得推荐的C/C++框架和库 [本文系外部转贴,原文地址:http://coolshell.info/c/c++/2014/12/13/c-open-project.htm]留作存档 下次造轮子前先看 ...

随机推荐

  1. JavaScript能做的事 是不是jQuery都能做>?

    比如修改表单中的action 并实现跳转  问题是此时没有点击表单中的submit 提交按钮?

  2. PostgreSQL内存配置记录

    PostgreSQL内存配置,参考了其他人的总结,再加上自己的一些体会,做个记录. postgresql的内存分配主要由shared_buffers.temp_buffers.work_mem.mai ...

  3. UltraEdit编码设置

    1.查看ue文件编码 一直苦于无法判断文件的编码类型,现在发现一个方法,就是用强大的UltraEdit-32软件: UltraEdit-32的状态栏可以显示文件的编码类型,详细情况如下: ANSCI- ...

  4. Zookeeper在Dubbo中的作用及Zk集群的选举原理

    转自 : https://blog.csdn.net/zh15732621679/article/details/80723358

  5. Linux 下新增用户的流程

    一: 新增用户 1.添加新的用户账号使用useradd命令,其语法如下: 代码:useradd 选项 用户名其中各选项含义如下: 代码:-c comment 指定一段注释性描述.-d 目录 指定用户主 ...

  6. boost 部分编译

    完整编译boost库需要很长时间,而且我们不一定会用到所有的库. 那么如何只编译只需要的库呢? 解压boost源码,进入解压后的目录 ./bootstrap.sh生成bjam ./bjam --bui ...

  7. bzoj 5369 最大前缀和

    Written with StackEdit. Description 小\(C\)是一个算法竞赛爱好者,有一天小\(C\)遇到了一个非常难的问题:求一个序列的最大子段和. 但是小\(C\)并不会做这 ...

  8. LeetCode Split Array into Consecutive Subsequences

    原题链接在这里:https://leetcode.com/problems/split-array-into-consecutive-subsequences/description/ 题目: You ...

  9. 记一次愚蠢的gradle操作

    今晚把工作移植到mac平台,在用gradle命令 exec ./gradlew --parallel --info assembleDebug 打包apk时卡住,gradle一直处于下载状态,过了几分 ...

  10. Oracle恢复drop误删除的表和建用户操作

    一.表的恢复 对误删的表,只要没有使用PURGE永久删除选项,那么从flash back区恢复回来希望是挺大的.一般步骤有: 1.从flash back里查询被删除的表 select * from r ...