posts - 94, comments - 250, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

《星际争霸2》引擎技术解析

Posted on 2008-09-02 17:25 Condor 阅读(3016) 评论(8)  编辑 收藏 引用

就在SIGGRAPH大会刚结束之后,AMD和暴雪在AMD官方网站上放出了《星际争霸II》的官方技术文档,通过游戏引擎技术的展示让星际迷们感受到越来越多的惊喜。

画面优化给CPU带来考验
着色方面,在使用原型的基础上利用3D Studio MAX让程序员对整体效果做最大的优化,反复的提炼使得整个作品就像被艺术家精心雕琢一样,配合上8000个独特的、不重复的线性着色渲染代码,使得Starcraft II与早期的游戏代码相比增加了N倍。

        在游戏制作初期,暴雪就认识到GPU的强大性能,因此在设计的时候就采用了以GPU为主的优化和大幅度图像质量增加。

        由于使用大量像素渲染操作,如果在游戏中当你选择了控制成百上千的zerglings或者marines等作战单位集体行动,势必造成CPU超负荷,即便是强大的GPU这也是一个考验。
大量的视觉特效(Based Effects)
        包括FP16 HDR、光线散射/反射效果(Diffuse and specular for lighting)、景深效果(depth of field)、体积雾(fog volumes)、动态环境遮蔽(dynamic ambient occlusion)、智能贴图置换(smart displacement)等等,这些都是Starcraft II的“BT”之处。

        然而,作为一个即时战略游戏,暴雪依然在“故事情节”的设定上下足了功夫,在游戏引擎的影响下,延迟缓冲器的深度和平均值,包括着色组建都完全为了效果而服务。而照明管道和阴影的利用也让深景效果等一些特效表现得淋漓尽致。不过,这些特效都还在讨论中。
在早期的开发过程中,图形引擎也作为一个重点中的重点进行设计:
可扩展性第一
        对于游戏引擎来说,一个主要的设计目标是扩展的引擎。暴雪的游戏质量是人所共知的,不光是他们的能力,更重要的是经验,从以前的一系列游戏开发经验来说,整个游戏各种族之间能力的平衡问题非常重要,而且图像效果之间的兼容性也必须考虑到,这样也是为了各种不同平台硬件之间搭配的玩家都能体验这个游戏的魅力所在,以确保游戏有足够的竞争力,因而从ATI Radeon 9800/NVIDIA GeForce FXs系列到ATI Radeon HD 4800s和NVIDIA GeForce G200s都可以轻松的进行游戏。
        相比之下,GPU的负载才是重点,像素着色单元往往会因为大量的单位同时出现而使得GPU难以承受,顶点着色单元的运用也必须合理,而先进的GPU才能体验到最大限度的特效,而对于普通的GPU只能尽量减少使用率来保证游戏的流畅度。
一个引擎,两个“世界”(Dual Nature of the Engine)

        这个双重性质的引擎使得整个游戏有更完美的体验,其实就是说SC2具有两个视角模式,一个是普通的RTS视角、一个是单人模式的RPG视角,当然在这两个模式下呈现的画面效果是有所不同的。具备两个视觉模式的原因正是我们之前提到的故事模式,当切换到单人模式的RPG视角时,玩家将会体验到暴雪对于整个游戏设定的精妙之处,通过一系列互动,包括对话等手段,其实从某种感觉上来说更像是第一人称射击游戏(FPS)。
    暴雪还将对这些不同的设定做更为细致的讨论,这样才能让玩家体验到不同的技术效果的运用。
屏幕基础效果
        作为Starcraft II的另一个设计目标,照明环境模式让游戏的互动更多,之前在魔兽争霸三中,每个单位有一个硬性限制,有多少亮度,可能会影响它在任何特定时间。出于这个原因,使用动态照明是相当微不足道的,但是在Starcraft II中每个单位有一个照明设备,当其中一个开启之后其他也会开启,这样效果非常好,但是由此带来的地图的设计和绘制,包括地图地形切片就成了相当复杂的问题。而即便是解决了这些,给GPU带来的负荷也是巨大的。
        针对于此,暴雪也做了很多限定 :
        ◆ 颜色组成部分,并不受当地照明,如发射、环境地图和点燃前期的彩色组成部分;
        ◆ 深度;
        ◆ 每像素正常;
        ◆ 如果使用静止环境闭塞,出口的环境闭塞的纹理被忽略,如果屏幕空间环境闭塞启用;
        ◆ 亮灯的弥漫物质的颜色;
        ◆ 亮灯的镜面材料的颜色。

