A9VG电玩部落论坛

 找回密码
 注册
搜索
查看: 11325|回复: 34

[技术文档-ZT] Half Life 2 Source 引擎介绍!!

[复制链接]

精华
0
帖子
838
威望
0 点
积分
849 点
种子
5 点
注册时间
2004-11-17
最后登录
2018-11-27
 楼主| 发表于 2006-12-27 15:22  ·  浙江 | 显示全部楼层 |阅读模式
鉴于新闻区讨论XO&PS3技能的战帖较多,为了让大家提高战术水准,特转此帖!


原文:D3DTutorial10_Half-Life2_Shading.pdf


关于什么是Engine(引擎)?

  在Half-Life 完成之后不久,Valve开始筹备他们的下一个主打游戏--Half-Life 2。在商讨游戏引擎的采用问题上,开发小组明白到原版游戏所采用的改良Quake 1引擎对于Half-Life 2来说显得过于破旧,而且在很多的方面都不符合这一代游戏发展的要求。于是,vlave的开发小组决定从美工设计以及游戏代码开始,设计出一个全新的游戏框架,并在其中加入了一套来自havok的定制物理引擎。

  对于一个游戏来说,“引擎”就是一个系统,就像是一辆汽车的发动机一样,他能输入来自加速器的动能,并输出到轮子的转动。软件(在这里为游戏)的引擎实现的东西和汽车的发动机一样,输入来自框架(某些程序或者文件的片段),然后输出程序员们想要的结果。再次拿汽车的发动机为例,一个软件的引擎不能自行运作,他必须依靠另外一个系统,就好像,你只能开着“一台汽车”而非“一台发动机”去上班。在Source中,一个纯粹的引擎只能是一堆代码,完全不具有可玩性。所以不难对引擎下这样的定义:引擎就是一套让游戏元素发生互动关系并将其编译成可玩程序的代码或程式,依靠框架进行操作。


[/ALIGN]
Source引擎总览
  Source并不是一套简单的3D引擎,也可以是说,他并非只是一套渲染器。Source引擎包含了很多不同的模组,程序员可以在引擎的程序包中方便地取出以及添加进其他的元素。

  在这篇文章里面,我将会为大家展示这些模组是什么回事并且对游戏产生怎样的影响。在下面将要陈述的问题主要讲解在Source引擎中一些令人惊奇的模组是怎样对整个游戏的画面以及游戏效果产生影响,而不是去解释Source引擎的代码怎样去运作。对于此,可能大家会觉得比较枯燥,毕竟,这些在程序实现上的问题针对的是对游戏有一定研究的玩家。我们并没有打算深入到Source的程序代码进行研究,因为这些已经不属于我们一般老百姓可以研究的范畴了。在这里必须要给读者澄清一下,由于目前Source引擎的非公开性,我们并不能准确地将Source引擎中每一个模组的特性都准确地表示出来,如果你一定要深入研究的话,请参考Half-Life 2发布之后的 SDK 参考文档以及Valve以后的白皮书。本文的章节细分以笔者对Source引擎的了解为依据。请根据实际情况印证并参考其他专著以及文献。
[LIST]
3D 引擎

渲染器

Pixel 、vertex shaders
光影效果
HDR (High Dynamic Range) [/LIST]
动画以及角色面部表情
几何构成
VGUI游戏界面
物理引擎,基于Havok 定制的物理引擎
[LIST]
刚体的动力学模型以及关节约束机制
弹性机构、绳索机构、布纹处理、车辆系统
水以及火光
粒子系统
怪物/NPC/程序 上的物理学系统 [/LIST]
材质系统
AI 系统


