开发近况 - 行星引擎,第六部分(发表于-2007年8月17日)

感谢Sorma的翻译!

光环、小行星带

参考前文

我到法国去休了一周的假,这期间暂停了正常的开发。不过我稍花了一点时间,为新的SDD多写了几章。

法国之行以前几天,和回来以后几天,我还在写小行星带的程序。我在光环周围加了一些星尘,如此一来人工的痕迹不那么明显了。不过,多数时间还是花在界面设计、渲染gas giants的能力(前回发布的gas gaint只是原型而已——大概很多人不知道,仅仅完成原型的话,整个设计才完成不到一半,模型是需要同图像引擎和游戏结合的。)、GLSL大气层图像、新换的带有帮助功能的GLSL资料库,等等。

Vista系统上的FBO

我还花了几天时间,用来解决Windows Vista下渲染framebuffer图像时速度变慢的神秘现象。Render-to-texture(直接渲染为图形)技术在任何主流引擎中都有大量应用,所以当发现overhead文件是Vista本身生成的时候,我真吓了一跳。这个overhead太大了,想要进行Render-to-texture简直是做梦。打个比方,渲染几个64x64的图形,用8800GTX显卡,在XP下FPS可以达到900;在Vista下同样显卡,FPS仅有80。有一张这么好(也这么贵)的显卡真是棒啊,表现比8800GTS在XP下好了足足十一倍!

我已经联系了NVidia,他们了解了问题,现正在调查中。

地形引擎

前两个星期,我的工作多集中在新的地形引擎上(当然,还有界面——界面是极为重要的东西,但是截图中还无法显示。)

我彻底重写了内核来改进程序工作,减少噪声。原先一切都放在一个源文件里,里头有巨多的宏和ifdef,用来开启、关闭各种测试(例如数月前的手记里提到的"难清除噪声")。我当时觉得也差不多是时候重写一遍了。所有的噪声都可通过一个"CPerlinNoise class"用到了,从前不规则的类(class)( CFractalNoise, CMultifractalNoise, CRidgedMultifractalNoise )会导致更复杂的问题,并且每个类(class)都有自己的一种callback( 单纯噪声、高级噪声、难清除噪声 )和自己的参数。现在我还只有3D噪声的函数,所以还要找点时间来重新用包装让2D和3D噪声生效,不过这些噪声眼下都还用不到,所以也不太急。

高度(Heightfield)的生成

先前版本的地形引擎中,用来给每个地形块生成高度(Heightfield)的是如下的系统:

  • 从行星立方体的每个面,各生成一张总体高度图。每个面生成的一般是1024x1024的高度图。
  • 生成顶点的时候,高度首先要从高度图中查到。深度等级加大(也即离地面更近)时,高度图的分辨率就不够了。此时,“菱形-方形算法”就可用来生成不足的高度。

好处就在于,菱形到方形的处理过程真是奇快。

坏处就在于,它生成的地形似乎总是非常均匀。换言之,不管在行星上如何穿梭,你看到的地形总是一个样子,一样的小丘,一样的山脉,总之远近高低都相同。总之,这就导致全球高度图下的一切不断重复,无聊得很。

我想尽办法来让地形变得多样化一点,但是,到写出旧版的地形引擎为止,我还只成功了一半。最主要的问题就在于菱形-方形除了频率(决定地形尖锐度),没有多少参数。所以虽然我可以根据星星的经纬度调整其频率,但是一直无法创造出“有趣”的地形来。

用了前段时间我一直努力写出的新地形引擎,我正在处理可自己调节能重定义地形函数的class,最多的是在Ridged Perlin 噪声(隆起花边噪声?)基础上的那个。Ridged Perlin 噪声最有趣的地方就是,它能生成远近高低各不同的地形(星球各处的景色不再是一样的了)和连绵不绝数千里的山脉,侵蚀效果在星球程序上还没起作用,不过ridged噪声已经可以让群山变得真实很多了。所以,虽然还没达到完美,但这确是向真实地形前进了一大步。

ridged噪声最大的坏处,就是它花费的性能:比菱形-方形慢了几十上百倍。幸好,事情总是普遍联系的,只要玩家的飞船不在低海拔的地方冲太快了,整体来讲速度还是可以的。而这也不算什么问题,因为在低海拔飞高速的玩家,结局多是因为游戏中的物理表现解体(摩擦-生热-爆炸)或者撞地、撞山坠毁。现在我在行星表面可以达到100的FPS,不久之后应该可以很容易地在multiple threads中生成噪声(这是很容易平行执行的动作)。

一个单纯由ridged perlin 噪声生成的地形,已经很能激起人探索的兴致了,但是进一步同其它函数结合也是可能的。例如一个标准的fractal噪声(仅包括3个八度),可以给行星的高度添加任意参数。

另一个函数就是出名的“梯田”效果。它把高度成“阶梯状”分开,在这些阶梯之间改变地面的形状(尖锐或平滑)。这样便可造成好看的峡谷、梯田效果。当然了,这效果也是受全球参数控制的,所以你不会在一颗星球所有的山上都看到“梯田”。

以下截图显示的是一颗典型的类地行星,是用以上提到的功能生成的。注意同一颗星球上的景色是如何丰富多彩。我在这上面远近高低地欣赏、来来回回地探索,浪费了不少时间呢。

将来的计划

没有特意排序:

  • 真实地面材质(眼下只有一种材质)
  • 测试弹坑效果
  • 把一些参数绑定在一个key上,实时看到整个地形morph。基本上用作调试工具,以检测各参数对地形的视觉效果有何影响。
  • 在非常高的频率上使用菱形-方形。

看图时间

点击图片查看1024x768版本。







原文:http://www.infinity-universe.com/InfinityForums/viewtopic.php?t=5485

沙发!
已经很震慑了!IA太敬业了!感动ing!
;A052;
翻译的同志辛苦了!;A051;

汗一个~~是IA,(InfinityAdmin):7_476:

不好意思,写顺手了…已改正~

这是类地行星么?

如果不是的话
图片上的天空怎么是蓝色的 就说明有大气层

而且图上的地貌我看起来都像是地球上的山和沙漠啊…

这个星球上的贴图都是要一个,所以呈现出同样的地址特点;大气肯定是有的,即使太阳系中,几乎所有行星都有大气层,只是气体成分不同罢了。

果然还是过两年发的好…我的电脑肯定不行…

星球实在是很逼真啊,画面啊;A037;

从太空直接进入星球...然后慢慢享受这个风景...该是多么的闲暇啊..只要没人打我

将LS那家伙的座机引擎击毁,让他慢慢玩自由落体…
;A045;

然后让他, 减速不能, 在大气层里 磨擦 燃烧

呀 ! 那不是流星吗~ ? 快许愿 -v-

这种燃烧他人, 照亮自己 (?) 的思想和行为, 值得嘉奖 ! ( 大拇指

很漂亮。。不过看起来还是类地行星。。。天空的颜色。。。大气成分不同天空的颜色也是不同的,天空的颜色是由大气对光线(如太阳光)的瑞利散射决定的(决定因素包括厚度及大气中的各种物质(包括气体分子)的组分情况)。