地形Apha贴图: 使用外部创建的贴图层alpha贴图
概述
地形从本质上说是一个3D平面网格物体,它的大小是X*Y个顶点。所渲染的方块的面的实际数量是x-1 * y-1。所以一个256x256的地形,则要求它的高度图空间尺寸为257x257。地形属性对话框在块或四方形面(NumPatchesX 和 NumPatchesY)中指出了地形的大小,它的值等于顶点数-1。
Alpha贴图概述
为了支持地形上的多个贴图的层,比如泥土、草地以及岩石,每个层使用一个 alphamap(alpha贴图) 来决定地图在哪个地方混合到地形中。这个alphamap(alpha贴图)有时也被作为 weight map(权重贴图) 来引用,因为它定义了每个混合的贴图的权重。这个alpha贴图在本质上是一个和alpha通道的图片类似的灰度化蒙板。
每个地形层的alpha贴图和底下的地形高度图或网格物体具有同样的空间尺寸,alpha贴图的一个像素等同于地形上的一个顶点,所以贴图层间的混合受到地形网格物体顶点间的距离的限制。因此一个128x128的地形支持固定混合129x129个像素的alpha贴图。地形的DrawScale3D.X/.Y值决定了每个混合区域的尺寸,所以DrawScale3D.X/.Y为256将会导致地图贴图层的混合尺寸是256个虚幻单位。换句话说,alpha贴图的一个单独像素的尺寸是地形上的DrawScale3D.X/.Y的值。
每个alpha贴图像素值决定了应用到地形上的等价顶点的贴图的透明度混合百分比。由于这个原因,alpha贴图必须和高度图的分辨率一样,从而可以提供一个相应的1-对-1的混合值。
只要引擎渲染地形三角形,它便会从层的alpha贴图的行和列中获取每个高度图顶点上的每个贴图的混合值。
如果alpha贴图的值为0(黑色)将会导致在那个顶点没有贴图进行混合,值为127(灰色)将会导致50%的贴图在那个顶点进行混合,值为255(白色)将会导致100%的贴图在那个顶点进行混合。
发生在地形网格物体顶点间的贴图混合是线性渐变的而不是急剧的变化。换句话说,贴图层按照一个顶点到一个顶点的方式平滑地和它下面的贴图进行混合。正如在这个示例图片所示,它只是一个单独的地形三角形对(一个四方形),左上角的地形顶点具有对应的全白色lapha贴图值(255),而其它两个三角形顶点具有相应的全黑色的lapha贴图值(0)。然后贴图层将在地形三角形的表面按照一个坡度的方式从一个顶点到一个顶点平滑地进行混合。在这个实例中,底下的贴图是蓝色,而层上分配的贴图是黄色,所以白色alpha贴图值渲染为100%的黄色,而黑色的lapha贴图值渲染为100%的蓝色。三角形的表面总是显示为从黄色到蓝色的平滑渐变。
在虚幻引擎3的地形系统中,高度图或alpha贴图在通用浏览器?中是不可见。这和以前的引擎版本是不同的。
地形层设置
虚幻引擎3的地形系统支持大多数常用地形贴图层风格的基本要求,可以通过使用TerrainLayerSetup对象中的Height(高度)和Slope(坡度)属性来完成。这些成为 procedural layer setups(程序花的层设置) 。
正如在实例TerrainLayerSetup中所示的,这个地形层由两个层组成,较低的layer [1]作为固体基础层,上面的layer [0]被限制为0到45的坡度(MaxSlope.Enabled = true 和 MaxSlope.Base = 0.5, 这里的 0.5 = 45 度),它类似于平原贴图,在那里您一般会看到草地。
注意当在一个TerrainLayerSetup中存在多项时,它们按照向上的顺序进行层放置,而贴图层从底(最高的元素索引值)向高(最低的元素索引[0])进行渲染。在上面的实例TerrainLayerSetup中,元素[0]在元素[1]的上面进行渲染。
尽管程序上控制的TerrainLayerSetup可以很容易地为您的地形提供平原(通过高度)、悬崖面(通过坡度)以及冰雪覆盖的山脉(通过高度)等层风格,但是它不能创建更加复杂的地理贴图层,比如山脉的山脊或河流阻隔。它也不能创建那些具有盘旋的河流和路的贴图层,因为那时在它的整个过程中地形系统的高度和坡度是变化的。对于那些更加复杂的贴图层,您可以选择或者手动地在UnrealEd中描画那个层或者使用一个从外部创建的alpha贴图文件。
注意要想手动地描画一个贴图层,或者导入一个外部alpha贴图文件到一个层中时,TerrainLayerSetup 必须是一个单独层的风格,它不能是程序化的多图层风格。
山脉的山脊(技术上有树枝形的山脊和地形学上的山脊)是指从风化的山脉中暴露出的没有被侵蚀的硬的岩石。Fluvial cuts(河流阻隔)是由水流过腐蚀物导致的,就像从山脉上流下的河流那样。 在这个指南中我们将使用的示例地形alpha贴图将展示贴图化的山脊地理类型。
创建外部Alpha贴图
外部alpha贴图可以通过第三方地形高度图软件或者有一个好的美术工作人员使用绘图软件来进行创建。
有很多第三方地形高度图软件应用程序,比如HMES, Leveller, Terragen, World Machine, 以及其它的。它们生成根据算法来生成不同风格的高度图或alpha图的能力是不同的。我们在这里不推荐任何特定的包,或许应该有您的工作室的美术指导来决定在内部使用哪个软件来开发地形。
对于美术工作人员来说,用于手动地绘制alpha贴图的最常用的软件应用程序可能是Adobe PhotoShop,当然还有其它的绘图软件比如Corel PhotoPaint、PaintShopPro等。
如果您正在手动地绘制一个alpha 贴图,您需要在黑色的背景上刷上白色,这和创建alpha通道蒙版的方式一样,这里白色将是显示的地图贴图层。使用算法产生alphamaps的好处是它们通常会根据实际的地形高度图进行创建、节约大量的时间、以及制作出可能很难由美术人员手动地进行复制的复杂设计。
本指南将不会覆盖创建外部alpha贴图的每种方法,因为它根据不同工作室的美术作品工作流程的不同而变化,并且美术部门或关卡设计人员是通过手动地创建高度图还是使用第三方软件来创建高度图和alpha贴图的决定也是不同的。本指南中创建的地形高度图和alpha贴图实例是通过一个应用程序根据算法进行创建的。
外部Alpha贴图的格式
外部alpha贴图文件是简单的8-位的灰度化图像,和蒙板或alpha通道类似,即黑色是100%的透明,白色是100%的不透明,灰度级别间的变化可以改变透明的程度。导入到UnrealEd的alpha贴图所要求的实际的文件格式是G16.bmp格式,和外部高度图文件格式一样。使用高度图或绘图软件来创建8-位的灰度位图来作为外部alpha贴图是可能的,然而,在导入那个alpha贴图到UnrealEd之前,它必须被转换为G16格式的文件。8-位的数据必须经过简单地相乘来达到16-位(*256 或 <<8)。当G16 alpha贴图中的16-位数据被导入到UnrealEd时 ,它将自动地转换回8-位。如果alpha贴图是在支持16-位格式(比如Raw-16)的软件中进行创建的,那么那个文件可以在不进行乘以数据的情况下直接地使用,它仅要求把文件转换为G16格式即可。
外部alpha贴图文件的地形尺寸是 Terrain.NumPatchesX +1乘以Terrain.NumPatchesY +1的值。那么一个128x128的地形需要一个129x129的alpha贴图,一个256x256的地形需要一个257x257的alpha贴图。当尝试导入一个尺寸不正确的alpha贴图时,将会产生错误。
如果那个alpha贴图是通过使用仅支持尺寸为2的幂数的软件应用程序创建的时,它将要求编辑那个alpha贴图图像并通过在边缘上添加额外的像素行和列来更改分辨率。Alpha贴图在UE3的UnrealEd中从左上角开始检测的,所以通常会在alpha贴图的右侧或底部添加一行和一列,以便使它包含的行和列的数量和地形网格物体一样。
根据alpha贴图创建时使用的格式的不同,它必须通过相乘来达到16-位 并/或 转换为G16。有很多第三方工具支持G16转换,包括G16Ed 和 HMCS。
使用外部Alpha贴图的地形实例
通过软件应用程序,创建了以下的高度图作为UnrealEd地形进行应用。高度图被保存为Raw-16格式,并被转换为G16格式。
自定义的”山脊”的alpha贴图是和高度图一同通过算法创建的,保存为Raw-16格式,然后转换为16-位灰度化TIF,从而可以在绘图软件中进行修改。这里是原始的Raw-16格式的alpha贴图:
在绘图软件中修改TIF-16格式的alpha贴图,通过在多个渲染遍数中组合地使用Intensity(密度)和Contrast(对比度)来增加亮度的弯曲级别,然后再把它保存回TIF-16格式,再次把转换为G16 -16格式,以便把它导入到UnrealEd中。UE3中的UnrealEd相对于以前的虚幻引擎版本来说要求较高的对比度,所以这里的alpha贴图通常比那些在虚幻引擎2及2.5版本中创建的alpha贴图要具有更高的密度。
最终的TIF-16如下所示:
使用外部Alpha贴图创建示例地形
这是使用自定义的外部alpha贴图创建新的地形的步骤。
关于UE3地形设置及导入算法地形方面的更多信息,请参照UDN的地形主题。
1. 1.把一个地形actor插入到新的地图中。设置它的 Terrain.NumPatchesX 和Terrain.NumPatchesY的值为自定义的G16格式文件的高度图的尺寸-1,然后导入那个高度图。
2. 插入一个DirectionalLight(定向光源)来模拟太阳光。把它的Movement.Rotation.Pitch改为45度。
3. 为基础草地创建一个的新TerrainMaterial(地形材质)。分配适当的贴图。
4. 为山脊的岩石创建一个新TerrainMaterial(地形材质)。分配适当的贴图。
5. 为这些基础草地贴图层创建一个新的TerrainLayerSetup。注意,如果需要这也可以是一个多层的程序上的设置,比如从0到30度的过程中设置一个泥土基础和一个草地平原。
6. 为山脊的岩石贴图层创建一个新的TerrainLayerSetup。注意者必须是一个单独的层设置,因为多层的程序上的设置不支持导入的外部alpha贴图。
7. 把那两个TerrainLayerSetups添加到地形actor的Terrain.Layers数组中。注意,这个对话框数组列表中的层次是从索引[0]开始向上渲染的,所以层[0]是基础层,其它的具有较高索引值的层将会在它的上面进行渲染。
8. 跳转到Terrain Edit(地形编辑)模式,打开地形编辑对话框。在Import/Export(导入/导出)组中,选中"Height Map Only(仅高度图)" 和 "Into Current(导入到当前图层)"复选框,以便它被导入到选中的图层中,在Class(类别)的下拉列表组合框中选择"G16BMPT3D",因为我们导入的是G16 .bmp,选择山脊的TerrainLayerSetup,用于接收那个自定义alpha贴图(正如对话框上黄色的选择颜色所示),然后选择Import(导入)按钮。在文件对话框中定位外部G16 alpha贴图文件并打开它。如果alpha贴图文件没有问题,比如不正确的文件格式或文件尺寸,那么alpha贴图将会被加载到地形设置中并应用到选中的层上。您或许需要点击"Recache Terrain Materials(重新缓存地形材质)"按钮来在视口中更新地形。注意,在这个实例中, Base(基础) 的TerrainLayerSetup是一个多层的程序上的设置,它包括泥土和草,正如在它的图标上的大"P"所显示的,并且alpha贴图要导入的 Ridges (山脊) 的TerrainLayerSetup位于它的下面。
当UnrealEd中点击Build All(构建所有)按钮后,便出现了最终的地形外观。请注意那个坚固的地形山脊。
Important!
You are viewing documentation for the Unreal Development Kit (UDK).
If you are looking for the Unreal Engine 4 documentation, please visit the Unreal Engine 4 Documentation site.