前言
Texture 在游戏中扮演着重要的角色,它就像是一个人的皮囊一样。同时它也肩负着很多任务,如2D平面贴图、漫反射贴图、光照贴图、立方体环境贴图、法线、物理或数据运算贴图等。
Texture 导入设置选项
Texutre Type
Default(默认纹理):默认的纹理类型。
Normal map(法线贴图):是一种特殊类型的纹理,它用于模拟物体表面的微小凹凸不平,从而增加视觉上的细节和深度感,而无需增加实际的几何复杂度。这种技术通常用于实时渲染环境中,因为它可以显著提高渲染效率,同时保持丰富的视觉效果。
Sprite (2D and UI):Sprite是2D游戏中使用的图像资源的一种表示形式。它通常指的是整合到场景中的一部分图像,类似于传统意义上的精灵(sprites),可以用来构建角色、物体、背景等元素。
Cursor(光标):定义你的资源为适用与鼠标光标的替代资源。
Cookie:Cookie纹理是一种特殊类型的纹理,通常把它添加到光源上,使用Alpha通道来模拟光影效果,如窗户透进来的光线或云层的阴影。
Cookie纹理一般使用单通道进行表示。
Lightmap(光照贴图):提供场景对象烘焙后的受到的直接光源、间接光源、阴影或环境光遮蔽(AO)影响的数据,可以携带多个通道表示多个光照属性,一般由Unity烘焙系统自动生成。
Dirctional Lightmap(定向光光照贴图):Directional Lightmap是Lightmap的一种类型,它专门用于存储来自单一或多个定向光源的光照信息。与标准的Lightmap相比,Directional Lightmap包含了入射光的主要方向信息,这使得它能够更准确地表达由定向光源(如太阳光)产生的光照效果。在某些情况下,Unity会额外生成一张Directional Lightmap来存储这些方向性信息,以便在渲染时能够利用这些信息来计算更精确的光照效果
Shadowmask:Shadowmask 贴图包含单个混合定向光的阴影衰减信息,这些信息代表由对全局照明有贡献的所有静态对象投射的阴影。数据存储在红色通道中,因此贴图为黑色和红色。
Single Channel(单通道纹理):Single Channel纹理是一种特殊类型的纹理,它只包含一个颜色通道,通常是红色(Red)或 alpha(Alpha)通道。这种纹理类型适用于那些不需要完整RGB颜色信息的场景,例如深度图、法线贴图或遮罩层。
Texture Shape
纹理的形状(Texture Shape)决定了纹理的结构和如何被应用到游戏对象上。以下是各个Texture Shape选项对纹理的具体影响:
2D(平面贴图):(默认设置)适用于大多数2D纹理,可以将图像文件定义为2D纹理,用于映射到3D网格、GUI元素等。
Cube(立方体贴图):通常用于天空盒、立方体环境贴图等。
2D Array(平面数组贴图):允许你通过行列设置将一张纹理切分成大小等分相等的N张纹理,你可以通过Texture2DArray 对象访问纹理集合中的某张纹理。
3D(三维纹理):Texture3D是Unity中的一种特殊纹理类型,它由N张X*Y大小的纹理集组成,通常用于模拟体积效果,如雾或烟,或者用于存储和处理三维数据集。它们可以在材质中使用,通过特定的着色器来访问和渲染。
sRGB (Color Texture)
SRGB(Standard Red Green Blue)是一种广泛使用的色彩空间,它模拟了人眼对亮度的感知曲线,特别是在中等亮度水平下。这种色彩空间在计算机图形学中被用来编码和传输图像数据,因为它能够有效地利用人类视觉系统的特性来减少所需的数据量,同时保持视觉上的一致性。
纹理的SRGB设置决定了如何处理纹理数据。当纹理被标记为使用SRGB色彩空间时,Unity会在渲染管道中自动应用伽玛校正(通常是2.2的指数),以确保颜色在屏幕上正确显示。这是因为大多数现代显示器和图形硬件都是按照SRGB色彩空间设计的,它们预期接收已经过伽玛校正的信号。
Alpha Source
纹理的Alpha Source设置决定了Alpha通道的来源。Alpha通道通常用于表示透明度,它是一个介于0(完全透明)和1(完全不透明)之间的值。
Alpha Is Transparency
当启用这个选项时,Unity会扩展颜色并避免在边缘过滤时产生不希望的效果。具体来说,这个设置会将所有完全透明像素(alpha值为0)的RGB颜色改写为与其最邻近非完全透明像素(alpha值大于0)的RGB颜色相匹配的值。这样做的目的是在进行纹理过滤或计算mipmap时,边缘的不透明像素不会与黑色混合,从而避免产生黑边或其他不自然的颜色混合效果。
-
None: 选择此选项意味着纹理不包含Alpha通道,无论原始纹理文件是否包含Alpha信息。这通常用于不需要透明度的纹理。
-
Input Texture Alpha: 如果纹理包含Alpha通道,选择此选项会使用该通道的数据。这是最常见的设置,适用于大多数需要透明度的纹理。
-
From Gray Scale: 此选项会根据输入纹理RGB值的平均值生成Alpha通道。这通常不适用于常规的透明效果,而是用于特定的渲染技术,如法线贴图或环境遮蔽贴图。
Advanced.Non-Power of 2
纹理的"Non-Power of 2"设置决定了纹理图像的尺寸是否必须是2的幂次方。这个设置对于纹理的处理和性能有着重要影响。
-
None(不进行调整)
-
ToNearest (调整到最近的2的幂次方尺寸)
-
ToLargest (调整到最大的2的幂次方尺寸)
-
ToSmallest (调整到最小的2的幂次方尺寸)
通常情况下,ToNearest 选项应用更加广泛
Advanced.Read/Write
纹理(Texture)的Read/Write设置决定了纹理数据是否可以被CPU直接读写。当您在Unity编辑器中将纹理的Read/Write属性设置为开启时,意味着该纹理不仅存在于GPU内存中,用于渲染目的,还会在内存中创建一个副本,以便CPU可以直接访问和修改纹理数据。这通常通过诸如Texture2D.SetPixels和Texture2D.GetPixels等方法实现。
Advanced.Virtual Texture Only
Virtual Texture Only会将大型纹理分割成多个较小的片段,这些片段可以按需加载和卸载,类似于操作系统中的虚拟内存管理。这样,游戏引擎只需要在内存中维护当前可见区域的纹理数据,而不是整个庞大的纹理集。当玩家移动时,新的纹理片段会被加载进来替换旧的片段,而不再需要的片段则可以从内存中移除。
Advanced.Generate Mipmap
Mipmap(多维映射)是一种在三维图形学中广泛使用的技术,用于提高纹理贴图的渲染效率和视觉质量。它通过预计算并存储一系列不同分辨率的纹理图像来实现。这些图像通常是原始纹理的二次方缩小版本,形成一个金字塔状的层次结构。在渲染过程中,根据物体相对于观察者的距离,GPU会选择合适的Mipmap层级进行采样,以减少锯齿效应并提高渲染速度。
Advanced.Generate Mipmap.G Settings.Mipmap Filtering
Box:这是一种简单的过滤方法,通常通过取样周围相邻的像素,然后计算其平均值来完成。
Kaiser:Kaiser是一种更高级的过滤算法,会使用Kaiser窗函数来在重新采样过程中更好地保持图像的质量。相比Box过滤,Kaiser过滤在处理高频细节时可以减少锯齿和模糊效应。如果图片在远处时显示得太模糊,则可以尝试设置为这个选项。Kaiser过滤算法是基于Kaiser窗(Kaiser Window)的,这种算法能够在Mipmap级别递减时提供更锐利的图像效果。
Advanced.Generate Mipmap.G Settings.Preserve Coverage
启用"Preserve Coverage"可以确保即使在屏幕上的纹理缩小到较小尺寸时,alpha通道的透明度变化不会过于突然,从而维持了更为平滑和真实的视觉效果。
Advanced.Generate Mipmap.G Settings.Replicate Border
"Preserve Replicate Border"的作用是在生成Mipmap级别时,防止颜色向外渗透到较低Mipmap级别的边缘。这是通过复制最接近的边界上的纹理颜色来实现的,这样就可以避免在Mipmap级别的边缘产生不自然的颜色变化。这个选项默认是禁用的,但在需要维护边缘颜色一致性的情况下应该启用它。
Advanced.Generate Mipmap.G Settings.Fadeout to Gray
"Fadeout to Gray"选项允许开发者在纹理的MIP级别递进时使纹理逐渐淡化至灰色。这个设置通常用于细节贴图,以便在游戏或应用程序中模拟物体表面的磨损或灰尘效果。当启用此设置时,纹理的外层MIP级别会首先开始褪色,随着MIP级别的递减,整个纹理会逐渐变成灰色调。
Advanced.Generate Mipmap.Mipmap Limit
当"Preserve Mipmap Limit"被启用时,Unity会根据预设的限制生成Mipmaps,而不是生成所有可能的Mipmap级别。
Advanced.Generate Mipmap.Mipmap Limit.Mipmap Limit Group
它允许开发者将纹理分组并为每个组设置不同的Mipmap尺寸限制。这个选项的目的是为了更精细地控制不同纹理的Mipmap层次,以优化性能和图像质量。通过使用"Mipmap Limit Group",可以根据纹理的特性和用途,为不同的纹理分别设置Mipmap尺寸限制,从而在游戏或应用中实现更高效的纹理管理。
例如,可以将游戏中的角色纹理和环境纹理分为不同的组,并分别设置适合的Mipmap尺寸限制。这样,可以在保证角色纹理清晰度的同时,减少环境纹理的内存占用,从而在性能敏感的应用中取得更好的平衡。
Advanced.Generate Mipmap.Stream Mipmap Levels
Stream Mipmap Levels是纹理串流系统的一个功能,它允许游戏引擎根据摄像机的位置只加载对应的Mipmap Level到显存中,而不是一次性加载所有级别的Mipmap。这种技术可以节省GPU内存,尤其是在处理大量纹理时更为有效。
Advanced.Swizzle
Texture Swizzle指的是改变纹理颜色通道数据的排列顺序。这个过程通常用于着色器编程,以便根据需要重新组织纹理数据,以适应特定的计算或视觉效果。Swizzle操作可以让你从一个固定的颜色通道顺序(RGBA)中提取出不同的组合,或者将它们重新组合成新的顺序。
Wrap Mode
纹理的包裹模式(Wrap Mode)决定了当纹理坐标超出[0,1]范围时如何处理。这对于确保纹理在不同的表面和物体上正确地平铺或拉伸至关重要。以下是Unity中各个Wrap Mode选项的详细解释及其对纹理的影响:
Clamp Mode (边界限制模式)
当纹理坐标超出[0,1]范围时,Clamp模式会将坐标限制在这个范围内,使得纹理的边缘被拉伸或挤压以适应超出的部分。
Repeat (重复模式)
Repeat模式会在纹理坐标超出[0,1]范围时,将纹理沿着其U和V轴进行平铺,直到覆盖所需的区域。
Mirror (镜像模式)
Mirror模式在纹理坐标超出[0,1]范围时,会沿U和V轴镜像重复纹理,创造出对称的效果。
Mirror Once (镜像一次模式)
Mirror Once模式在纹理坐标超出[0,1]范围时,会镜像重复纹理一次,然后继续以Clamp模式进行处理。
Per-axis (单个轴的分配模式)
Per-axis模式允许分别控制U轴和V轴的包裹模式,可以独立设置为Clamp、Repeat或Mirror。
Filter Mode
纹理的过滤模式(Filter Mode)是用来控制纹理在经过3D变换拉伸时如何进行插值处理的设置。这个设置对于纹理的显示质量和性能有着重要影响。Filter Mode通常有三个选项:Point、Bilinear和Trilinear。
Point (像素点采样)
Point过滤模式是最基本的过滤方式,它使用最近邻插值来处理纹理。这意味着当纹理被放大或缩小时,它会选择最接近的纹理样本点来填充目标像素,而不会进行任何平滑处理。这种模式会导致明显的像素化效果,尤其是在纹理被拉伸时。Point模式适用于需要清晰边缘和像素艺术风格的场景。
Bilinear (双线性插值)
Bilinear过滤模式提供了比Point模式更平滑的纹理效果。它通过对四个最近邻纹理样本点进行线性插值来计算目标像素的颜色值。这种方式可以减少锯齿和像素化,使得纹理看起来更加平滑。Bilinear模式适合大多数普通的游戏和应用场景,因为它在保证视觉质量的同时,对性能的影响相对较小。
Trilinear (三线性插值)
Trilinear过滤模式是在Bilinear的基础上进一步改进的,它不仅考虑了纹理的二维插值,还包括了不同Mipmap级别之间的插值。
Mipmap是预过滤的一系列纹理,每一级别的纹理都比前一级小,用于在不同的观察距离上提供合适的细节水平。Trilinear过滤能够在更广泛的距离范围内平滑处理纹理,减少因Mipmap级别变化带来的视觉跳跃。这种模式适用于需要高质量纹理显示的场景,如模拟环境或高清游戏。
Aniso Level (各向异性采样等级)
在单个纹理的导入设置中,Aniso Level的值从0到16不等,其中0代表禁用,1代表基本禁用,而更高的值表示应用不同程度的各向异性过滤。如果项目设置为“Forced On”,则Aniso Level的值被限制在9到16之间。
项目设置中的各向异性纹理(Quality Settings > Anisotropic Textures):这里可以设置全局的各向异性纹理级别,有三个选项:
Disabled(禁用):关闭所有纹理的各向异性过滤。 Per Texture(每个纹理):允许单独为每个纹理设置各向异性级别。 Forced On(强制打开):强制为所有纹理启用各向异性过滤,并且可以设置一个范围(通常是9到16),除非特定纹理的Aniso Level设置为0,这种情况下该纹理始终是禁用的。
FAQ
sRGB 选项应用场景及注意事项?
颜色准确性:对于Albedo(漫反射)、Emissive(发光)、Ramp(渐变色)等颜色贴图,勾选SRGB可以确保纹理在游戏中显示的颜色与艺术家在图像编辑软件中预览的颜色相匹配。这是因为这些贴图通常包含颜色信息,需要在屏幕上正确再现。
避免色彩失真:对于Normal(法线)、Mask(遮罩)、Metallic(金属度)等数据纹理,不需要勾选SRGB,因为这些纹理包含的是物理属性数据,而不是颜色信息。如果对这些纹理应用伽玛校正,可能会导致颜色失真和不正确的光照效果。
性能优化:在Shader中不使用SRGB与Linear转换函数的前提下,勾选SRGB可以让Unity在内部处理纹理时自动应用伽玛校正,从而优化渲染性能。这是因为Unity会在Shader中进行相应的预处理,相当于在Shader中使用了转换函数,减少了额外的计算开销。
数据类型转换:勾选SRGB后,纹理在内存中的格式会变成带有SRGB后缀的格式,如ETC2_EAC_RGBA8_SRGB。这样,GPU在进行纹理采样时会自动进行伽玛校正,但不会修改原始数据。
使用支持读写的纹理会带来哪些影响?
内存使用的影响
开启Read/Write属性会使得纹理在内存中占用双倍的空间,因为需要维护GPU和CPU之间的数据副本。这对于内存使用量是一个显著的增加,尤其是在处理大量纹理数据时。
性能的影响
虽然Read/Write属性允许更灵活的纹理数据处理,但这种灵活性是以牺牲性能为代价的。直接在CPU上操作纹理数据通常比分块传输数据到GPU然后进行处理要慢,尤其是在处理高分辨率纹理时。此外,频繁的读写操作可能会导致性能瓶颈,尤其是在帧率敏感的应用中。
Unity 如何处理Android Runtime环境下非2次幂的纹理?
使用非2的幂次方的纹理会带来哪些影响?
纹理压缩产生的影响
Unity默认倾向于对宽度和高度都是2的幂次方的纹理进行压缩,以减小内存占用。如果纹理的尺寸是非2的幂次方,Unity将无法应用标准的压缩格式,并对纹理进行Fallback处理,从而增加纹理在内存中的开销。
纹理过滤和映射的影响
某些图形API对非2的幂次的纹理支持有限,可能不支持所有的纹理过滤模式或者纹理包裹模式。这可能限制了纹理在3D空间中的使用,尤其是在需要重复贴图或者进行复杂变换时。
渲染性能影响
使用2的幂次方尺寸的纹理可以提高渲染性能,因为它们可以更好地对齐到GPU的纹理缓存。非2的幂次的纹理可能会导致缓存利用率下降,从而影响性能。
对内存的影响
非2的幂次的纹理可能会导致更多的内存浪费,因为GPU可能无法有效地填充这些纹理的内存空间,特别是在使用基于块的压缩格式时。
如何在 Filter Mode 中作出选择?
选择合适的过滤模式取决于项目的具体需求和性能考量。一般来说,如果对纹理的视觉质量要求不是特别高,可以选择Point或Bilinear模式以节省性能。如果追求最佳的视觉效果,尤其是在近距离观看时,Trilinear模式是更好的选择。然而,更高级的过滤模式会增加GPU的计算负担,因此在移动设备或性能受限的平台上需要谨慎使用。
如何使用Stream Mipmap Levels功能?
启用和配置Stream Mipmap Levels
您需要在Unity的Quality Settings中勾选"Texture Streaming"选项。启用后,您可以设置与Mipmap Streaming相关的特定设置,包括内存预算(Memory Budget)和最大Mipmap减少级别(Max Level Reduction)。内存预算决定了Unity使用的纹理内存的最大值,而Max Level Reduction决定了在超过预算时可以丢弃的最高Mipmap级别。
配置纹理以支持Stream Mipmap Levels
要使纹理支持Stream Mipmap Levels,您需要在Texture Asset的Inspector窗口中的Advanced设置中勾选"Streaming Mipmaps"选项。对于Android平台开发,还需要在Build Settings中使用LZ4或LZ4HC的压缩格式,因为Unity依赖于这些压缩方法来实现异步纹理加载,这是Mipmap Streaming系统的基础。
调整Mipmap Streaming的行为
你可以通过设置"Mip Map Priority"来调整纹理在Mipmap Streaming系统中分配资源的优先级。Priority值越大,优先级越高,范围为-128到127。此外,您还可以通过添加Streaming Controller组件到摄像机上来控制Mipmap Streaming的行为,包括调整Mip偏移量。
调试Mipmap Streaming
Unity提供了内置的Mipmap Streaming调试视图模式,可以在Scene视图中显示游戏对象在Mipmap Streaming系统中的状态。这有助于开发者监控和调整Mipmap的加载和卸载。
注意事项: Mipmap Streaming默认只在Play Mode下启用,但可以在Editor Settings中设置它在Editor和Play两个模式中是否启用。 在使用Stream Mipmap Levels时,Unity优先考虑Max Level Reduction值而不是内存预算,即使这可能导致内存预算被超过。 某些系统,如Decal projector文本ures和Reflection probe textures,可能需要手动设置请求的Mipmap级别,否则Unity可能无法计算正确的Mipmap级别,导致纹理质量下降。