贴图的支持及设置:关于贴图分辨率的支持及设置的用户指南

来源:互联网 发布:ugm和mac队关系 编辑:程序博客网 时间:2024/06/05 23:02

http://hi.baidu.com/dbfr2011818/item/eef1eac8df31a2d69744520b

 

贴图分辨率

虚幻引擎3支持的贴图分辨率是从1x1 到 4096x4096。
目前DirectX 视频适配器及游戏控制台支持从1x1到2048x2048以及到8192x8192的各种贴图分辨率。一个特定硬件设备的最高贴图分辨率随着生产商和模型不同而变化。可用的贴图内存量随着硬件不同而变化。
在虚幻引擎3中提供了很多功能和设置来管理渲染到不同地方比如世界几何体或用户界面的贴图分辨率。

引擎贴图分辨率限制

虚幻引擎3默认限制贴图mips的最大值为13,它有效地限制了最大渲染的贴图分辨率为4096(从1x1到 4096x4096是13 mips)。有一个负面影响是当导入的贴图分辨率为8192时,它在进行渲染时分辨率最多达到4096的mip1。在引擎源代码文件中的常量值MAX_TEXTURE_MIP_COUNT默认为13,它的值可以被改为14来支持分辨率8192的贴图渲染。这个常量是在以下源代码文件中被定义的(从版本QAMar09开始,请一定要在其他的QA版本上进行验证)。

Src\D3D10Drv\Src\D3D10Device.cpp
Src\D3D9Drv\Src\D3D9Device.cpp
Src\Engine\Inc\RHI.h
Src\Engine\Inc\UnTex.h
Src\Engine\Src\RHI.cpp
Src\Engine\Src\TextureCube.cpp

已压缩贴图的内存需求

DXT 是一种基于把像素放入到具有调色板颜色和插值颜色的4x4块中的有损压缩。这将导致一个8:1 DXT1 和 4:1 DXT5的常量压缩文件大小。因为一个特定平台和硬件的视频内存和贴图工具资源是固定的,所以必须在贴图分辨率和资源应用上寻求平衡。以下表格列出了DXT1 和 DXT5贴图在各种常用的分辨率并具有完全的mips(1x1 到完全native mip0) 情况下的贴图内存需求。注意内存需求几乎是贴图分辨率比率的常量倍数,DXT5贴图需要的内存几乎是它们的对应物DXT1 的两倍。
因为分辨率和压缩比率的比值是常量,所以为了计算没有在这里列出的贴图分辨率的内存需求,只要简单地乘以分辨率比率即可。比如,一个分辨率为1024x512的贴图所需要的内存是1024x1024贴图的一半。
表格数据是通过使用了Box-Filter mip generation 和DirectX Texture Compression(DirectX贴图压缩)的ATI's Compressonator创建的材质中编译出来的结果。

分辨率 从 1x1开始的Mips总量 DXT1 DXT5 16x16 5 mips 312 字节 496 字节 32x32 6 mips 824 字节 1.48kb (1,520 字节) 64x64 7 mips 2.80kb (2,872 字节) 5.48kb (5,616 字节) 128x128 8 mips 10.8kb (11,064 字节) 21.4kb (22,000 字节) 256x256 9 mips 42.8kb (43,832 字节) 85.4kb (87,536 字节) 512x512 10 mips 170kb (174,904 字节) 341kb (349,680 字节) 1024x1024 11 mips 682kb (699,192 字节) 1.33MB (1,398,256 字节) 2048x2048 12 mips 2.66MB (2,796,344 字节) 5.33MB (5,592,560 字节) 4096x4096 13 mips 10.6MB (11,184,952 字节) 21.3MB (22,369,776 字节) 8192x8192 14 mips 42.6MB (44,739,384 字节) 85.3MB (89,478,640 字节)

法线贴图格式

请查看文章法线贴图格式来获得虚幻引擎3所支持的法线贴图格式的更多信息。

引擎配置TextureGroup(贴图组)属性

