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

    作业一:1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) [root@bogon test]# cat /etc/passwd /etc/group > /1. ...

  2. canvas - 柱子效果

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  3. [置顶] Android 关于BottomDialogSheet 与Layout擦出爱的火花?

    今天上班做那个类似于ios拍照的那种效果图 就是个垂直布局然后里面textview+分割线+textview+button 当然也可以用button+分割线+button 方法有很多,选择适合自己的就 ...

  4. OpenCV 视频与图片序列相互转换

    我们在计算机视觉相关的实验中都需要视频与图片序列之间相互转换,在平时的实验中,经常需要将视频保存为一帧一帧的图片,以获取实验结果:另一方面,很多标准的算法测试数据库都是图片序列(文件名以帧号+图片扩展 ...

  5. Java进阶面试问题列表

    面向对象编程的基本理念与核心设计思想 解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling). 继承(Inheritanc ...

  6. 通过ssh限制ip访问

    方法:在/etc/hosts.allow中加入允许的ip,并禁止其他ip sshd:192.168.1.22:allow sshd:ALL:deny 不需要修改/etc/hosts.deny

  7. rhel7+apache+c cgi+动态域名实现web访问

    1. 申请动态域名/安装no-ip客户端 https://blog.csdn.net/lee244868149/article/details/44095835 2. yum安装httpd 两种方法安 ...

  8. Java Web 高性能开发,前端的高性能

    Java Web 高性能开发,第 2 部分: 前端的高性能 Web 发展的速度让许多人叹为观止,层出不穷的组件.技术,只需要合理的组合.恰当的设置,就可以让 Web 程序性能不断飞跃.Web 的思想是 ...

  9. 剑指offer-第五章优化时间和空间效率(把数组排列成最小的数)

    题目:输入一个正整数数组,将所有的数,排列起来,组成一个最小的数.

  10. 脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明

    常规建表语句: CREATE TABLE `test_table` ( `id` int(11) NOT NULL, `name` char(64) NOT NULL, `password` char ...