解码缓冲器
        所有的缓冲器应该都使用相同的深度,不幸的是似乎这些缓冲器远远不能满足暴雪的需要,这些缓冲器以24字节每像素推动输出带宽,这样使得整个带宽明显不足,因此在安置光源的时候必须牺牲一些。
        为了向MRTs提供每像素值以保证用于各种的效果,因而以下必不可少:
        ◆ 深度值为照明、雾卷、动态环境闭塞和智能景深,预测,边缘检测和厚度测量;
        ◆ 平均值为动态环境闭塞;
        ◆ 弥漫性及镜面照明。
延迟渲染
        在Starcraft II中延迟渲染只适用与当前的渲染,包括灯光的点和散射出去的面都要再渲染,但是由于游戏中会出现很多的照明设备,如果都使用这样的方法渲染的话一定会造成画面过于缓慢,因此延迟缓冲器的出现也解决了这一难题。在延迟渲染和着色方程式的帮助下计算机能很快的绘制出不同形式或者更为复杂的光源,这样也为其他的计算提供了一个后处理的过程。
像素坐标重建

        受益于早期的样板,暴雪在设计新的形状和色彩的时候轻松了不少,而且同时还释放了CPU。

        相机原理我们都知道了,就通过这样的模式使得暴雪在视觉上更了解该如何设计。

屏幕空间环境光遮蔽
        屏幕空间环境光遮蔽(Space Ambient Occlusion,简称SSAO)。如果对这个名词感到陌生,那提及到让大家记忆犹深的《Crysis》逼真的光照效果时,一切就很简单了,这就是SSAO技术的独到之处。
        暴雪在这使用这方案的时候考虑到了整个空间的效果和质感,也许从某写方面上来看,没这个必要,但是基于暴雪的理念,一点点瑕疵都是不被允许的。

        在任何可见的点和表面在屏幕上,采取多个样本(8至32),这些样本,表现了在三维空间中从目前的点计算,到预计回屏幕空间所需的时间和深度。

        现在的目的是检查是否深入采样点,如果接近这个更远的采样点本身能获取信息的话就这么做下去,这是一个函数问题,因此需要复杂的计算。


        不过在对地图的计算时不会采用这样的方法,这仅仅是为了形成一个空间的效果而已。
模糊效果

        前面的一切都是为了更加细致的描绘出所有的场景,但是,有时候游戏还是需要一些模糊的图形图像,如果一直使用SSAO技术的话,必然导致不真实。
        对于SSAO来说,虽然是一种优势,但是高智能的判断在这时也显得尤为重要,何时需要高精度的细致图像,何时需要动态模糊效果,无论是着色还是渲染都需要大量的资源的计算才能显现这些复杂的效果。
自我闭塞

        这也是一个相当复杂的效果,就像一个围绕着一个半球体产生偏移向量,这一点上在屏幕上(这意味着需要使用大量的延迟缓冲器),由一个矩阵转化每个偏移向量和正常向量来抵销矢量。
边缘处理
        偏移向量在空间中并不像在屏幕空间中一样,由于镜头的不断移动使得SSAO不断变化,这样就需要在移动的过程中对镜头的边缘进行处理,以保证完美的视觉效果,但是纹处理包装上并不是一件简单的事。
SSAO的表现
        SSAO提供的效果是让人相当满意的,视觉图像质量的处理近乎完美,但是成本过高,而且大量使用还是会造成系统性能瓶颈,这样得不偿失,因此合理的使用这个技术也是讨论的问题之一。