特定游戏的TextureGroups (贴图组)支持的最大和最小LOD(mip)定义在一些引擎配置文件中。
配置设置文件的源集合放置在文件UnrealEngine3\Engine\Config\BaseEngine.ini中的[SystemSettings]部分。
对于开发中的游戏,[My] Documents\My Games\[your_game]\Config\[your_game]Engine.ini文件也包含了一个在Engine\Config\ 文件夹下的基本属性的镜像集合,并且它通常应该是针对您游戏的特定设置进行修改的副本。

注意对于虚幻编辑器及在游戏中的情况,有独立的TextureGroup(贴图组)项的集合。这两个集合分别放置在config(配置)文件的[SystemSettingsEditor]和[SystemSettings]部分。

在BaseEngine.ini文件中的TextureGroup(贴图组)设置项看上去和这个类似。注意:老的QA版本可能不是在每个设置中都包括MinMagFilter和MipFilter属性。

TEXTUREGROUP_World=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_WorldNormalMap=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_WorldSpecular=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Character=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_CharacterNormalMap=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_CharacterSpecular=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Weapon=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_WeaponNormalMap=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_WeaponSpecular=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Vehicle=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_VehicleNormalMap=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_VehicleSpecular=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Cinematic=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Effects=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=linear,MipFilter=point)
TEXTUREGROUP_EffectsNotFiltered=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_Skybox=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_UI=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_LightAndShadowMap=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)
TEXTUREGROUP_RenderTarget=(MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point)

在<您的游戏>Engine.ini文件中的TextureGroup(贴图组设置)通常会和这个类似。注意LOD设置一般设置为游戏设计及目标平台范围极限。