在这里,我尚且用3D engine来描述造Source引擎中,生成引擎输出图像及其几何体的模组。
渲染器
  这部分最能体现显卡的功力也是玩家最为注重的一个重点。渲染器的作用主要主要功能就是采集画面几何体和材质的数据,通过一系列繁杂的过程,生成一个三维的图像。Valve并没有重新创造Source引擎的渲染器而采用了Microsoft DirectX 9.0 的 API,并借助Half-Life SL高阶编程语言编写引擎,在很大程度上节省了宝贵的时间,这归功于 DirectX9良好的硬件兼容性以及先进的代码设计流程。原有的Half-Life 1引擎被设计成支持 OpenGL and Direct3D的双模式,但正如各位所见,这个引擎在Direct3D模式下的渲染十分糟糕,特别是在目前主流的显卡上工作时,其效率以及画质远不及OpenGL模式下的表现。在设计Source引擎的时候,Valve放弃了ogl的渲染模式进而采用DirectX架构,以增强其硬件兼容性以及对未来特效的支持,比如是Shader2.0b甚至是Shader3.0 Model的支持。
Pixel and Vertex shaders
  Shader就是一些能够在GPU/VPU上执行的程序句段。目前市面上流行的游戏中,采用实时渲染的画面均大量运用了Shader,你的显卡无时无刻在处理着这些Shader信息。现代显卡主要的改进就是用Shader代码替代沿用自GeForce GTS时代固定的硬件T&L (Transform and Lighting)。Shader允许程序员创建他们喜欢的Shader特效程序片段以取代有限个数的固化在显卡核心中的预设特效。经过Shader编程之后,如果有一个关于bump mapping的技术推出,程序员只需改写或者加入该部分的Shader代码便能使这些特效运行在现今的显卡上,而不需等待下一代的显卡出现。于是,显卡的处理特性便得以最大程度地延伸。在程序接口方面,由Microsoft推出的HLSL、nVIDIA推出的Cg、以及OpenGL小组推出的GLSL都是编写Shader的工具。能和目前个人PC、工业用电脑上的DirectX以及OpenGL很好地对应。
  Source对directx中的pixel/vertex shaders version 2.0提供了完整的支持,Valve最近的声明指出Source引擎将在未来硬件成熟的时候提供对Shader3.0的支持。目前的Source引擎中,所有的directX 9 Shader均在 (high level shader language)下完成,对代码的运用上只需简单地插入片段,省却了在底层使用汇编语言重编译的麻烦,增加了Source引擎的弹性。在引擎代码方面,所有的代码均用C/C++ using Visual Studio 6.0进行开发,有很大的开放度以及可扩展性,目前已经有数家公司得到Valve授权采用Source引擎进行下一代游戏的开发,除传统的FPS游戏之外,还有aRPG,SPD等模式,相信在明年开初将会见到很多采用Source引擎制作的佳作。
  对于玩家,Shader就能实现依靠驱动程序实现更加多以及更富弹性的特效,在Half-Life 2中最为凸出的Shader2.0特效就是那些吸引眼球的充满反射和折射的水纹效果。在目前推出的基于Source引擎的CS:Source选项设置中单独对水纹效果提供了一个现实效果设置选项。
[/tbl]
[B]光影效果:[/B]
在 Source 引擎中使用了两类的方法处理光影:辐射度光影贴图和环境光立方体贴图。
辐射度光影贴图主要用于静态的大型的物体,比如地形模型。
环境光立方体贴图用于动态 的模型或模型库中可重复调用的模型,比如各种游戏中的人物角色、家具陈设、各种在游戏中可拿起的具有物理特性的物体。 [/LIST]
[B]辐射度光影贴图[/B]
  整个引擎的光影效果实现占据了Source引擎的绝大比重,这里只略略讲述Half-Life 2画面成功的秘诀--辐射度光影贴图。在 Source 引擎的渲染器中,辐射度光影贴图扮演着一个最为重要的角色。先给大家一个辐射度光影贴图所能实现的大概效果:
方向性光照辐射度光照

  在Source以及整个Half-Life 2架构中,光能传递贴图起到的作用就是将光影贴图和法线贴图的优点有机地结合,笼统地说,就是将更加真实精确的光影效果(辐射度光照)以及更加细腻的模型细节(法线贴图)通过算法整合到最后的效果图中。

