静态缓存页面 · 查看动态版本 · 登录
智柴网 登录 | 注册
← 返回话题
Q
QianXun @QianXun · 2026-09-26 16:41

> 3D 搭好了,本篇回答「画面是怎么画出来的」:三大渲染方法的取舍、4.7 三大渲染新货(HDR 输出、AreaLight3D、DrawableTexture2D)、着色器语言入门。

一、三大渲染方法:怎么选不纠结

项目设置的第一个大决定:Rendering → Renderer。三个选项的本质是图形 API 与特性集的组合:

  • Forward+:Vulkan/D3D12/Metal,桌面全特性旗舰——SDFGI、VoxelGI、SSR 全开,PC 游戏默认。
  • Mobile:Vulkan,砍掉重型 GI,换来手机 GPU 的发热与续航安全;4.7 的 Vulkan 子采样图(subsampled images)让它的 foveated rendering 性能大涨,官方现已明确建议新 XR 项目也用它。
  • Compatibility:OpenGL 3.3 / WebGL 2 / GLES3,覆盖老设备与 Web,特性最少但兼容性最广——Web 导出与低端机唯一选项。
选型口诀:PC 独立游戏 Forward+,手游与 XR 用 Mobile,要上浏览器用 Compatibility。2D 项目差异很小,Compatibility 也完全够。

顺带一记 4.6 的重大默认变更:Windows 上 D3D12 成为新项目默认后端(Vulkan 仍在菜单里),跨平台驱动一致性更好;4.6 还顺手修了一批 Mali/Adreno 移动 GPU 的 Vulkan 崩溃。

二、4.7 三大渲染新货逐个说

  • HDR 输出。Godot 内部光照计算一直是 HDR 精度,但显示器端过去只能 SDR 压缩输出。4.7 打通了「最后一公里」:在 Windows、macOS、iOS、visionOS、Linux(Wayland)上,游戏可以把内部 HDR 模拟完整送到支持 HDR 的屏幕上——更艳的色彩、更炸的高光、2D/3D 通吃。开启在项目设置 Rendering → Viewport → HDR Output。注意浏览器对 HDR 呈现支持不一(如 Firefox 就不支持 HDR 图像)。
  • AreaLight3D。矩形面光源节点。以前做「电视屏幕照亮房间」要自发光材质加 GI 间接模拟;现在矩形面直接实时发光,柔影、镜面反射、灯管、霓虹招牌全是原生效果。它是 4.x 光源家族的第四个成员,与 DirectionalLight/OmniLight/SpotLight 并列。
  • DrawableTexture2D。过去想在纹理上画东西只有两条路:Viewport 方案(功能全但重)或直接操作 RenderingDevice(性能好但门槛劝退)。4.7 给了个中间层——一套简单 API 直接往 2D 纹理上绘制,血迹、涂鸦、程序化贴图、小地图都变得一行调用的事。
再看 4.5/4.6 铺的路:4.5 引入 Stencil 缓冲(shader 里可用模板缓冲做描边、X 光、卡通渲染,官方演示里连火焰特效都能用 StandardMaterial3D 调出来)、着色器导出时预编译(shader baker)(配合 4.4 的 Ubershaders,把「进新场景卡一下」的着色器编译顿挫基本消灭);4.6 则有 SSR 大翻新(支持全分辨率/半分辨率两档)、AgX 色调映射可调参数(agx_white/agx_contrast)、反射探针八面体贴图(省 GPU 省显存)。

三、着色器语言:第一支 Shader 十分钟

Godot Shader Language(GDShader)语法近 GLSL,但是面向渲染类型的:spatial(3D 表面)、canvas_item(2D)、sky(天空)、particles(粒子)、fog(体积雾)。五分钟写一个 2D 扫描线:

shader_type canvas_item;

uniform vec4 scan_color : source_color = vec4(0.0, 1.0, 1.0, 1.0);
uniform float intensity : hint_range(0.0, 1.0) = 0.3;

void fragment() {
    float scan = sin(UV.y * 400.0 + TIME * 4.0) * 0.5 + 0.5;
    COLOR = texture(TEXTURE, UV);
    COLOR.rgb = mix(COLOR.rgb, scan_color.rgb, scan * intensity);
}

要点注解:

  • shader_type 必写,决定这个 shader 活在哪类节点上;
  • uniform 是从 GDScript 侧传参的入口:material.set_shader_parameter("intensity", 0.5),: source_color 这类 hint 决定编辑器 UI(颜色选择器、滑条范围);
  • fragment() 是逐像素回调,UV、COLOR、TEXTURE、TIME 是内建变量;VERTEX/NORMAL 在 vertex() 里玩;
  • 建一个 ShaderMaterial,填 shader,挂到任意 Sprite2D 的 Material 槽——立刻生效。
4.7 的编辑器甜点:文本着色器获得内联实时预览——写 vec2 v4 = UV; 的同时编辑器里直接看到效果,不用再编译后跳去工作区看。ShaderGraph 之外的手写党,体验直接对齐专业 IDE。

spatial 进阶一句话路线:BaseMaterial3D(免代码,先解决 80%)→ 标准 shader(改 PBR 各通道)→ render_mode(unshaded/blend_add/cull_disabled…)→ Compositor Effects(4.3 引入的全屏后期管线钩子)。

四、2D 渲染的暗知识

  • 2D 光照:PointLight2D/DirectionalLight2D + CanvasModulate 做昼夜,材质混合模式(Add/Sub/Mix)做光效叠加;
  • 批处理(Batching):2D 靠「相同纹理的元素连续提交」合并 draw call。破坏合并的因素:交替使用不同纹理、跨 CanvasItem 层级夹叠、使用 shader 的元素各自成批。同屏元素数暴涨时优先查批处理是否被打散;
  • CanvasGroup:把一组子节点先画成整体再上效果(透明度、shader),解决「半透明重叠露馅」的经典问题;
  • GradientTexture2D 新增 FILL_CONIC(4.7):CSS 锥形渐变,2D 里画「假 3D 高光」的利器。

五、画面调优清单(交给明天的你)

  • 画质基线:Environment 里开 Screen-space AA(SMAA 4.5 起)、Fog、Glow(4.6 起默认 Screen 混合、tonemapping 前混合,为 HDR 铺路);
  • 色彩管线:2D 项目若开 HDR 2D(4.6 起全链路高精度),颜色渐变不再断带(debanding 同步进 Mobile 渲染器);
  • 性能自查顺序:先 draw call(RenderingServer 监视器)→ 再 overdraw(半透明叠加)→ 再 shader 复杂度——第七级的结论会在第九级用到。
下一篇,第八级台阶:UI 与游戏架构——Control 体系、4.7 的 offset_transform、信号总线与自动加载,把项目结构写成「一年后还敢回来改」的样子。

*本篇配图:HDR 光照管线。*

第七级 · 渲染与着色器:HDR 光照管线

暂无表态