Gamebryo—NiTerrain

一、 介绍

1、 地形架构

GB中的地形是场景图系统的扩展。可以使用NiEntity来创建地形,即向场景中添加一个包含一个NiTerrainComonent的组件实体。

地形可以被分割成一个父亲NiTerrain和孩子NiTerrainSector。NiTerrainComponent可以当作NiTerrain对象中的一个实体接口,并且负责处理和管理场景中的地形。

clip_image002

NiTerrain

该对象负责建立地形实例的相关参数,包括Lod的级数、每一个block的大小。NiTerrain对象负责组织场景中NiTerrainSection的显示以及每个Section直接之间的缝合。NiTerrain可以包含多个Section。

NiTerrainSector

NiTerrainSector对象负责管理每一个地形段(terrain sector)的几何和材质信息。它负责地形块内部的四叉树处理、以及从磁盘里加载数据、射线检测、变换、以及内部资源(如、共享顶点数据流和着色器)。同时地形段还负责地形Lod的计算从而决定那些地形快需要绘制。

Terrain Interactor

NiTerrainInteractor用来初始化数据序列、高度图的导入、文件的加载。所有的地形操作都是基于遍历Interactor。它可以当作一个NiTerrain和NiTerrainComponent的属性。

NiTerrainComponent

当使用NiEntity系统时,它时是地形引擎的主接口。它是访问地形以及场景根节点的入口。地形组件允许对地形对象进行一些基本配置如、blcksize和Lod级数,但是不包括任何操作地形的功能。可以通过interactor来遍历地形,该interactor也可以作为地形组件的一个属性。

注:NiTerrainSectorComponent类可以直接相应BuildVisiableSet和Update函数,期间使用四叉树。

Data Leaves and Blocks

地形块的顶点数是恒定的。0级Lod就是代表一个地形段。

Material Layers

可以通过NiSuface来管理材质。每一个地形支持一个掩码层的堆栈。该层以XML格式存放在地形段的数据中。材质层包括一个掩码图片和一个地形材质的引用。该掩码决定了地形段的哪一块附上相应的材质。

使用这种机制,会根据每一层纹理来自动生成相应的着色器代码。至此支持4层以上,并使用一个渲染通道。绘制时,所有层根据掩码权重进行混合。

2、 地形的材质和Masks

地形引擎允许在地形段上附加材质。地形材质定义了地形段的外在表现,同时可以添加用户自定义的本地数据信息(如、草地、脚印)。顶点和像素着色器代码会根据每一个材质中的纹理贴图的配置信息自动生成。

每一个材质包含如下类型的纹理贴图:

l Diffuse/Base Map

l Detail Map

l Normal Map

l Parallax Map

l Distribution Mask

混合

地形段上的每一个材质都包含一个“Visibility Mask”,它决定了材质覆盖地形段的范围。混合掩码时一个灰度值,存放在targa(存放在sector文件夹下)一个通道上。通过一个surface.xml文件名和材质进行关联。运行时、所有的地形表面掩码被组合成多通道混合掩码,该混合掩码被传到着色器中,从而实现混合和光照计算。如果每一次中存在Distribution masks,它会和这些Visiability Mask相乘。

在Scene Designer中这些掩码可以被修改,在地形任一点上这些掩码被归一化,所有的掩码值之和为1.

本地资源(Meta-Data)

地形材质可以添加一些本地资源。当这些资源被遮挡时,数据可以被重新获取。

通过地形Interactor来拾取材质的本地数据有两种方法,权重和混合。

Distribution Masks

Distribution Masks对于每一层地形提供了额外的混合操作。

限制

当前,每一个地形段最大支持4层材质。

3、 地形Meta-Data系统

本地资源可以用于向地形材质添加任意数据。例如、脚步声音文件可以作为一个地形材质的本地资源。每次用户行走到该地形快时,你可以检测当前点的本地资源,此时本地资源会放回脚步声音信息。可以使用Scene Designer向地形材质添加相关本地资源数据,也可以通过手动编辑材质的XML文件。

