HaloWars地形技术(HALO WARS: The Terrain of Next-Gen)

http://www.gdcvault.com/play/1277/HALO-WARS-The-Terrain-of

这个是09年的视频,很多技术点还是非常有借鉴意义的,主讲者ColtMcanlis当时在bonfire studio后来到了blizzard也发了一个gdc的presentation(link),不过后来又离职了。


看完video的几个感觉是:

像UE这样的engine只能提供general的技术,针对特定游戏类型(比如halo war这样的rts类的)需要其量身定做的技术才能达到最优的效果,而且这种最优可能有相当大的优势。

                                                                                                                                                                                 

halo war中地形的变化


halo war的开发商之前是做帝国时代的,地形系统也是一脉相承,之前的技术提到的就是很通用的使用mesh来处理cliff的情况。

在halowar里面,bonfire:

  • 大幅度的增加了地形的精度(8x)

  • 使用了vector field来增加地形的变化(可以倾斜)


                                                                                                                                                                                 
内存问题

开始的时候是一个4kx4k的地形,这个对内存的消耗很大:
  • 200mb pos,200mb normal
那么使用wavelet&dxt技术,可以把400mb压缩到32mb,这个很令人惊讶。
然后在gpu上去解压缩,但是效率上有一些问题,使用了7个texture。

进一步的问题解决就不是技术上做的了,而是从设计上摒弃了4k地形的做法,换成1280的地形,那么就可以压缩到14mb,这个就是一个很让人接受的数据和效率了。
这里的数据format是:
  • normal:11,11,10
  • ao,alpha:dxt5

                                                                                                                                                                                 
LOD

这里mcanlis列了几个方案,都是很不错:
  • index buffer sampling,和roam很像,通过改变index buffer的方式,但是这个有pop up
  • RQT:这个前几天还看见intel在说这个,就是irregular的grid:

  • 但是这种方式并不是由于每一个sector要有自己的index buffer,内存上的消耗不能接受
  • 最后使用的xbox360上的tesselation,这个也是效果最好(性能和smooth的lod转换)
                                                                                                                                                                                 
SimInteraction
使用从gpu上capture场景的方式来获得用来simulation的方式,没想到居然和我在项目里的做法一样,:)

                                                                                                                                                                                 
Texturing
这里有介绍一个专业词汇:splatting,就是多层地形混合。
splatting是超级费的一个操作,需要sample大量的texture。

bonfire使用virtual texture来替代splatting,但是这个很普通的使用virtual texture有一个很大不同就是,你不能preload,因为rts是瞬间转换到各个地形部分,而不是fps那样一步步向前走的。
这里bonfire使用的方法就是使用splatting来填充cache(而不是mega texture类的从硬盘读取)。
实现细节上使用xbox360的一些底层函数(比pc上的driver要高效的多)来进行快速cache切换。
而且在gpu上splatting之后,还会做一次compress,就是从rendertarget的rgba8到dxt1,这个也会省去大量的memory cost和渲染时刻的bandwidth消耗。



                                                                                                                                                                                 
TerrainSkirt
这个小技巧很有意思,就是在地图边缘把地形做一个镜像,这样就用同样的内存创造了大得多的地形。
真的是很聪明的idea,好用好实现。

                                                                                                                                                                                 

编辑器

这里mcanlis说他们犯了很二的错误,就是使用c#在pc上实现了一套代码在xbo360上搞了另外一套,不应该如此。

还实现了一个腐蚀系统,来模拟更加真实的一个情况,从实际工作来看,erosion不太可能人工用简单画刷来实现。


                                                                                                                                                                                 

相当有技术含量的一个presentation, I like it!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
切片过程 1)开始切片过程,在Unity编辑器顶部选择地形选项,然后单击“切片地形”选项。一个窗口会出现一些配置信息。 2)拖动您希望分割为“地形切片”字段的地形。或者,如果您在步骤1中单击“切片地形”选项时选择了地形,则该字段中已经出现了地形。 3)输入每个补丁的详细分辨率。优选地,该值应与每个补丁值的基本地形细节分辨率匹配。这些信息不能通过脚本访问,这就是为什么你必须在这里输入它。您可以输入与基础地形设置不同的值,但这将导致细节网格(植物和草地)复制的准确性降低。 4)选择您希望结束的切片维度。2×2仅仅意味着基本地形将沿着X轴2次和Z轴2次分割,以创建4个地形片。64×64未经测试,不建议使用,所以请自行承担风险。 5)设置希望存储地形数据的文件路径。默认情况下,这是资产/ terrainslicing /地形数据。如果您希望暂时在另一个文件夹中创建地形数据,只需在这里输入新路径。如果希望永久更改默认文件夹,请输入新的文件路径,并选择“保存当前文件路径作为默认文件路径”按钮。请确保没有“/”后的文件路径上的文件夹名称(例如,用于文件的默认路径的地形数据后),否则将会出现错误。 6)当单击“创建地形”按钮时,选择是否覆盖现有的地形数据。这是一个安全功能,以确保你不小心覆盖的地形数据,你已经创造了。如果试图在未选中此值时重写数据,则会出现警告消息,告诉您要检查此值,而切片操作将不会开始。 7)单击“创建地形”按钮,等待进度条填充。如果进度条未显示,则在编辑器窗口显示通知错误的通知消息。有时您可能需要检查控制台以获得更详细的信息。最后,确保只在编辑模式下执行切片地形脚本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值