在简单介绍程序界面之后,接下来简单讨论创建一个场景。
首先创建一个全局光影,点击菜单“物体->
全局光影”,或者在工具栏中点击
按钮即可创建该元素,可以根据需要修改该元素的属性,例如修改方向光的方向向量,散射光及镜面光颜色,还可以启用阴影等,这里简单说明我所使用的阴影技术,Ogre1.x内部的阴影机制是非常简单粗暴的,也就是落后的纹理阴影投影算法,该算法首先生成阴影纹理,接着绘制场景,最后将阴影投影到场景中可接受阴影的物体上去,需要渲染三遍,毫无疑问,这是非常低效的阴影机制,而且存在近看阴影粗糙模糊的问题。我使用的是PSSM阴影算法,将视景体分为3块,为每个块分配一张阴影纹理,寻常的PSSM算法虽然能解决近看阴影质量的问题,但是无法解决低效的问题,因为需要三张阴影纹理就得渲染场景三遍,我用几何着色器的重复实例来解决这一问题,创建一个包含3张二维纹理的纹理数组,将不同的块中包含的物体的深度值输出到纹理数组中不同的子纹理,这样只需要渲染场景一遍即可得到三张阴影纹理,渲染两遍即可得到阴影效果。另外,几年前的AMD显卡可能不支持几何着色器重复实例这一技术(我个人一直对AMD显卡的驱动程序抱着怀疑的态度的),如果不支持,请不要打开阴影功能。
接下来创建天空盒,点击菜单“物体->天空盒”,或者在工具栏上点击
按钮即可创建该元素,同样创建完后可以设置相关的属性。如下图所示:
现在我们来创建地形,地形的创建分两步:点击菜单“物体->地形->新建地形”,或者点击工具栏
的下拉菜单,即可创建地形场景元素,接着还要创建地形数据,单击菜单“物体->地形->创建数据”,弹出创建地形对话框,如下图所示:
在对话框中需要指定地形名称,以及地形数据的存放路径。“点间距离”参数指定了地形网格中相邻两点之间的水平距离,“最大细节”参数指定了最高的LOD层级,该参数范围为[0,7],本编辑器使用Geomipmap地形LOD算法,地形由分块组成,“最大细节”参数决定了地形分块在最大细节层级时顶点的数量,假设参数为n,则该数量为2^n + 1,“点间距离”、“最大细节”和纹理的大小共同决定了地表纹理的分辨率,我们以米作为默认长度单位,以我个人的经验,0.1米对应一个纹理像素就能达到非常好的效果,假设地形纹理的大小为256X256,则一张这样的纹理可以对应25.6米X25.6米的地表区域,默认的点间距离0.8米,最大细节为5,0.8X(2^5) = 25.6,刚好满足这一数值。
“横向范围”及“纵向范围”指定了地形的水平空间范围大小。勾选“创建随机高程”选择框可以创建随机地表,也可以根据现有的高度图来创建地形,当高度图的区域小于指定范围时,超出的部分将会置平,默认情况下将会创建一个高度为0的地形平面。如果在弹出对话框之前在地形纹理面板中选择了一张纹理,可以将该选中的纹理作为地表的底层纹理,同时,可以在对话框中设置地形的散射颜色、镜面颜色以及镜面系数。例如,按照上图的设置,我们可以轻易的创建一个简单的随机沙漠地形,效果还挺不错:
如果在地形编辑过程中发现地形范围太大或者太小,不必担心,点击菜单“物体->地形->扩裁地形”,我们可以零成本的扩大和裁剪地形数据范围。
另外需要说明,为了方便编辑地形数据,在编辑器中并不支持地形LOD,需要将场景及地形数据导出之后,使用“无极场景浏览器”载入导出的数据才能看到地形LOD效果。经过几次改版,这个地形算法可以说已经优化到了接近极致的程度,有兴趣的朋友可以自行测试,无论创建多大的地形数据(几十上百公里),在漫游浏览导出数据的时候也丝毫不会感到调度延迟。
编辑器有两种编辑模式,一种是摆放模式,另一种是地形编辑模式。在摆放模式中,可以选择场景中的物体,修改物体的属性,例如平移、旋转、缩放模型等,在地形编辑模式中可以编辑地形数据,使用工具菜单的“放置”和“地表”菜单项可以切换这两种模式,或者可以使用工具栏上的
按钮来进行切换。
创建好地形数据之后,就要对地形进行编辑,本编辑器集成了地形编辑模块,首先我们编辑地形的几何表面,创建一个默认的平面地形,切换到地形编辑模式,点击菜单“工具->雕刻”,或者点击工具栏上的
按钮,打开雕刻工具窗口,如下图所示:
用户可以选择圆形或者正方形形状工具,例如选择正方形形状之后,地表上绘制的“刷子”就变成方形,如下图所示:
当场景中一个模型摆放在不同的位置,有着不同的朝向或缩放倍数时,可以使用复制粘贴功能,也可以批量复制,批量粘贴,这样就省了一个个去创建的麻烦。
室外场景中往往存在池塘、河流、湖泊等水域,场景中添加水面可以大大增加真实感,本编辑器支持添加水面,设置水面的相关属性,点击工具栏上的
按钮,然后在场景渲染区中点击地表(注意一定要有地形才能创建水面,后面会进一步说明),即可创建水面,如下图:
水面的范围自动与地表计算交叉,例如在地表上挖了一个坑,则水面填充的范围就只在这个坑内,这样设计有很大的好处,如河流的水面只会填满河床,而不会超出河床的范围,这也是为什么必须有地形才能创建水面的原因,现在我们将水面的位置抬高,将坑填满,如下图:
我们还可以设置水面的相关参数,例如水面的颜色、水面的透明度,菲涅尔因数,如下图所示:
虽然我们可以在场景中创建多个水面,但是在同一个可见区域内,尽量不要创建超过一个水面,如果要创建多个尽量确保它们的水面高度相同,因为水面的渲染比较耗时,需要渲染反射图、折射图,如果有不同水面有不同高度,则需要渲染多个反射图,这将大大影响场景渲染效率。注意,目前我仅实现了水面效果,水下效果如扭曲、上帝光线等效果尚未实现。可能有朋友问,如果一个场景没有地形只有水呢?例如海洋,海洋表面的实现其实也差不多,而且实际上相对更简单一些,因为海洋表面不需要做交叉计算,也不需要渲染折射图,利用辐射格子拓扑结构,加上D3D11的嵌饰系统(Hull Shader、Tessellation Shader、Domain Shader),可以实现很好的海洋表面网格。另外,放置在水面下的物体,其材质需要特殊处理一下,在渲染反射图时,在像素着色器中将处于水面下的像素裁掉,地形材质我已经做了相关处理。水面的模拟可以说是3D场景中最难的效果之一了,为了实现水面效果,我甚至改动了引擎核心的渲染循环,改动渲染系统增加深度纹理的支持,当然我对Ogre引擎代码的改动也不是一处两处地方了,水面渲染还有很多技术细节,这里就不一一探讨了。
现在我们讨论创建一个使用延迟渲染机制的场景,有些场景例如室内场景、洞穴等,使用延迟渲染机制更加合适,因为这些场景往往有多个局部光源,而在多光源的场景中使用ForwardRender显然是不合适的。首先,新建一个空场景,创建“全局光影”场景元素,关闭全局阴影,打开延迟渲染,把全局方向光的散射及镜面颜色调暗,如下图所示:
接着我们创建一个随机地形,如下图所示:
接着创建一个点光源,一个聚光灯,点击工具栏上的
及
按钮分别创建点光源及聚光灯,创建方式与创建水面一致,设置光源的范围及衰减系数,如下图:
我们在聚光灯下放置一个模型,打开延迟渲染阴影(注意该选项仅对聚光灯有效),如下图:
我们也可以查看延迟渲染中GBuffer的内容,通过切换延迟渲染模式,如下图:
最后在创建完场景后,可以将场景导出,点击工具栏上的
按钮导出场景,注意如果电脑性能较慢,CPU没有空闲时间,导出进度对话框可能要过一会才能弹出来,这时候仅需将相机朝天空上看,减少场景渲染复杂度,让CPU有空闲时间,导出进度对话框就能显示出来了,导出的场景可以在“无极场景浏览器”中载入漫游浏览,导出后的场景的渲染效率将大大提高,内存占用也将大大减少。
通过上面的篇幅,我给大家简单介绍了无极场景编辑器的主要功能,本来我想做一个漂亮的场景展示给大家看,可惜奈何我只是一个程序员,而场景制作需要专业的美工才能完成,我在前面介绍中所用的美术资源,包括模型、纹理,甚至连UI图标都是在网上找的,因此自己制作场景这个想法只能落空了,多少有些遗憾。不过希望将来能有专业的美工人员用本编辑器制作出精美的场景,无论是用于制作游戏场景,或者展示规划方案,毕竟这个编辑器是可以免费使用的。如果大家在使用或测试过程中发现bug,或者有更好的改进建议,我会很高兴收到这样的反馈,因为毕竟这套编辑器从设计到编码到测试都由我自己一人完成,所以难免存在未发现的问题。
场景是游戏世界的基础,一个实用高效的场景编辑器能大大提高游戏开发的效率,场景编辑器可以说是游戏产品的首要生产工具,也是游戏引擎的核心也是难点所在,如果有朋友对我的这套解决方案感兴趣,欢迎与我联系,个人邮箱地址:wangyiuestc2005@163.com,Mr.吴。