- 示例工程
【免费下载链接】godot-demo-projects
Demonstration and Template Projects
导读
本文以 godot-demo-projects 仓库中的 3D Anti-Aliasing 演示项目 为蓝本,系统梳理 Godot 4.x(Forward+ 渲染器)支持的 MSAA、FXAA、SMAA、TAA、SSAA 与 Alpha 抗锯齿六类技术,并结合 anti_aliasing.gd 与 anti_aliasing.tscn 源码,讲清每种技术的质量、性能、模糊与伪影特征,以及多技术叠加组合、渲染缩放与 AMD FidelityFX Super Resolution 1.0 的搭配用法。读完本文,你将能针对不同硬件与画面需求,为 3D 场景做出可验证、可量化的抗锯齿选型。
项目概览:一个可交互的抗锯齿对比试验台
该项目位于仓库3d/antialiasing/目录,是一个官方风格演示项目:所有抗锯齿开关、渲染缩放、V-Sync、FPS 限制都在运行时通过 UI 面板实时切换,右侧 3D 场景包含静态物体、细线条、透明材质、粒子、Decal、自定义 Shader 等多种"容易产生锯齿/伪影"的测试对象,方便横向对比。
- 语言:GDScript
- 渲染器:Forward+(项目还针对
gl_compatibility兼容渲染器做了功能降级适配,见下文) - 入口场景:anti_aliasing.tscn(
project.godot中run/main_scene已指向该场景) - 运行方式:用 Godot 4.7(项目
config/features声明版本)打开仓库根目录或3d/antialiasing/目录后直接运行主场景即可
运行后可直接体验的交互(来自 anti_aliasing.gd):
- 鼠标左/中/右键按住拖动旋转视角,滚轮缩放(相机距离被限制在 1.5~6 之间,源码
camera_distance的clamp); - 键盘
←/→或底部« Previous/Next »按钮在 21 个测试对象之间切换; - 左上角面板实时修改抗锯齿方案,右上角显示当前 FPS 与 3D 帧缓冲实际分辨率。
项目在_ready()中默认禁用 V-Sync(DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)),目的是在高刷新率显示器上解除帧率上限,让性能对比更容易,这也是作者在 anti_aliasing.gd 注释里明确说明的设计意图。
六类抗锯齿技术全景对比
README 以列表形式给出了 Godot 支持的六类 3D 抗锯齿手段。这里按"质量 / 性能成本 / 是否模糊画面"三个维度整理为一张速查表,再逐项展开。
| 技术 | 质量 | 性能成本 | 是否模糊 | 关键注意点 |
|---|---|---|---|---|
| MSAA(多重采样) | 高 | 高 | 不模糊 | 对着色器引发的高光锯齿与 Alpha Scissor 材质无效 |
| FXAA(快速近似) | 低 | 低 | 轻微模糊 | 后处理方案,通吃几何边缘 |
| SMAA(亚像素形态学) | 中 | 中 | 轻微模糊(比 FXAA 轻) | Godot 仅支持空间版本 SMAA 1x |
| TAA(时间性抗锯齿) | 高 | 低 | 轻微模糊(比 FXAA 轻) | 快速运动物体质量下降;低帧率收敛不足;可能产生鬼影 |
| SSAA(超采样) | 最高 | 最高 | 不模糊 | 200% 渲染缩放等价于 4× SSAA |
| Alpha 抗锯齿 | 视模式而定 | 视模式而定 | 否 | 仅作用于透明材质边缘,需配合 MSAA 效果最佳 |
MSAA:高质量、高成本的硬件方案
多重采样抗锯齿通过在每个像素内采集多个采样点来平滑几何边缘,画面不发虚。但 README 明确指出它的两个盲区:
- 着色器引发的锯齿:例如镜面高光(specular aliasing)闪烁,MSAA 无能为力;
- Alpha Scissor 透明材质:裁剪出来的锯齿边缘同样不会被 MSAA 平滑。
因此在演示场景中,你可以看到 anti_aliasing.tscn 专门安排了TransparencyAlphaScissor测试对象,配合左侧Multisample AA下拉框(Disabled / 2× / 4× / 8×)直观验证"MSAA 开了但透明边缘依然有锯齿"的现象。
源码层面,切换动作落在 anti_aliasing.gd:
func _on_msaa_item_selected(index: int) -> void: get_viewport().msaa_3d = index as Viewport.MSAAViewport.msaa_3d的枚举与下拉项一一对应:0关闭、1为 2×、2为 4×、3为 8×。
FXAA 与 SMAA:两类屏幕空间后处理
- FXAA:画面整体后处理,速度最快、质量最低,代价是画面轻微发虚。适合追求性能、对画质不太敏感的场合。
- SMAA:同属后处理,质量与成本居中,比 FXAA 清晰(边缘覆盖更好),但仍会轻微模糊。README 特别说明 Godot只实现 SMAA 1x(空间版本),不包含其时间性扩展。
两者在源码中由同一个screen_space_aa属性控制(anti_aliasing.gd):
func _on_screen_space_aa_item_selected(index: int) -> void: get_viewport().screen_space_aa = int(index) as Viewport.ScreenSpaceAA下拉框三项为Disabled (Fastest)/FXAA (Fast)/SMAA (Average)。
一个关键优势:后处理方案对所有边缘生效,包括 MSAA 处理不了的 Alpha Scissor 边缘与着色器高频细节,这也解释了为什么它们常被用来弥补 MSAA 的不足。
TAA:低成本的时域方案与它的弱点
TAA 借助上一帧历史信息进行时间维度的累积,从而以较低成本获得高质量平滑,并能覆盖包括高光锯齿在内的各类锯齿。README 给出的注意事项:
- 画面有轻微模糊(好于 FXAA);
- 快速运动物体上质量明显下降:低帧率下 TAA 没有足够帧数收敛,运动物体边缘会残留瑕疵。为此项目提供了 FPS Limit 滑块(0~300,步长 10),配合高帧率显卡对比不同帧率下的 TAA 收敛质量;
- 可能产生鬼影(ghosting):尤其当某个材质 Shader 没有正确生成运动矢量时,运动物体后方会出现拖影。
源码开关(anti_aliasing.gd):
func _on_taa_item_selected(index: int) -> void: get_viewport().use_taa = index == 1FPS 限制的实现则在 anti_aliasing.gd:滑块值直接写入Engine.max_fps,值为 0 时界面显示∞(不限帧)。这也是 README 提到"you can use the FPS limit setting provided when TAA is enabled to compare quality between different framerates"的代码落点。
SSAA:用渲染缩放实现的最强方案
SSAA 即超采样:按更高分辨率渲染 3D 场景再降采样到窗口分辨率,是所有方案里画质上限最高、成本也最高的选择,且不引入模糊。
README 给出了一个非常实用的换算关系:
200% 渲染缩放等价于 4× SSAA——因为每个维度都被翻倍。例如在 1920×1080 窗口下把渲染比例设为 200%,3D 帧缓冲实际为 3840×2160。
在演示中你无需依赖窗口设置,直接用Render Scale滑块(范围 25%~200%,步长 1%,见 anti_aliasing.tscn)即可模拟任意强度的 SSAA。右上角的Viewport resolution标签会实时按get_viewport().size * scaling_3d_scale计算并显示 3D 缓冲分辨率(对应 anti_aliasing.gd 的_on_viewport_size_changed),截图画面中的3840×2160即来自 200% 渲染缩放。
源码映射(anti_aliasing.gd):
func _on_render_scale_value_changed(value: float) -> void: get_viewport().scaling_3d_scale = valueAlpha 抗锯齿:透明材质的专属方案
针对transparency = Alpha Scissor(transparency设为 2)的材质,Godot 提供两种 Alpha 抗锯齿模式(README 原话为Alpha Edge Blend与Alpha Edge Clip):
- 与 MSAA 配合时:Godot 在该材质上启用 alpha-to-coverage 渲染,这是最有效的用法;
- MSAA 关闭时:改为在透明区域边缘施加固定抖动图案来模拟平滑。
演示场景 anti_aliasing.tscn 中TransparencyAlphaScissorAntialiasingBlend与TransparencyAlphaScissorAntialiasingClip两个测试对象分别承载两种模式,均设置alpha_antialiasing_edge = 0.3控制边缘过渡范围;旁边还有不带抗锯齿的纯TransparencyAlphaScissor作为对照组,以及TransparencyAlphaBlend(transparency = 1)、TransparencyAlphaHash(transparency = 3,使用alpha_hash_scale = 1.0)和TransparencyDepthPrepass(transparency = 4)等其他透明度处理方式的对照,方便观察不同透明管线下的边缘表现。
多技术叠加:质量与性能的再平衡
README 特别强调:Godot 允许同时启用多种抗锯齿技术。这在实践中非常实用:
- 用MSAA/SSAA打底,平滑几何边缘;
- 再用FXAA/TAA收拾 MSAA 管不到的高光与后处理边缘;
- 或者反过来,用SSAA 抵消 FXAA/TAA 引入的模糊——README 明确指出"SSAA can be used together with FXAA or TAA to counter the blurring added by those algorithms, while further improving antialiasing quality"。
在演示项目里这毫无操作障碍:面板上的 MSAA、Screen-Space AA、Temporal AA 是三个独立开关,可以任意排列组合,边切换边看 FPS 数字(帧耗时以mspf形式同时显示,且 FPS 标签颜色会按 0~180 FPS 渐变映射,见 anti_aliasing.gd),从而量化每种组合的成本。叠加时唯一要注意的是成本累加与模糊叠加,找到"画质可接受、帧率达标"的拐点即可。
渲染缩放与 FSR 1.0:低于 100% 时的画质补救
当 Render Scale 低于 100%(分辨率不足,画面必然变糊)时,面板会浮现AMD FidelityFX Super Resolution 1.0勾选项,把传统的双线性上采样替换为 FSR 1.0 的锐化升频,明显改善低分辨率下的观感。
README 给出了一个容易误解的关键提示:
注意:AMD FidelityFX Super Resolution 1.0不是抗锯齿技术。它最适合与其他抗锯齿方法同时使用。
也就是说 FSR 解决的是"低分辨率下放大模糊"问题,锯齿仍需交由上文的 AA 方案处理,两者是互补关系而非替代关系。
源码实现(anti_aliasing.gd):
func _on_amd_fidelityfx_fsr1_toggled(button_pressed: bool) -> void: get_viewport().scaling_3d_mode = Viewport.SCALING_3D_MODE_FSR if button_pressed else Viewport.SCALING_3D_MODE_BILINEAR配套的FSR Sharpness下拉框映射到Viewport.fsr_sharpness(取值 0.0~2.0),注意这里存在反直觉设定:fsr_sharpness数值越低画面越锐利。项目在 anti_aliasing.gd 中把五个档位映射为:
| 档位 | fsr_sharpness 值 |
|---|---|
| No FSR Sharpness | 2.0 |
| Low FSR Sharpness | 0.8 |
| Medium FSR Sharpness | 0.4 |
| High FSR Sharpness | 0.2 |
| Highest FSR Sharpness | 0.0 |
默认选中 "High"(0.2)。另外注意 FSR 仅在scaling_3d_scale < 1.0时生效,代码里因此在渲染比例回到 100% 以上时自动隐藏 FSR 与锐度控件(anti_aliasing.gd)。
场景设计:为什么这些测试对象能"照妖"
抗锯齿效果好坏离不开合适的测试素材。演示场景在 anti_aliasing.tscn 中布置了 21 个测试对象,可大致分为几类,每一类都对应一类常见锯齿来源:
- 几何类:
StaticObject(双材质方块,含 32× 平铺棋盘纹理的高频图案)、thin_lines.tscn(用PrismMesh尺寸 0.02×1×0.02 拼出的细线网格,专测亚像素细线的闪烁); - 透明类:
TransparencyAlphaBlend/AlphaScissor/AlphaScissorAntialiasingBlend/AlphaScissorAntialiasingClip/AlphaHash/DepthPrepass六个变体,覆盖主流透明度管线; - 运动类:
MovingObject、RotatingObject、ScalingObject、MovingCPUParticles、MovingGPUParticles、MovingDecal,用于检验 TAA 在动态物体上的收敛与鬼影问题,AnimationPlayer自动播放move动画驱动它们; - 着色器类:
ScrollingUVAnimation(滚动 UV)、ScrollingUVCustomShader(Shader 内滚动纹理)、CustomShaderVertexMovement(顶点随机位移),专测自定义 Shader 场景下 TAA 运动矢量缺失导致的拖影——这也与 README"ghosting artifacts … especially if motion vectors are not correctly generated from a given material shader"的警告一一对应; - 粒子/后处理类:CPU/GPU 粒子、
MovingDecal、以及PointRendering(点渲染,use_point_size = true、point_size = 3.2); - 复杂网格类:
ComplexObject实例化自 polyhaven/dutch_ship_medium_1k.gltf 的荷兰帆船模型,作为真实游戏资产的代表。
兼容渲染器(gl_compatibility)下的降级适配
项目虽以 Forward+ 为主(README 明确标注 Renderer: Forward+),但 anti_aliasing.gd 对gl_compatibility渲染器做了完整适配,可作为你在低端/Web 平台的参考模板:
- 检测
RenderingServer.get_current_rendering_method() == "gl_compatibility"; - 隐藏不支持的功能:Screen-Space AA(FXAA/SMAA)与 TAA 面板在兼容渲染器下不可用(
$Antialiasing/ScreenSpaceAAContainer.visible = false等); - 光照补偿:兼容渲染器的 sRGB 混合会让光照偏暗,代码将平行光拆成两份——一份
SKY_MODE_SKY_ONLY只照亮天空,一份light_energy = 0.3只照亮物体(SKY_MODE_LIGHT_ONLY),既补偿能量又不影响天空渲染; - FSR 同理降级:
is_compatibility分支下不再显示 FidelityFX 勾选项(anti_aliasing.gd)。
项目渲染配置与实操建议
project.godot 中与画质相关的几处设置同样值得抄作业:
[rendering] lights_and_shadows/directional_shadow/soft_shadow_filter_quality=3 textures/default_filters/anisotropic_filtering_level=4 textures/decals/filter=4soft_shadow_filter_quality=3:定向光软阴影最高过滤质量;anisotropic_filtering_level=4:各向异性过滤 4×,缓解斜视角纹理模糊;textures/decals/filter=4:Decal 纹理过滤质量。
综合以上内容,可以沉淀出几条可落地的选型建议:
- 旗舰画质:SSAA(Render Scale 150%~200%)打底,必要时叠加 TAA 抵消运动噪声——但先确认显卡帧率撑得住;
- 主流游戏平衡点:MSAA 4× + SMAA(或 FXAA)组合,兼顾几何边缘与后处理边缘,成本可控;
- 性能敏感/移动端:纯 FXAA 或 MSAA 2×,画面轻微模糊可接受;
- 动态画面多(粒子、角色运动):慎用 TAA 或注意材质运动矢量生成;高刷新率显示器上 TAA 鬼影会不那么明显(只要显卡帧率足够,见 anti_aliasing.gd 注释);
- 透明材质多(植被、头发):开启 Alpha 抗锯齿(Blend/Clip),并务必同时打开 MSAA 以启用 alpha-to-coverage;
- 任何场景:Render Scale 低于 100% 时打开 FSR 1.0 挽回观感,但记住它不是 AA,锯齿问题仍需交给真正的 AA 方案。
最后提醒:本仓库为只读资源,运行与对比均在本地 Godot 编辑器进行;演示用素材(荷兰帆船 GLTF 及其贴图位于 polyhaven/ 目录)遵循 CC0 1.0 许可,可直接用于自己的项目。
- 示例工程
【免费下载链接】godot-demo-projects
Demonstration and Template Projects
相关推荐
Silero VAD PyTorch 转 ONNX 实战:三步把语音活动检测跑上任意设备
Silero VAD PyTorch 转 ONNX 实战:三步把语音活动检测跑上任意设备 Silero VAD 是一款企业级开源语音活动检测(VAD)模型,用来
示例工程wgpu抗锯齿:MSAA、FXAA、TAA技术对比
wgpu抗锯齿:MSAA、FXAA、TAA技术对比 引言:图形渲染中的锯齿问题 在实时图形渲染中,锯齿(Aliasing)是一个长期存在的技术挑战。当高分辨率几
图形学3D渲染Godot抗锯齿方案:图像质量优化最佳实践
Godot抗锯齿方案:图像质量优化最佳实践 概述:为什么抗锯齿如此重要? 在现代游戏开发中,图像质量直接影响玩家的游戏体验。锯齿(Aliasing)现象是计算机
文档教程游戏开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考