SSAO和整体光线效果
        从图中很明显的发现了SSAO的精妙之处,如此逼真的效果让人赞叹不已,其实更多的还是其后面的技术支撑。



    我们可以把一切制约因素一起使用以下过程表示:
        ◆为每个像素在源的形象和存储执行一个全屏幕通过计算混乱循环结果,在Alpha通道的每边缩减一个CoC图像缓冲区的四分之一大小;
        ◆产生中等模糊图像通过应用的RGB高斯模糊与每个样本对源图像加权CoC;
        ◆产生的最大模糊图像只有缩小的RGB的图像缓冲区源图像的四分之一,每一个CoC和大型模糊缓冲器可以同时使用不同的通道;
        ◆最高模糊图像与RGB样本加权由缩减CoC执行,Alpha通道中载有CoC,也有模糊,但其样本不加权本身;
        ◆缩小和模糊一张深度地图成为一个缩减深度图像,重用深入SSAO缩减(SSAO不模糊深度 );
        ◆然后开始最后的景深着色,有一定的形象来源,中等和大型模糊、模糊CoC的形象,非模糊深入地图和缩减深入形象的渲染。



        景深渲染包括:
        ◇计算小模糊价值,直接使用小样本着色四近邻像素;
        ◇计算CoC的像素(缩减CoC将不匹配);
        ◇样本非模糊,使用模糊的深入比较——计算机CoC,如果是模糊的深入,比非模糊的深入更远,否则使用CoC价值样本,模糊CoC的形象;
        ◇计算贡献,从每一个可能的模糊图象,计算小模糊的颜色,中型和大型的图像模糊的基础上,CoC的因素;
        ◇小型,中型和大型模糊;
        ◇输出Alpha包括的源(无模糊)形象。
处理透明物体渲染
        透明度是一个值得深入研究的问题,当涉及到开发时暴雪的董事会认为延迟渲染技术不支持透明度的话就应该在其他地方加上这个功能,而事实证明这是一个正确的选择。
        作为是典型的就是延迟绘制技术,透明度的问题还设计到树荫等一系列问题,因此必须选择一些有代表性的物体来标记之后再做探讨。光线的问题在透明度的谈论中再一次被提及,因为这是个相辅相成的东西,因此暴雪在制作这一切的时候都努力的寻找解决方案。
半透明阴影(Translucent Shadows)
        这种技术能令烟雾、爆炸也能投射出阴影效果。

        早期在建模的时候影子系统都是成功地利用屏幕空间信息解决跟踪问题,否则将会困难很多,但这次暴雪将显示如何延长阴影地图的每像素信息与一些额外的信息通道,可以用来容易的充实阴影,地图上实现半透明的阴影支持。
        阴影地图算法是延长与第二地图的阴影信息形成半透明的阴影,大部分地图的影子仍然会包含不透明信息的阴影,此外还需要做到在颜色的缓冲区发现颜色半透明的阴影。不过,这一切都需要硬件的支持,如果硬件不支持将会有一个空的颜色,因此在考虑到深景等特效的时候暴雪依然在处理阴影效果。
        首先是清理,以白色调和,然后填补渲染透明物体的阴影,就这样形成一个透明的阴影色彩缓冲区,再加上测试,处理这些透明光过滤器,最后形成需要的效果。
光过滤处理器

总结:
        从上面简短的一份官方技术文档(因为AMD只放出这一部分),我们已经可以了解到暴雪在SC2这个游戏上所付出的努力和贡献了,其效果之华丽恐怕也是惊人的。作为暴雪十多年磨一剑的大作,《星际争霸II》可是包含了现在最尖端的技术和效果,无论是暴雪的质量还是技术相信都是世界顶级的水平,这样的游戏公司确实在为自己的的作品留芳百世而努力!不过,至于还要等多久,至今仍是一个谜。

Feedback

# re: 《星际争霸2》引擎技术解析  回复  更多评论   

2008-09-02 18:12 by adcx
这份文档你全部都翻译了,还是只是一部分?

# re: 《星际争霸2》引擎技术解析  回复  更多评论   

2008-09-02 18:15 by 空明流转
完全没看懂。我是菜鸟。

# re: 《星际争霸2》引擎技术解析  回复  更多评论   

2008-09-02 19:43 by YauzZ
科普不错 学过图形学看懂一些

# re: 《星际争霸2》引擎技术解析  回复  更多评论   

2008-09-02 21:47 by ixnehc
翻译的不太好,有原文的链接吗?

# re: 《星际争霸2》引擎技术解析  回复  更多评论   

2008-09-03 00:09 by 尘埃
http://ati.amd.com/developer/techreports.html

# re: 《星际争霸2》引擎技术解析[未登录]  回复  更多评论   

2008-09-03 09:36 by raof01
对图形学没概念。飘过

# re: 《星际争霸2》引擎技术解析  回复  更多评论   

2008-09-03 18:49 by 海边沫沫
牛X

# re: 《星际争霸2》引擎技术解析[未登录]  回复  更多评论   

2008-10-11 09:17 by condor
@adcx
应该是原文的一部分。

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理