[/ALIGN]
辐射度法线贴图基本方程[/ALIGN]
  在传统的法线贴图中,每次工作只会累积一个光源的效果,多重漫射光将会由NL在多通道中进行合成,在对Light Map进行辐射度处理的时候只能处理一个颜色值。辐射度法线贴图能在一个通道中实现任意多光线的处理,基本处理方程会转化为每个切面的向量计算。在DirectX中,法线是可以转换的,并不局限于形体,可以扩展到光线、颜色……。在辐射度贴图中,使用下面的方程将法线从法线贴图中转换为上述辐射度法线贴图基本方程:
lightmapColor[0]*dot( bumpBasis[0], normal )+lightmapColor[1]*dot( bumpBasis[1], normal )+lightmapColor[2]*dot( bumpBasis[2], normal )
[/ALIGN][/tbl][/tbl]
  在3D物体创建上,一般都会使用cube map制作镜面反射光线,在Source引擎中,cube map会在引擎的渲染器中预先处理,根据***器的作用,在编辑器中创建的环境会选用最近、最贴切的cube map创***射光线,为解决材质的边界问题,可以手动为某个表面手动添加cube map
  在Hammar这个Half-Life 2地图编辑器中,设计者在材质表面安设了环境探测用的实体以作为镜面反射的参照物。
[/ALIGN]
  接下来将会为大家讲解在Half-Life 2中整个静态环境的生成。首先将会为大家介绍一下我们想得到的效果,并以一个小范围为例说明整个Shader序列的创建过程:
[/ALIGN]
[/tbl]
实现的效果可以用下面的流程图进行说明:[/ALIGN]
[/ALIGN]
  左下脚的Normal法线贴图和三张Lightmap混合后的辐射度贴图再加上漫反射系数的控制就可以创建出以上所说的辐射度法线贴图;再以加法加上传统的表面光滑度以及反射度的贴图结果,就可以生成最终的贴图效果。在Source中创建一个静态的环境时还需要用到三张Lightmap,主要是考虑到为了适应任意光源的作用。在下面的分组图中,大家会看得更加明白:
LightMap #1 LightMap #2 LightMap #3

三张直接辐射能贴图整合之后的效果,由于缺乏了法线贴图的支撑,整体没有细节可言。
由于这个过程处于贴图的预处理程序,需要考虑到整体执行的效率,因此只采用了分辨率较低的lightmaps贴图(因为diffuse材质的irradiance十分平滑的,只需很小的分辨率,渲染结果是通过filter还原),在这一步骤中,渲染的贴图可以说丢失了所有的细节。如果盲目增大lightmaps的分辨率,处理时间会成倍增加,显存带宽也会被大量占据。
因此,Source引擎将lightmaps分成三个成分,每个贴图都有其对应的基本方程,最后根据法线贴图储存的法线进行混合得出第一步的处理结果,在很大程度上利用了低分辨率的好处,并且能将法线贴图所最擅长的细节表达发挥出来。
另一方面,程序设计员可以采用不同的法线贴图与之结合,在debug模式下实时检查渲染结果变得比以前方便得多。[/tbl][/tbl]
接下来,Source会将上面由Lightmaps生成的辐射贴图附上法线贴图,[/ALIGN]
辐射度贴图
法线贴图
被细节化的辐射度贴图

  物体的表面有凹凸的细节,形状方面需要依靠法线贴图实现,至于光线的表现方面,则需要依靠漫反射系数来确定。下面的流程就是继续细化并加上法线贴图的辐射度贴图。[/tbl][/tbl]
辐射度法线贴图漫反射系数
被加上漫反射系数的辐射度法线贴图

同时,考虑物体表面反光程度的镜面反射贴图也在进行之中,第一步也是采用立方体反射贴图和法线贴图的混合:
立方体反射贴图
法线贴图
法线贴图加载到镜面反射贴图上
[/tbl][/tbl]
上一步生成的镜面反射法线贴图镜面反射系数
镜面反射法线贴图和镜面反射系数的混合

最后的步骤,由加上了漫反射系数的辐射度法线贴图和加上了镜面反射系数的镜面反射贴图进行加法运算,得出最后结果[/ALIGN]
加上了漫反射系数的辐射度法线贴图加上了镜面反射系数的镜面反射贴图
最后结果[/ALIGN]