每一个材质的本地数据存放一个NiMetaData对象中,该对象存储了材质本地资源条目的区域和值。本地资源的条目既可以时整形、浮点型、字符串。NiMetaObject对象必须和NiMetaStore对象关联。

一旦本地资源被添加到地形材质上,它可以通过NiTerrainInteractor老重新获取。

4、 地形的碰撞检测

有两种方法可以进行地形碰撞检测:使用射线、通过PhysX.

射线检测:可以找到碰撞点、高度、面的法向量、本地资源信息

PhysX:

5、 地形的水

可以使用NiWaterComponent和NiWater来创建地形静态水效果。

NiWaterComponent类拥有一个面板属性,它可以动态创建水以及提供使用NiWater的接口,NiWater使用NiMesh来代表水面。可以通过Scene Designer来修改相关属性。水对象的NiWaterMaterail可以根据当前的配置生成相关顶点和像素着色器。

水被动态纹理所影响。该纹理使用一个灰度掩码(gray-scale mask)决定水的颜色。它可以被水的深度和阴影所影响。如果水没有被一个地形所关联,则默认使用深度水颜色,要不然纹理的生成是根据水面和和地形的距离。

当前水只受方向光影响,要想使水表现出镜面高光、动态法线贴图,此时必须添加方向光。

二、 用法

NiTerrainConfiguration允许用户配置地形几何体的存储和渲染方式。该配置必须在地形加载前设置,所有地形加载后的配置都将无效。该配置可以减少地形的运行时的存储空间,以及控制数据流的格式使其适合固定管线和材质。

选项

l 开启/关闭切线:如果关闭了切线,此时法线贴图和时差贴图将被地形舍弃。

l 开启/关闭光照数据压缩:允许开发者对数据流的法线和切线数据进行压缩。如果要想支持Lod之间的变形必须打开该参数。当关闭该参数时,在使用固定管线而不使用顶点着色器时,数据流中的法线和切线数据将被眼所。

l 开启/关闭几何变形:如果打开该参数,额外的数据将被存储到数据流中,从而支持Lod之间的几何数据的变形。

修改默认参数:

在DX9和DX10所有默认情况下以上参数都是设置为true

clip_image004

三、 使用程序创建地形

地形系统是场景图系统和实体系统的结合。

1、 创建一个空地形

clip_image006

地形段数量=1 + block_size * 2level-of-detail.

2、 从.GSA加载地形

clip_image008

3、 使用高度图加载地形

clip_image010

四、 和地形交互

1、 使用Rays(线段)

(1) 普通检测

A

clip_image012

clip_image014

B

clip_image016

clip_image018

(2) 返回材质信息

可以返回地形材质的混合信息:

clip_image020

(3) 返回本地数据信息

2、 使用地形本地数据(Meta-Data)

(1) 向NiMetaData对象添加本地数据

本地数据支持:整型、浮点型、字符串。及其这些类型的混合。

可以使用NiDOMTool来从对象里添加、加载、保存本地数据(XML)

(2) 向材质设置本地数据

NiSurface对象包括了NiMetaData(存储了本地数据)。可以通过NiSurface的SetMetaData和GetMetaData来设置和获取本地数据,此时可以直接设置本地数据的相关属性。

(3) 从地形点上查询本地数据

可以通过NiRay来获取地形上的点,再使用NiTerrainInteractor的GetMetaData来获取指定点的本地数据。

GetMetaData:返回指定材质上的所有Metadata以及它们的权重属性如果一些本地数据存在于多个材质上,此时会把它们进行叠加再返回叠加结果。

GetBlendedMetaData:

3、 使用地形印花

印花同样可以使用NiTerrainInteractor对象来添加到地形上,地形印花是由Mesh构建,该Mesh的顶点数据取自(拷贝)地形的顶点数据流,从而实现印花始终附在地形上。使用NiTerrainDecalManager来处理每一个印花。当一个地形块变形时,附在它上面的印花也随之更新。

可以使用NiTerrainInteractor的CreateDecal来创建印花。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值