Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
导入图像
支持的图像格式
Godot 可以导入以下图像格式:
Raster:
BMP (
.bmp) - All pixel formats are supported, but RLE compression is not supported.DirectDraw Surface(
.dds)——如果纹理中存在 mipmap,则直接加载。可以使用自定义 mipmap 制作特效。Khronos Texture (
.ktx) - Decoding is done using libktx. Only supports 2D images. Cubemaps, texture arrays, and de-padding are not supported.OpenEXR(
.exr)——支持 HDR(强烈推荐用于全景天空)。Radiance HDR(
.hdr)——支持 HDR(强烈推荐用于全景天空)。JPEG(
.jpg、.jpeg)——由于该格式的限制,不支持透明度。PNG(
.png)——导入时精度限制为每个通道 8 位(无 HDR 图像)。Truevision Targa(
.tga)WebP(
.webp)——WebP 文件支持透明,也支持有损和无损压缩。精度限制是每通道 8 位。
Vector:
SVG (
.svg)By default, SVGs are rasterized at import-time.
SVG is the only image format that can be imported as DPITexture, which allows for run-time rasterization to match the current oversampling factor. See 更改导入类型 for details.
Godot uses the ThorVG library for SVG rendering. SVG feature support is limited; complex vectors may not render correctly. Text must be converted to paths; otherwise, it won't appear in the rasterized image. For complex vectors, rendering them to PNGs using Inkscape is often a better solution. This can be automated thanks to its command-line interface.
You can check whether ThorVG can render a certain vector correctly using its web-based viewer.
备注
如果你从源代码编译 Godot 编辑器时禁用了特定的模块,某些格式可能无法使用。
导入纹理
Godot 的默认操作是将图像导入为纹理。纹理存储在显存中,其像素数据无法直接从 CPU 访问,除非在脚本中将它们转换回 Image。这是使绘制纹理变得高效的原因。
在文件系统面板中选择图像后,可以调整许多导入选项:
在文件系统面板中选择图像后,导入扩展面板中的导入选项。其中一些选项仅在某些压缩模式下可见。
更改导入类型
可以在导入面板中选择其他导入资源的类型:
BitMap:1 位单色纹理(旨在用作 TextureButton 和 TouchScreenButton 中的点击遮罩)。此资源类型无法直接显示在 2D 或 3D 节点上,但可以使用 get_bit 从脚本中查询像素值。
Cubemap:将纹理导入为六面立方体贴图,并在立方体贴图的侧面(无缝立方体贴图)之间进行插值,可以在自定义着色器中进行采样。
CubemapArray:将纹理导入为六面立方体贴图的集合,可以在自定义着色器中进行采样。此资源类型仅在使用 Forward+ 或 Mobile 渲染器时才能显示,而在 Compatibility 渲染器上不能显示。
DPITexture: Only available for SVG images. Similar to Texture2D, but can be re-rasterized at different scales in the editor and at runtime without needing to be reimported. See Font and image oversampling for details.
Font Data (Monospace Image Font):(字体数据,等宽图像字体)将图像导入为位图字体,其中所有字符都具有相同的宽度。请参阅使用字体。
Image:按原样导入图像。此资源类型无法直接显示在 2D 或 3D 节点上,但可以使用 get_pixel 从脚本中查询像素值。
Texture2D:将图像导入为二维纹理,适合在 2D 和 3D 表面上显示。这是默认的导入模式。
Texture2DArray:将图像导入为二维纹理的集合。Texture2DArray 类似于三维纹理,但层之间没有插值。内置 2D 和 3D 着色器无法显示纹理数组,因此必须在 2D 或 3D 中创建自定义着色器,以显示纹理数组中的纹理。
Texture3D:将图像导入为三维纹理。这不是应用到 3D 表面上的 2D 纹理。Texture3D 类似于纹理数组,但在层之间进行插值。Texture3D 通常用于体积雾的 FogMaterial 密度图、particle attractor 向量场、Environment 3D LUT 颜色校正和自定义着色器。
TextureAtlas:将图像导入为不同纹理的图集。可用于减少动画 2D 精灵的内存使用量。由于缺少内置 3D 着色器的支持,仅支持 2D。
对于 Cubemap,预期的图像顺序是 X+、X-、Y+、Y-、Z+、Z-(在 Godot 的坐标系中,Y+ 是“向上”,Z- 是“向前”)。以下是你可以用于 Cubemap 图像的模板(右键点击 > 链接另存为…):
检测 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 资产默认也是最常用的压缩模式。会降低磁盘上的大小,显存占用也会显著降低(通常是四到六分之一)。应该避免在 2D 中使用这个模式,因为会有明显的失真,尤其是低分辨率纹理。
VRAM Uncompressed:VRAM 未压缩。仅适用于不能压缩的格式,例如原始浮点数图像。
Basis Universal:这是另一种 VRAM 压缩模式,编码后的纹理格式能够在加载时转码为大多数类型的 GPU 压缩格式。这样能得到很小且能利用 VRAM 压缩的文件,但代价是相比 VRAM 压缩而言质量更差,压缩耗时也更长。其显存占用通常和 VRAM 压缩相同。Basis Universal 不支持浮点数图像格式(引擎会在内部回退至 VRAM 压缩)。
备注
即便在 3D 中,“像素画”纹理也应该禁用 VRAM 压缩,因为压缩会对外观产生负面影响,且由于像素画较低的分辨率,性能也无法得到显著提升。
这张表对这五个选项进行了横向比较,列出了各自的优缺点(
= 最好、
= 最差):
压缩模式 |
Lossless |
Lossy |
VRAM Compressed |
VRAM Uncompressed |
Basis Universal |
|---|---|---|---|---|---|
描述 |
存储为无损 WebP / PNG |
存储为有损 WebP |
根据平台不同,存储为 S3TC、BPTC 或 ETC2 |
存储为原始像素 |
转码至 VRAM Compressed 格式 |
磁盘占用 |
|
|
|
|
|
内存占用 |
|
|
|
|
|
性能 |
|
|
|
|
|
质量损失 |
|
|
|
|
|
加载速度 |
|
|
|
|
|
单张 RGBA8 纹理启用 mipmap 后的预估内存占用:
纹理大小 |
Lossless |
Lossy |
VRAM Compressed |
VRAM Uncompressed |
Basis Universal |
|---|---|---|---|---|---|
128×128 |
|
|
|
|
|
256×256 |
|
|
|
|
|
512×512 |
|
|
|
|
|
1024×1024 |
|
|
|
|
|
2048×2048 |
|
|
|
|
|
4096×4096 |
|
|
|
|
|
备注
在上表中,如果是没有 Alpha 通道(RGB8)的图像,内存使用量将减少 25%。如果是禁用了 mipmap 的图像,内存使用量将进一步减少 25%。
请注意 VRAM 压缩的影响随着分辨率提高而显著增大。4:1 的 VRAM 压缩(对于 S3TC 的不透明纹理为 6:1)实际上意味着,可以在 GPU 显存消耗不变的同时使用每个轴上增大为两倍的纹理。
VRAM 压缩还减少了采样纹理所需的内存带宽,这可以加快在内存带宽受限场景中的渲染速度(常见于集成显卡和移动设备)。综合这些因素,对于具有高分辨率纹理的 3D 游戏来说,VRAM 压缩技术是必不可少的。
可以在文件系统面板中双击纹理,然后查看检查器,来预览纹理占用的内存量:
在检查器中预览纹理。图片来源:Red Brick 03 - Poly Haven
压缩 > 高质量
备注
高质量 VRAM 纹理压缩仅在 Forward+ 和 Mobile 渲染器中受支持。
使用 Compatibility 渲染器时,此选项始终被视为禁用。
如果启用,在桌面平台上会使用 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 文件)有影响。
如果设置为 Disabled,则无论 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 压缩的法线贴图(右)
备注
Godot 需要法线贴图使用 X+、Y+、Z+ 坐标,即 OpenGL 风格的法线贴图。如果你导入了用于其他引擎的材质,它可能使用的是 DirectX 风格。在这种情况下,就需要通过启用法线贴图反转 Y 导入选项来转换法线贴图。
可以在这里找到关于法线贴图(包括常见引擎的坐标顺序表)的更多信息。
压缩 > 通道打包
如果设置为 sRGB Friendly(默认),则会阻止使用 RG 颜色格式,因为它不支持 sRGB 颜色。
如果设置为 Optimized,则在纹理不使用蓝色通道的情况下允许使用 RG 颜色格式。
第三个选项 Normal Map (RG Channels) 仅适用于分层纹理(Cubemap、CubemapArray、Texture2DArray 和 Texture3D)。这将强制以 RG 颜色格式导入纹理的所有图层,以减少内存使用,只保留红色和绿色通道。RGTC 压缩能够在保持与标准 RGBA VRAM 压缩内存占用相同的同时,更有效地保存细节。这只会对使用 VRAM Compressed 或 Basis Universal 压缩模式的纹理产生影响。
Mipmap > 生成
如果启用,则会在导入时生成较小版本的纹理。例如,一个 64×64 的纹理会生成 6 个 mipmap(32×32、16×16、8×8、4×4、2×2、1×1)。这样做有几个好处:
纹理在远处(3D)或因相机缩放或 CanvasItem 缩放而缩小(2D)时不会变得粗糙。
如果纹理在远处显示,性能会有所提高,因为对原始纹理的较小版本进行采样速度更快,所需的内存带宽也更少。
mipmap 的缺点是会增加大约 33% 的内存使用量。
在 3D 中建议启用 mipmap,然而在 2D 中,应该只有在项目明显受益时才启用。如果相机从未大幅缩放,则启用 Mipmap 不会带来任何好处,反而会增加内存使用量。
Mipmap > 限制
警告
Mipmap > 限制 当前未实现,更改该设置也无效。
如果设置的值大于 -1,则会限制可生成的 mipmap 的最大数量。如果不希望纹理在极远距离上变得分辨率过低,可以减少该值,但代价是会产生一些颗粒感。
粗糙度 > 模式
此纹理中视为粗糙度的颜色通道。仅当粗糙度 > 原法线不为空时才有效。
粗糙度 > 原法线
指向被视作纹理法线贴图的贴图的路径,用于在导入时过滤粗糙度。指定此项有助于略微减少 3D 中的镜面反射锯齿。
导入时的粗糙度过滤仅用于 3D 渲染,不适用于 2D。
处理 > 修复 Alpha 边框
这样会使周围颜色相同的像素从透明过渡到非透明。对于使用双线性过滤显示的纹理,这有助于减轻从图像编辑器导出图像时的轮廓效果。
建议保持此功能启用(默认如此),除非这导致特定图像出现问题。
处理 > 预乘 Alpha
另一种与修复 Alpha 边框不同的修复变暗边框的方法。通过启用此选项,纹理将转换为此格式。预乘 Alpha 纹理需要特定材质才能正确显示:
在 2D 中,需要创建并配置 CanvasItemMaterial,以便在使用该纹理的 CanvasItem 上使用预乘 Alpha 混合模式。在自定义 CanvasItem 着色器中,应该使用
render_mode blend_premul_alpha;。在 3D 中,需要创建并配置 BaseMaterial3D,以便在使用该纹理的材质上使用预乘 Alpha 混合模式。在自定义 Spatial 着色器中,应该使用
render_mode blend_premul_alpha;。
处理 > 法线贴图翻转 Y
Godot 需要法线贴图使用 X+、Y+、Z+ 坐标,即 OpenGL 风格的法线贴图。如果你导入了用于其他引擎的材质,它可能使用的是 DirectX 风格。在这种情况下,就需要通过启用法线贴图反转 Y 导入选项来转换法线贴图。
可以在这里找到关于法线贴图(包括常见引擎的坐标顺序表)的更多信息。
处理 > HDR 作为 sRGB
有一些你在网上找到的 HDR 图像可能已损坏,并包含 sRGB 颜色数据(而不是线性颜色数据)。建议不要使用这些文件。如果你绝对必须这样做,启用此选项将使这些文件看起来正常。
警告
在格式良好的 HDR 图像上启用 HDR 作为 sRGB 会导致生成的图像看起来太暗。因此,如果你不确定,请将此选项禁用。
处理 > HDR 限制曝光
有一些你在网上找到的 HDR 全景图像中可能包含非常明亮的像素,因为这些图像直接取自于现实生活,没有经过任何裁剪处理。
虽然这些 HDR 全景图像与现实生活非常接近,但在用作天空背景时,这可能会导致 Godot 生成的辐射度贴图包含闪烁。这可以在材质反射中看到(在极端情况下甚至可以在粗糙的材质上看到)。启用 HDR 限制曝光可以解决这个问题,它使用一种智能钳制公式,不会引入可见的裁剪——当观察背景天空时,辉光将继续发挥作用。
处理 > 大小限制
如果设置为大于 0 的值,则纹理的大小会在导入时被限制至小于等于该值。对于非正方形纹理,大小限制会影响较长边,并且会缩放较短边以保持纵横比。调整大小时使用立方插值。
这可以用于在不影响源图像的情况下减少内存使用,或避免在移动/Web 平台上纹理无法显示的问题(因为这些平台通常无法显示大于4096×4096的纹理)。
检查 3D > 压缩至
这会改变当检测到纹理被用于 3D 时使用的压缩 > 模式选项。
只有当检测到纹理被用于 3D 时,更改这个导入选项才会生效。将其更改为禁用然后重新导入不会改变纹理上已有压缩模式(如果它被检测到用于 3D),但选择 VRAM Compressed 或 Basis Universal 则会改变。
SVG > 缩放
这仅适用于 SVG 图像。
SVG 应呈现的比例,其中 1.0 为原始设计尺寸。数值越大,图像越大。请注意,与字体过采样不同,这会影响 SVG 在 2D 中呈现的物理尺寸。另请参阅下面的编辑器 > 依照编辑器比例缩放。
编辑器 > 依照编辑器比例缩放
这仅适用于 SVG 图像。
如果为真,则会按照编辑器的显示比例缩放导入的图像。编辑器插件图标和自定义类图标应启用此功能,否则应保持禁用。
编辑器 > 依照编辑器主题转换颜色
这仅适用于 SVG 图像。
如果选中,则会按照编辑器的图标和字体调色板转换导入图像的颜色。这假设图像使用与 Godot 自己的编辑器图标调色板完全相同的颜色,且源文件是为深色编辑器主题设计的。编辑器插件图标和自定义类图标应启用此功能,否则应保持禁用。
导入包含文本的 SVG 图像
由于 Godot 中使用的 SVG 库不支持对 SVG 图像中的文本进行光栅化,因此必须首先将文本转换为路径。否则,文本将不会出现在光栅化图像中。
有两种方法可以无损地实现这一点,以便你在之后继续编辑原始文本:
在 Inkscape 中选择文本对象,然后按 Ctrl + D 将其原地复制,并使用路径 > 对象到路径。然后使用图层和对象面板隐藏原始文本对象。
使用 Inkscape 命令行从另一个 SVG 文件导出 SVG,并将文本转换为路径:
inkscape --export-text-to-path --export-filename svg_with_text_converted_to_path.svg svg_with_text.svg
最佳实践
在 2D 中支持没有伪影的高分辨率纹理
为了在高分辨率下支持多种分辨率并保持清晰的视觉效果,你需要使用高分辨率的源图像(适用于你希望支持的没有模糊的最高分辨率,在现代桌面游戏中通常是 4K)。
有两种方法可以做到这一点:
在项目设置中使用较高基础分辨率(例如 4K),然后以原始比例使用纹理。这是更简单的方法。
在项目设置中使用较低基础分辨率(例如 1080p),然后在使用纹理时进行降采样。这是更困难的方法,并且可能使脚本中的各种计算变得繁琐,因此推荐使用上面介绍的方法。
在这样做之后,你可能会注意到在较低视口分辨率下纹理变得有颗粒感。若要解决这个问题,在导入面板中启用用于 2D 的纹理上的 Mipmaps。这将会增加内存使用。
启用 Mipmap 也可能使纹理看起来更模糊,但你可以通过将渲染 > 纹理 > 默认过滤器 > 纹理 Mipmap 偏差设置为负值来使纹理更清晰(代价是一些颗粒感)。
在 3D 中使用适当的纹理大小
虽然没有“以不变应万变”的建议,但以下是一些在 3D 中选择纹理大小的一般建议:
应该调整纹理的大小,使其和周围物体相比具有一致的纹素密度。在严格使用 2 的幂作为纹理大小时虽无法确保这一点,但通常可以做到在整个 3D 场景中纹理细节保持相对一致。
屏幕上出现的对象越小,其纹理就应该越小。例如,仅出现在背景中的树不需要玩家可能会走近的其他物体那样高的纹理分辨率。
推荐使用 2 的幂的纹理大小,但这不是必需的。纹理不必是正方形——像 1024×512 这样的大小也是可以接受的。
增加纹理大小带来的收益是递减的,尽管增加的内存使用和加载时间不是。大多数不使用像素艺术风格的现代 3D 游戏一般使用 2048×2048 的纹理,而对于覆盖较小表面的纹理则使用 1024×1024 和 512×512。
在 3D 中使用基于物理的材质时,你可以通过为某些纹理贴图使用较低的分辨率来减少内存使用和文件大小,同时不过于影响质量。这对于仅包含低频细节的纹理(例如雪纹理的法线贴图)特别有效。
如果你可以控制 3D 模型的创建过程,以下这些技巧也值得探索:
在处理那些大部分对称的 3D 模型时,你或许能够使用镜像 UV 来使实际纹素密度加倍。不过这在人脸上可能看起来不自然。
在使用低多边形风格和纯色处理 3D 模型时,你可以依赖顶点颜色而非纹理来表示模型表面的颜色。
参见
可以使用运行时文件加载和保存在运行时加载和保存图像,包括导出的项目。
小