导入图像

支持的图像格式

Godot 可以导入以下图像格式:

  • BMP(.bmp)——不支持每像素 16 位的图像。只支持每像素 1 位、4 位、8 位、24 位和 32 位的图像。

  • DirectDraw Surface(.dds)——如果纹理中存在 mipmap,则直接加载。可以使用自定义 mipmap 制作特效。

  • Khronos 纹理 (.ktx) —— 使用 libktx 解码。仅支持 2D 图像。不支持立方体贴图、纹理数组和去填充(de-padding)。

  • OpenEXR(.exr)——支持 HDR(强烈推荐使用在全景天空上)。

  • Radiance HDR(.hdr)——支持 HDR(强烈推荐使用在全景天空上)。

  • JPEG(.jpg.jpeg)——由于该格式的限制,不支持透明度。

  • PNG(.png)——导入时精度限制为每个通道 8 位(无 HDR 图像)。

  • Truevision Targa(.tga

  • SVG (.svg) - SVGs are rasterized using ThorVG when importing them. Support is limited; complex vectors may not render correctly. Text must be converted to paths; otherwise, it won’t appear in the rasterized image. You can check whether ThorVG can render a certain vector correctly using its web-based viewer. For complex vectors, rendering them to PNGs using Inkscape is often a better solution. This can be automated thanks to its command-line interface.

  • WebP(.webp)——WebP 文件支持透明,也支持有损和无损压缩。精度限制是每通道 8 位。

备注

如果你从源代码编译 Godot 编辑器时禁用了特定的模块,某些格式可能无法使用。

导入纹理

Godot 中的默认操作是将图像导入为纹理。纹理存储在显存中。纹理的像素数据无法直接从 CPU 访问,除非在脚本中将它们转换回 Image。这就是使绘制纹理变得高效的原因。

在文件系统面板中选择图像后,可以调整十多个导入选项:

在文件系统面板中选择图像后,导入面板中的导入选项

在文件系统面板中选择图像后,导入扩展面板中的导入选项。其中一些选项仅在某些压缩模式下可见。

更改导入类型

可以在“导入”面板中选择其他导入资源的类型:

  • BitMap: 1 位单色纹理(旨在用作 TextureButtonTouchScreenButton 中的点击遮罩)。此资源类型无法直接显示在 2D 或 3D 节点上,但可以使用 get_bit 从脚本中查询像素值。

  • Cubemap: 将纹理导入为 6 面的立方体贴图,并在立方体贴图的侧面(无缝立方体贴图)之间进行插值,可以在自定义着色器中进行采样。

  • CubemapArray: 将纹理导入为 6 面立方体贴图的集合,可以在自定义着色器中进行采样。此资源类型仅在使用 Forward+ 或 Forward 移动渲染方法时才能显示,而在兼容渲染方法是不能显示。

  • Font Data (Monospace Image Font): (字体数据,等宽图像字体)将图像导入为位图字体,其中所有字符都具有相同的宽度。请参阅 使用字体

  • Image: 按原样导入图像。此资源类型无法直接显示在 2D 或 3D 节点上,但可以使用 get_pixel 从脚本中查询像素值。

  • Texture2D: 将图像导入为 2 维纹理,适合在 2D 和 3D 表面上显示。这是默认的导入模式。

  • Texture2DArray: 将图像导入为二维纹理的集合。 Texture2DArray 类似于 3 维纹理,但层之间没有插值。内置 2D 和 3D 着色器无法显示纹理数组,因此必须在 2D3D 中创建自定义着色器,以显示纹理数组中的纹理。

  • Texture3D: 将图像导入为 3 维纹理。这 不是 应用到 3D 表面上的 2D 纹理。 Texture3D 类似于纹理数组,但在层之间进行插值。 Texture3D 通常用于 体积雾Environment 3D LUT 颜色校正和自定义着色器中的 FogMaterial 密度图。

  • TextureAtlas: 将图像导入为不同纹理的 图集 。可用于减少动画 2D 精灵的内存使用量。由于缺少内置 3D 着色器的支持,仅支持 2D。

检测 3D

默认的导入选项(不带 mipmap 并且使用 Lossless 压缩)适合 2D,对于大多数 3D 项目而言并不理想。检测 3D能够让 Godot 关注纹理在 3D 场景中的使用(例如用作 BaseMaterial3D 的纹理)。一旦使用,就会将部分导入选项进行修改,这样纹理标志就对 3D 更友好。除非修改了 检查 3D > 压缩至,否则此时就会启用 mipmap 并将压缩模式修改为 VRAM Compressed。纹理会自动进行重新导入。

检测到纹理在 3D 中使用时会在“输出”面板中打印一个消息。

如果纹理检测到在 3D 中使用后遇到了质量问题(例如像素风纹理),请在用于 3D 之前修改 检查 3D > 压缩至 选项,或者在用于 3D 之后将 压缩 > 模式 修改为 Lossless。这样比禁用检测 3D 更好,因为仍然会启用 mipmap 生成,从远处观察纹理就不会感觉模糊。

导入选项

参见

在 Godot 4.0 中,对纹理过滤模式以及重复模式的修改不再位于导入选项中。

现在,2D 中需要在 CanvasItem 的属性中对纹理过滤模式和重复模式进行修改(项目设置中可以设置默认值),3D 中则是针对材质进行配置。在自定义着色器中,sampler2D uniform 的过滤和重复模式使用提示修改,见 着色语言 文档。

压缩 > 模式

图像是游戏中最大的资产之一。要实现高效的处理,就需要进行压缩。Godot 提供了很多压缩方法,可以根据实际情况选用。

  • Lossless:无损压缩。这是 2D 资产的默认压缩模式,也是最常用的压缩模式。显示资产时不会有任何失真,磁盘压缩也比较合适。但如果与 VRAM 压缩相比,使用的显存就明显要更多。这也是像素画的推荐设置。

  • Lossy:有损压缩。适合较大的 2D 资产。会有一些失真,但是比 VRAM 压缩要少,文件大小比无损压缩以及 VRAM 未压缩要小好几倍。这个模式不会降低显存占用;与无损压缩和 VRAM 未压缩相同。

  • VRAM Compressed:VRAM 压缩。这是 3D 资产的默认压缩模式,也是最常用的压缩模式。会降低磁盘上的大小,显存占用也会显著降低(通常是 4 到 6 倍)。应该避免在 2D 中使用这个模式,因为会有明显的失真,在低分辨率纹理上尤为明显。

  • VRAM Uncompressed:VRAM 未压缩。仅适用于不能压缩的格式,例如原始浮点数图像。

  • Basis Universal:这也是一种 VRAM 压缩模式,编码后的纹理格式为能够在加载时转码为大多数 GPU 压缩格式。这样得到的文件就很小,能够利用 VRAM 压缩,但相对于 VRAM 压缩而言质量较差,压缩耗时也更长。显存占用通常和 VRAM 压缩相同。Basis Universal 不支持浮点数图像格式(引擎会在内部回退至 VRAM 压缩)。

备注

即便在 3D 中,“像素画”纹理也应该禁用 VRAM 压缩,因为压缩会对外观产生负面影响,较低的分辨率也无法得到显著的性能提升。

这张表对这五个选项进行了横向比较,列出了各自的优缺点(good = 最好、bad = 最差):

压缩模式

Lossless

Lossy

VRAM Compressed

VRAM Uncompressed

Basis Universal

描述

存储为无损 WebP / PNG

存储为有损 WebP

根据平台不同,存储为 S3TC、BPTC 或 ETC2

存储为原始像素

转码至 VRAM Compressed 格式

磁盘占用

regular

good 非常小

regular

bad

good 非常小

内存占用

bad

bad

good

bad

good

性能

regular 普通

regular 普通

good

regular 普通

good

质量损失

good

regular 轻微

bad 中等

good

bad 中等

加载时间

bad

bad

good

regular 普通

regular 普通

单张 RGBA8 纹理启用 mipmap 后的预估内存占用:

纹理大小

Lossless

Lossy

VRAM Compressed

VRAM Uncompressed

Basis Universal

128×128

good 85 KiB

good 85 KiB

good 21 KiB

good 85 KiB

good 21 KiB

256×256

good 341 KiB

good 341 KiB

good 85 KiB

good 341 KiB

good 85 KiB

512×512

good 1.33 MiB

good 1.33 MiB

good 341 KiB

good 1.33 MiB

good 341 KiB

1024×1024

regular 5.33 MiB

regular 5.33 MiB

good 1.33 MiB

regular 5.33 MiB

good 1.33 MiB

2048×2048

bad 21.33 MiB

bad 21.33 MiB

regular 5.33 MiB

bad 21.33 MiB

regular 5.33 MiB

4096×4096

bad 85.33 MiB

bad 85.33 MiB

bad 21.33 MiB

bad 85.33 MiB

bad 21.33 MiB

备注

在上表中,没有 Alpha 通道 (RGB8) 的图像,内存使用量将减少 25%。禁用了 mipmap 的图像,内存使用量将进一步减少 25%。

请注意,在分辨率较高的情况下,VRAM 压缩的影响要大得多。 当 VRAM 压缩采用 4:1 的压缩比(对于 S3TC 的不透明纹理为 6:1)时,可以在 GPU 上使用相同数量显存的同时,有效地使纹理在每个轴上增大两倍。

VRAM 压缩还减少了采样纹理所需的内存带宽,这可以加快在内存带宽受限场景中(集成显卡和移动设备上常见)的渲染速度。综合这些因素,对于具有高分辨率纹理的 3D 游戏来说,VRAM 压缩技术是必备条件之一。

可以在文件系统停靠栏中双击纹理,然后查看检查器,来预览纹理占用的内存量:

在检查器中预览纹理

在检查器中预览纹理。图片来源:Red Brick 03 - Poly Haven

压缩 > 高质量

备注

高质量 VRAM 纹理压缩仅在 Forward+ 和 Forward 移动渲染方法中受支持。

使用兼容渲染方法时,此选项始终被视为禁用。

如果启用,则会在桌面平台上使用 BPTC 压缩,而在移动平台上使用 ASTC 来进行压缩。使用BPTC 时,BC7 用于 SDR 纹理,BC6H 用于 HDR 纹理。

如果禁用(默认),则在桌面平台上使用速度更快但质量较低的 S3TC 压缩,在移动/Web 平台上使用 ETC2。使用 S3TC 时,DXT1 (BC1) 用于不透明纹理,DXT5 (BC3) 用于透明或法线贴图( RGTC)纹理。

BPTC 和 ASTC 支持 HDR 纹理的 VRAM 压缩,但 S3TC 和 ETC2 不支持(请参阅下面的 HDR 压缩 )。

压缩 > HDR 压缩

备注

此选项仅对在 Godot 中以 HDR 格式导入的纹理( .hdr.exr 文件)有影响。

如果设置为 禁用,则无论 HDR 纹理是否透明,都不会使用 VRAM 压缩。相反,纹理会被转换为 RGBE9995(每个通道 9 位 + 5 位指数 = 每个像素 32 位),以减少内存使用量(与半浮点或单精度浮点图像格式相比)。

如果设置为 Opaque Only(默认),则只对不透明的 HDR 纹理使用 VRAM 压缩。这是由于 HDR 格式的限制,因为没有同时支持透明度的 VRAM 压缩 HDR 格式。

如果设置为 Always ,即使是带有 alpha 通道的 HDR 纹理也会强制压缩 VRAM。为此,在导入时会丢弃 alpha 通道。

压缩 > 法线贴图

将纹理用作法线贴图时,仅需要红色和绿色通道。鉴于常规纹理压缩算法产生的伪影在法线贴图中看起来不太好, RGTC 压缩格式最适合这种数据。将此选项强制设置为 Enabled 将使 Godot 导入 RGTC 压缩的图像。默认情况下,它被设置为 Detect ,这意味着如果纹理一旦被用作法线贴图,则会将其更改为 Enabled 并自动重新导入。

请注意, RGTC 压缩会影响生成的法线贴图图像。你必须调整使用法线贴图蓝色通道的自定义着色器,以便将此考虑在内。内置材质着色器已经忽略了法线贴图中的蓝色通道(与实际法线贴图的内容无关)。

在下面的示例中,采用 RGTC 压缩技术的法线贴图能够更好地保留细节,同时使用与标准 RGBA VRAM 压缩贴图相同的内存量:

使用标准 VRAM 压缩的正常贴图(左)和使用 RGTC VRAM 压缩的正常贴图(右)

使用标准 VRAM 压缩的正常贴图(左)和使用 RGTC VRAM 压缩的正常贴图(右)

备注

Godot 需要法线贴图使用 X+、Y+、Z+ 坐标,即 OpenGL 风格的法线贴图。如果你导入了用于其他引擎的材质,它可能使用的是 DirectX 风格。在这种情况下,就需要通过启用 法线贴图反转 Y 导入选项来转换法线贴图。

可以在 这里 找到关于法线贴图(包括常见引擎的坐标顺序表)的更多信息.

压缩 > 通道打包

如果设置为 sRGB Friendly(默认),则会阻止使用 RG 颜色格式,因为它不支持 sRGB 颜色。

如果设置为**Optimized**,则在纹理不使用蓝色通道的情况下允许使用 RG 颜色格式。

第三个选项 Normal Map (RG Channels) 适用于分层纹理(CubemapCubemapArrayTexture2DArrayTexture3D)。这将强制以 RG 颜色格式导入纹理的所有图层,以减少内存使用,只保留红色和绿色通道。这只会对使用 VRAM CompressedBasis Universal 压缩模式的纹理产生影响。

Mipmap > 生成

如果启用,则会在导入时生成较小版本的纹理。例如,一个 64×64 的纹理会生成 6 个 mipmap(32×32、16×16、8×8、4×4、2×2、1×1)。这样做有几个好处:

  • 纹理在远处(三维)或因相机缩放或 CanvasItem 缩放而缩小(二维)时不会变得粗糙。

  • 如果纹理在远处显示,性能会有所提高,因为对原始纹理的较小版本进行采样速度更快,所需的内存带宽也更少。

Mipmap 的缺点是会增加大约 33% 的内存使用量。

建议在 3D 中启用多级渐进纹理(Mipmap)。但在 2D 中,只有在项目明显受益于启用多级渐进纹理时才应启用。如果摄像机从未大幅缩放,则启用 Mipmap 不会带来任何好处,反而会增加内存使用量。

Mipmap > 限制

警告

Mipmap > 限制 当前未实现,更改该设置也无效。

如果设置的值大于 -1 ,则会限制可生成的 mipmap 的最大数量。如果不希望纹理在极远距离上变得分辨率过低,可以减少该值,但代价是会产生一些颗粒感。

粗糙度 > 模式

将此纹理视为粗糙度贴图的颜色通道。仅当 粗糙度 > 原法线 不为空时才有效。

Roughness > Src Normal

纹理的路径被视为导入时粗糙度过滤(roughness filtering)的法线贴图。指定此项有助于略微减少 3D 中的镜面反射锯齿。

导入时的粗糙度过滤仅用于 3D 渲染,不适用于 2D。

处理 > 修复 Alpha 边框

这样会使周围颜色相同的像素从透明过渡到非透明。对于使用双线性过滤显示的纹理,这有助于减轻从图像编辑器导出图像时的轮廓效果。

../../_images/fixedborder.png

建议启用此功能(默认情况下),除非这会导致特定图像出现问题。

处理 > 预乘 Alpha

使用 修复 Alpha 边框 修复变暗边框的另一种方法是使用预乘 Alpha。通过启用此选项,纹理将转换为此格式。预乘 Alpha 纹理需要特定材质才能正确显示:

  • 在 2D 中,需要创建并配置 CanvasItemMaterial,以便在使用此纹理的 CanvasItem 上使用 预乘 Alpha 混合模式。

  • 在 3D 中,尚且不支持预乘 alpha 混合模式,因此,这个选项仅适用于 2D。

处理 > 法线贴图翻转 Y

Godot 需要法线贴图使用 X+、Y+、Z+ 坐标,即 OpenGL 风格的法线贴图。如果你导入了用于其他引擎的材质,它可能使用的是 DirectX 风格。在这种情况下,就需要通过启用 法线贴图反转 Y 导入选项来转换法线贴图。

可以在 这里 找到关于法线贴图(包括常见引擎的坐标顺序表)的更多信息.

处理 > HDR 作为 sRGB

你能在网上找到的一些 HDR 图像可能已损坏,并包含 sRGB 颜色数据(而不是线性颜色数据)。建议不要使用这些文件。如果你绝对必须需要这样做,启用此选项将使这些文件看起来是正常的。

警告

在格式良好的 HDR 图像上启用 HDR 作为 sRGB 会导致生成的图像看起来太暗。因此,如果你不确定,请将此选项禁用。

处理 > HDR 限制曝光

你能在网上找到的一些 HDR 全景图像中可能包含非常明亮的像素,因为这些图像直接取自于现实生活,没有经过任何裁剪处理。

虽然这些 HDR 全景图像与现实生活非常接近,但在用作天空背景时,这可能会导致 Godot 生成的辐射度贴图包含闪烁。这可以在材质反射中看到(在极端情况下甚至可以在粗糙的材质上看到)。启用 HDR Clamp Exposure 可以解决这个问题,它使用的是一种智能钳制公式,不会引入 可见的 裁剪 — 当观察背景天空时,辉光将继续发挥作用。

处理 > 大小限制

如果设置为大于“0”的值,则纹理的大小会在导入时被限制至小于等于该值。对于非正方形纹理,尺寸限制会影响较长边,并且会缩放较短边以保持纵横比。调整大小使用三次插值法。

这可以用于在不影响源图像的情况下减少内存使用,或避免在移动/网络平台上纹理无法显示的问题(因为这些平台通常无法显示大于4096×4096的纹理)。

检查 3D > 压缩至

这会改变当检测到纹理被用于 3D 时使用的 压缩 > 模式 选项。

只有当检测到纹理被用于 3D 时,更改这个导入选项才会生效。将其更改为**禁用**然后重新导入不会改变纹理上已有压缩模式(如果它被检测到用于3D),但选择 VRAM压缩**或 **Basis Universal 则会改变。

SVG > 缩放

这仅适用于 SVG 图像。

SVG 应呈现的比例,其中 1.0 为原始设计尺寸。数值越大,图像越大。请注意,与字体过采样不同,这会影响 SVG 在 2D 中呈现的物理尺寸。另请参阅下面的 编辑器 > 使用编辑器缩放比例

编辑器 > 使用编辑器缩放

这仅适用于 SVG 图像。

如果为 true,则会缩放导入的图像以匹配编辑器的显示比例因子。应该为编辑器插件图标和自定义类图标启用此功能,否则这个功能应保持禁用状态。

Editor > Convert Colors With Editor Theme

这仅适用于 SVG 图像。

如果选中,则会转换导入图像的颜色以匹配编辑器的图标和字体调色板。这假设图像使用与 ref:’ Godot 自己的编辑器图标: <doc_editor_icons>’ 调色板完全相同的颜色,源文件是为深色编辑器主题设计的。这应该先启用编辑器插件图标和自定义类图标,否则应保持禁用状态。

导入包含文本的 SVG 图像

由于 Godot 中使用的 SVG 库不支持对 SVG 图像中的文本进行光栅化,因此必须首先将文本转换为路径。否则,文本将不会出现在光栅化图像中。

有两种方法可以无损地实现这一点,因此你可以在之后继续编辑原始文本:

  • Select your text object in Inkscape, then duplicate it in place by pressing Ctrl + D and use Path > Object to Path. Hide the original text object afterwards using the Layers and Objects dock.

  • 使用 Inkscape 命令行从另一个 SVG 文件导出 SVG,并将文本转换为路径:

  1. inkscape --export-text-to-path --export-filename svg_with_text_converted_to_path.svg svg_with_text.svg

最佳实践

在2D中支持没有伪影的高分辨率纹理

为了在高分辨率下支持多种分辨率并保持清晰的视觉效果,你需要使用高分辨率的源图像(适用于你希望支持的最高分辨率而不失真,通常在现代电脑桌面游戏中是 4K)。

有两种方法可以做到这一点:

  • 在项目设置中使用较高基础分辨率(例如4K),然后以原始比例使用纹理。这是一种更简单的方法。

  • 在项目设置中使用较低基础分辨率(例如1080p),然后在使用纹理时进行缩小。这通常更加困难,并且可能使脚本中的各种计算变得繁琐,因此推荐使用上面介绍的方法。

在这样做之后,你可能会注意到在较低视口分辨率下纹理变得颗粒状。若要解决这个问题,在导入停靠面板中启用用于 2D 的纹理上的 Mipmaps。这将会增加内存使用。

启用 mipmaps 也可能使纹理看起来更模糊,但你可以通过选择将**渲染 > 纹理 > 默认过滤器 > 纹理 Mipmap 偏差**设置为负值来使纹理更清晰(代价是牺牲一些颗粒感)。

在3D中使用适当的纹理大小

虽然没有“以不变应万变”的建议,但以下是一些在3D中选择纹理大小的一般建议:

  • 纹理的大小应该被调整为和周围物体相比具有一致的纹素密度。虽然在坚持使用 2 的幂的纹理大小时无法确保这一点,但通常可以在整个 3D 场景中保持相对一致的纹理细节。

  • 屏幕上出现的对象越小,其纹理就应该越小。例如,仅出现在背景中的树不需要玩家可能会走近的其他物体那样高的纹理分辨率。

  • 推荐但不必需使用 2 的幂的纹理大小。纹理不必是正方形——像 1024×512 这样的大小也是可以接受的。

  • 尽管使用较大纹理大小会增加内存使用和加载时间,但其带来的收益是递减的。大多数不使用像素艺术风格的现代 3D 游戏平均使用 2048×2048 的纹理,而对于覆盖较小表面的纹理则使用 1024×1024 和 512×512 。

  • 在 3D 中使用基于物理的材质时,你可以通过为某些纹理贴图使用较低的分辨率来减少内存使用和文件大小而不会过于影响质量。这对于仅包含低频细节特征的纹理(例如雪质地的法线贴图)特别有效。

如果你可以控制 3D 模型的建立过程,以下这些技巧也值得探索:

  • 在处理大部分对称的 3D 模型时,你能够使用镜像 UV 来使有效的纹素密度加倍。然而,在人脸上使用这种方法可能看起来不自然。

  • 在使用低多边形风格和纯色处理3D模型时,你可以依赖顶点颜色而非纹理来表示模型表面的颜色。

参见

可以使用运行时文件加载和保存在运行时加载和保存图像,包括从导出的项目中。