在整个渲染流程中,法线贴图起着引导性作用,ATI目前的顶级产品Radeon X800系列已经完整支持新一代的法线贴图处理方式,并对大材质的贴图采用了全新的3Dc纹理压缩技术。虽然我们目前未收到任何关于Source引擎采用3Dc纹理压缩的消息,但从ATI发布的白皮书来看,X800系列显卡在处理法线贴图的算法技术上会和Valve有更好的沟通,实操效果会占据一定的优势。[/tbl][/tbl]


先帖这些      有人看了再继续,后面的好懂些,前面写的貌似有专业.

骑士

★VALKYRIE☆VAIO★

精华
0
帖子
2306
威望
0 点
积分
2322 点
种子
0 点
注册时间
2006-6-13
最后登录
2010-11-16
发表于 2006-12-27 15:29  ·  宁夏 | 显示全部楼层
不错 楼主真厉害啊 技术归技术 可以不懂

骑士

蛋疼超人

精华
0
帖子
2064
威望
0 点
积分
2036 点
种子
0 点
注册时间
2006-7-29
最后登录
2013-12-27
发表于 2006-12-27 15:31  ·  北京 | 显示全部楼层
其实a9没什么战机能的,战市场,战销量的比较多。。

lu那边战机能的比较多。

征服者

~无双啊无双~

精华
0
帖子
5350
威望
0 点
积分
5663 点
种子
0 点
注册时间
2005-8-15
最后登录
2018-5-21
发表于 2006-12-27 15:33  ·  福建 | 显示全部楼层
是转的?好多[tbl]········

骑士

军事类游戏爱好者

精华
0
帖子
1678
威望
0 点
积分
1738 点
种子
0 点
注册时间
2004-8-28
最后登录
2012-6-30
发表于 2006-12-27 15:39  ·  河南 | 显示全部楼层
技术贴...需要慢慢消化.....

精华
0
帖子
1932
威望
0 点
积分
1952 点
种子
0 点
注册时间
2006-1-23
最后登录
2018-4-28
发表于 2006-12-27 16:44  ·  上海 | 显示全部楼层
非常不错.欧美厂商做游戏偏重技术和技能特效应用,日系厂商偏重美术应用比较写实,个有各的特色,但是论技术上来讲欧美厂商的确已经领先日系厂商不少了.

精华
0
帖子
5895
威望
0 点
积分
5768 点
种子
0 点
注册时间
2006-1-14
最后登录
2018-9-29
发表于 2006-12-27 16:46  ·  浙江 | 显示全部楼层
A9好像没有硬件天师~~~~~~~~~
不过我一直在想AMD64和X1900到底是不是真达人

骑士

蛋疼超人

精华
0
帖子
2064
威望
0 点
积分
2036 点
种子
0 点
注册时间
2006-7-29
最后登录
2013-12-27
发表于 2006-12-27 16:48  ·  北京 | 显示全部楼层
下面是引用dogsoldier于2006-12-27 16:46发表的:
A9好像没有硬件天师~~~~~~~~~
不过我一直在想AMD64和X1900到底是不是真达人
我觉得是pcinlife的Pro-A在lu的化身。

精华
0
帖子
238
威望
0 点
积分
251 点
种子
0 点
注册时间
2006-8-13
最后登录
2007-1-5
发表于 2006-12-27 17:02  ·  黑龙江 | 显示全部楼层
唔唔,液内流行风后开始刮的便是技术风了么。。。。这是好事啊~

精华
0
帖子
5895
威望
0 点
积分
5768 点
种子
0 点
注册时间
2006-1-14
最后登录
2018-9-29
发表于 2006-12-27 17:11  ·  浙江 | 显示全部楼层
下面是引用lixianglover于2006-12-27 16:48发表的:

我觉得是pcinlife的Pro-A在lu的化身。
x1900应该是EG的棒槌
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|A9VG电玩部落 川公网安备 51019002005286号

GMT+8, 2025-1-25 21:36 , Processed in 0.194857 second(s), 17 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部