TEXTUREGROUP_World=(MinLODSize=256,MaxLODSize=1024,LODBias=1)
TEXTUREGROUP_WorldNormalMap=(MinLODSize=256,MaxLODSize=1024,LODBias=1)
TEXTUREGROUP_WorldSpecular=(MinLODSize=256,MaxLODSize=1024,LODBias=1)
TEXTUREGROUP_Character=(MinLODSize=256,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_CharacterNormalMap=(MinLODSize=256,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_CharacterSpecular=(MinLODSize=256,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_Weapon=(MinLODSize=256,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_WeaponNormalMap=(MinLODSize=256,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_WeaponSpecular=(MinLODSize=256,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_Vehicle=(MinLODSize=512,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_VehicleNormalMap=(MinLODSize=512,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_VehicleSpecular=(MinLODSize=512,MaxLODSize=1024,LODBias=0)
TEXTUREGROUP_Cinematic=(MinLODSize=256,MaxLODSize=4096,LODBias=0)
TEXTUREGROUP_Effects=(MinLODSize=128,MaxLODSize=512,LODBias=1)
TEXTUREGROUP_Skybox=(MinLODSize=512,MaxLODSize=2048,LODBias=0)
TEXTUREGROUP_UI=(MinLODSize=512,MaxLODSize=1024,LODBias=1)
TEXTUREGROUP_LightAndShadowMap=(MinLODSize=512,MaxLODSize=4096,LODBias=0)
TEXTUREGROUP_RenderTarget=(MinLODSize=1,MaxLODSize=4096,LODBias=0)

PC AppCompat Buckets 

AppCompat是用于覆盖各种基于在启动时收集到的客观的及有经验的依据的SystemSettings(系统设置)。当启用了app兼容性(仅限于PC),系统将会衡量机器的兼容性然后使用5个"buckets(桶)"中其中一个的预制值来覆盖Engine.ini文件中的值。请查看UTGame中的DefaultCompat.ini文件来获得关于这个功能的应用实例。

AppCompat被规定为仅在游戏第一次运行(不是编辑器)时检查一次。它通过检查[游戏]Engine.ini文件的[AppCompat]部分是来探测这项是否存在,[AppCompat]部分包含了机器以前计算的分数。如果AppCompat已经被应用了一次,它将不会再次改变来允许用户进行不是每次都会覆盖的自定义改变。

对于编辑器要特别地禁用AppCompat,这样机器的规格说明不会影响在开发期间资源是如何在各种不同的机器上显示的。这也是把SystemSettings和SystemSettingsEditor分开的原因。

您可以通过为您的游戏提供一个空的DefaultCompat.ini文件来有效地禁用AppCompat功能(请查看UTGame中的例子),这将会使它初始化在Engine.ini文件的[SystemSettings]的所有buckets(桶)。在这种情况下,系统的操作方式和在没有引入AppCompat之前是完全一样的。

TEXTUREGROUP 属性

每个TextureGroup(贴图组)项为一个正如在游戏渲染中所使用的特定的贴图集合定义了贴图属性。将贴图分组为普通的集合可以更好地控制各种游戏贴图资源所使用的贴图内存。

MinLODSize 将会渲染的最小mip 尺寸,在像素中指定,范围是从1到8192之间,它的值必须是2的幂数,必须比MaxLODSize小。 MaxLODSize 将会渲染的最大mip 尺寸,在像素中指定,范围是从1到8192之间,它的值必须是2的幂数,必须比MinLODSize 大。 LODBias 一个负值或正值,它决定了在加载数值进行渲染前要偏移的mip等级的数量,值在MinLODSize和MaxLODSize之间。 MinMagFilter 指出了贴图过滤类型,参照下面的表格。 MipFilter 指出了贴图过滤类型,参照下面的表格。

MinMagFilter MipFilter 过滤类型 point - Point(点) linear point(点) Bilinear(双线性) linear - Trilinear(三线性) aniso point Anisotropic Point(各向异的点) aniso - Anisotropic Linear (各向异的直线)

TextureGroup, LODGroup 和LODBias

TextureGroup(贴图组)和LODBias(LOD偏移量)的设置在配置文件ini文件中指定,它连同在Texture Properties(贴图属性)中指定的LODGroup和LODBias决定了用于单独贴图贴图mips的最终集合。

在<您的游戏> Engine.ini中的TextureGroup(贴图组)示例可能这个类似:

TEXTUREGROUP_World=(MinLODSize=256,MaxLODSize=1024,LODBias=0)

任何分配给TEXTUREGROUP_World LODGroup 的贴图都将会使用这些设置来决定在渲染时使用的mip 的范围。
在Texture Properties(贴图属性)中附加的LODBias设置和在配置ini文件TextureGroup(贴图组)指定的LODBias相加。

LODBias 的 偏移量指出了要选择哪个mip进行渲染。LODBias 在LODGroup 的Min/Max 范围前进行计算。在Texture Properties (贴图属性)中的LODBias 和TextureGroup 的LODBias 相加来决定要使用的最终LODBias 值。
LODBias的值为0是主贴图分辨率。LODBias值为1是指贴图的向下数第一个mip、 LODBias的值为2是指向下数第二个mip等等。比如,一个分辨率为1024x1024的贴图的LODBias值为1,则会导致在渲染时使用512x512 mip。

贴图属性中为每个独立贴图指定的LODBias 可以是正值或者负值,以便它能偏移TextureGroup(贴图组)的默认的LODBias 值来使mip的值变得或者较高或者较低。
比如,一个TextureGroup(贴图组)的LODBias为0并且Texture Properties(贴图属性)的LODBias值也为0,那么将导致最终的LODBias值为0。
TextureGroup(贴图组)的LODBias值为0,Texture Properties(贴图属性)的LODBias值为1,将会导致最终的LODBias值为1。
TextureGroup (贴图组)的LODBias 值为1,Texture Properties (贴图属性)的LODBias 为1,将导致最终的LODBias 值为2。
TextureGroup (贴图组)的LODBias 值为1,Texture Properties (贴图属性)的LODBias 为-1,将导致最终的LODBias 值为0。

计算出了最终的LODBias后,检查贴图mip 来看它是否适合TextureGroup(贴图组)的Min/Max LODSize范围,如果需要则进行调整。这允许简单地改变配置ini文件来有效地将特定的TextureGroup(贴图组)限定在区间min/max(最小/最大) LOD范围内。比如,一个LODBias为1分辨率为1024x1024的贴图使用512x512的mip,如果它在上面显示的TEXTUREGROUP_World LODGroup中,那么将会检查它来确定它是否在TextureGroup(贴图组)的Minimu(最小)和Maximum(最大)的LODSize范围内,在这里它们是256 和 1024。

由于每个游戏名称有它们自己独特的TextureGroup设置,美术工作者及关卡设计者应该意识到每个组MinLODSize 和MaxLODSize。
如果一个游戏随带发行了具有2048个贴图的TextureGroup(贴图组)并且MaxLODSize值为1024,那么它将会增加发行的包的大小,且不会在渲染质量方面带来好处。

贴图导入属性

对于24-位的RGB贴图在导入时指出CompressionNoAlpha 来制作一张DXT1贴图
对于32-为的ARGB则不用勾选CompressionNoAlpha项来一张DXT5贴图

高光(Specular)和透明性(Opacity)信息通常最好放置到32-位DXT5贴图的Alpha通道中而不是使用两个24-位的DXT1贴图。尽管两个DXT1贴图和一个DXT5贴图的文件大小一样,但是在引擎中DXT5使用一个TextureSampler(贴图取样器)而两个DXT1将使用两个TextureSamplers(贴图取样器)。视频适配器一般有16个TextureSamplers(贴图取样器) (SM3 and SM4)。
DXT5贴图的Alpha通道也更适于保存灰度数据,因为它没有使用和RGB平面一样的有损耗压缩方式。

如果一个贴图必须比任何特定的TextureGroup(贴图组)的最大LOD值都大,请一定要选择本来就支持那个贴图尺寸的TextureGroup(贴图组)并且不要降低mips。

当使用许多2048及大贴图时一定要小心,尤其是当目标支持平台是游戏控制台时。通过覆盖TextureGroups(贴图组)的默认应用,您可以影响贴图的内存池,并可能会在视频内存较少的系统中引发一些问题,比如多个场景贴图剧烈地降低mips从而看上去非常的模糊。

当导入贴图时,一定要选择合适的附加设置,比如当导入NormalMap(法线贴图)时选择TC_NormalMap的CompressionSettings。

贴图查看器属性

每个导入的贴图的属性都可以被修改,并且允许修改像LODGroup和LODBias 这样的设置。
在通用浏览器中双击一个贴图,或者在一个贴图上右击并从弹出的菜单中选择Texture Viewer(贴图查看器)。

 

 

法线贴图格式

概要

自从版本QA_APPROVED_BUILD_SEP_2009开始,引擎已经可以支持许多法线贴图格式。这个文档描述了每种格式的优势和劣势,以及如何使用Normal Parameter(法线参数)材质节点。

法线贴图格式

这个表格概括了各种法线贴图格式的特征。

压缩设置 贴图格式 通道 每个像素的位数 分辨率为1024x1024时的所占空间大小 评论 TC_Normalmap DXT1 3(*) 4 512 KB * 在DXT1的alpha 通道中存储1-位的alpha (蒙板)是可以的。 TC_NormalmapAlpha DXT5 4 8 1024 KB   TC_NormalmapUncompressed V8U8 2 16 2048 KB 由于它的内存使用率是DXT1的四倍,引擎自动通过一个mip-map来降低它的分辨率,从而匹配DXT1占用的空间。 TC_NormalmapBC5 BC5 (3Dc / DXN) 2 8 1024 KB DirectX 10和Xbox 360,或者在DirectX 9下的ATI 显卡支持这种格式。

TC_Normalmap / DXT1

TC_Normalmap (DXT1)在所有的格式中占用的内存最少,但是DXT1块压缩不是非常适合存储法线贴图数据,结果一般都是非常斑驳的。

TC_NormalmapAlpha / DXT5

TC_NormalmapAlpha (DXT5)和DXT1的视觉效果一样,但是也拥有每个像素占4-位的压缩的alpha通道数据作为蒙板。在DXT5中放置一个您需要的蒙板而不是另一个简单的贴图可以获得更好的性能。但是如果您把蒙板放置到一个漫反射贴图中,它将允许您使用另一个法线贴图格式。

TC_NormalmapUncompressed / V8U8

未压缩的格式存储法线贴图的三个通道中的两个,每个通道占8位 (所以每个像素占16位)。这个法线贴图的质量最高,但因为仅存储了2个通道,Z需要在像素着色器中进行计算。(材质编辑器可以自动执行这个功能,请注意在上面的屏幕截图中所增加的指令数量。)

因为内存使用量是DTX1的四倍,所以把X和Y的分辨率降低为原来的一半(也就是1mip等级)将会使内存使用量和DXT1一致。我们认为未压缩的仅具有一半分辨率的法线贴图看上去要比DXT1压缩法线贴图更好,所以当选择TC_NormalmapUncompressed格式时,贴图编辑器自动降低了它的分辨率 。当改变回另一种格式时,则恢复贴图的原始分辨率。

(这段代码在UTexture2D::Compress()函数中,您可以移除或禁用这个功能。)

TC_NormalmapBC5 / BC5 (3Dc / DXN)

BC5格式,也称为3Dc或DXN,不是所有的平台都支持这种格式-仅DirectX 10、 Xbox 360 和DirectX 9下的ATI显卡支持这种格式。对于法线贴图的X和Y向量,它使用每个像素占4位的压缩机制,这个DXT5上的alpha通道的压缩机制类似,意味着各个通道是彼此独立的。当和DXT5占有同样的内存时,这种方式将会产生更少的斑驳现象。和未压缩的格式一样,Z在像素着色器中进行推导出来。

材质编辑器使用注意事项

由于某些格式需要在贴图着色器中重建Z通道,所以使用不同格式的贴图将会需要不同的像素着色器代码。材质编辑器为您处理这些工作,但是有一些需要注意的缺陷。

TextureSample(贴图样本)节点

在TextureSample(贴图样本)节点中使用任何格式的法线贴图都可以正确地工作。然而,法线贴图的格式仅在重新编译材质着色器时进行检查。所以如果您在没有重新编译着色器的情况下改变法线贴图的CompressionSettings(压缩设置),产生的贴图着色器代码可能会不匹配。这和UnpackMin/Max的行为类似。

TextureSampleParameter2D 节点

在TextureSampleParameter2D节点的默认值中使用任何格式的法线都可以正确地工作。然而,任何覆盖参数默认值的材质实例 必须和默认的Texture(贴图)属性有相同的CompressionSettings(压缩设置) 。和TextureSample一样,在没有重新编译应用的着色器情况下,改变贴图默认的CompressionSettings(压缩设置),会产生同样的警告。

TextureSampleParameterNormal node

在TextureSampleParameterNormal节点的默认值中使用任何格式的法线贴图都可以正确地工作,并且在材质实例编辑器中创建的任何常量实例都可以覆盖具有任何格式贴图的法线参数。如果格式需要不同的像素着色器,那么将会重新编译实例的新版本。

但和TextureSample一样,在没有重新编译所应用的着色器的情况下,改变贴图的CompressionSettings(研所设置),将会产生同样的警告。

建议

使用降低分辨率的TC_NormalmapUncompressed格式代替TC_Normalmap格式,如果它使您的内容看上去更好。它们的内存使用量一样。 如果您正在制作Xbox 360游戏,您觉得TC_NormalmapBC5格式所和降低分辨率的TC_NormalmapUncompressed相比所带来质量的差异值得您增加2倍的内存量,那么请使用TC_NormalmapBC5。 无论您是否需要使用法线贴图作为参数,我们推荐您使用TextureSampleParameterNormal材质节点。 您应该使您所使用的法线贴图格式和特定材质实例的父类保持一致,从而可以降低产生的着色器的数量。

 

From:http://udn.epicgames.com/Three/TextureSupportAndSettingsCH.html

http://udn.epicgames.com/Three/NormalMapFormatsCH.html