5 分钟写出第一个 Godot 着色器:呼吸灯与扫描线实战
【免费下载链接】godotGodot Engine – Multi-platform 2D and 3D game engine项目地址: https://gitcode.com/GitHub_Trending/go/godot
你想给 Godot 游戏里的角色加一圈呼吸光晕,可打开着色器编辑器只看到一句shader_type canvas_item;,然后就不懂往下写了。这篇教程让你 5 分钟内跑通第一个 Godot 着色器效果:贴代码、看光晕呼吸、改参数、做 3D 扫描线,遇到参数不生效时也知道往哪查。
先跑通一个呼吸灯效果
原理放后面,先让它动起来。
在场景里选中Sprite2D节点,新建一个Shader资源挂到它的Material上,把下面这段代码贴进去。这段代码在做什么:用一个正弦波把贴图透明度来回推,让画面看起来像在呼吸。
shader_type canvas_item; uniform float speed : hint_range(1.0, 10.0) = 2.0; uniform float strength : hint_range(0.0, 1.0) = 0.5; void fragment() { float pulse = sin(TIME * speed) * 0.5 + 0.5; COLOR = texture(TEXTURE, UV) * vec4(1.0, 1.0, 1.0, pulse * strength); }运行后角色会一亮一暗地循环。把speed拖到 8,呼吸立刻加快。hint_range(1.0, 10.0)这段提示的作用是告诉编辑器:给这个变量画一个 1 到 10 的滑动条,不用你自己做 UI。
💡 提示:写 Godot 着色器第一步是确认
shader_type和节点匹配——canvas_item管 Sprite2D、Label 这类 2D 节点,3D 模型必须写spatial。类型不匹配是"效果完全不显示"的头号原因。
Godot 着色器到底是怎么执行的
用不着懂 GPU 调度,但下面三步值得花两分钟读完:
- 声明阶段:以
uniform开头的变量(可以理解为"暴露给面板的旋钮")会自动出现在检查器面板里,随时可拖。 - 编译阶段:引擎把你的代码翻译成 GPU 能执行的形式,编译逻辑就在源码 servers/rendering/shader_language.cpp 里。写错语法时,编辑器底部的着色器面板会标出第一条报错行。
- 逐像素阶段:
fragment()是逐像素执行的入口,屏幕上一个像素跑一次,一帧跑几十万次。TIME是从运行开始计的秒数,COLOR是这个像素最终的输出颜色——所以不写任何逻辑代码,纯靠这两个内置值就能做出动画。
要记住的核心就一句:着色器不是脚本,是公式。你只负责告诉 GPU"每个像素按什么规则算",执行交给它。
怎么把 2D 效果改成 3D 全息投影
呼吸灯跑通后,3D 版只是换类型、换输出。
把下面这段放进 3D 模型的ShaderMaterial:它在做什么,是把模型的 UV 坐标切成 50 片,每片只点亮上半截,再随时间整体平移,扫描线就沿着模型表面滚动了。
shader_type spatial; void fragment() { float line = step(0.5, fract(UV.y * 50.0 - TIME * 2.0)); ALBEDO = vec3(0.2, 0.8, 1.0) * line; ROUGHNESS = 0.0; }两个数字管全部表现:50.0是扫描线密度(越大越密),2.0是滚动速度。ROUGHNESS = 0.0把粗糙度拉到最低,表面全反光,青色线条才有全息感。
和 2D 的区别只在一组"输出接口":2D 直接给COLOR;3D 拆成ALBEDO(基础颜色)、ROUGHNESS(粗糙程度)等多个旋钮,你只碰需要的即可,其余保持默认。
参数不生效的 3 个原因
为什么别人贴的代码有效果,你的却一片漆黑?十有八九是这三种:
- 类型不匹配:
canvas_item的着色器挂到了 3D 模型上,或反过来。这种情况不报任何错,只是没效果,最具有欺骗性。 - 挂错了节点:效果作用在节点自身或某个子节点上,你却在检查另一个节点。先在场景面板里确认选中项。
- 语法错一个字符:少个分号整段编译失败,编辑器只显示第一条错误。从上往下的第一条红线改起,别跳着修。
⚠️ 注意:改了
speed没反应时,先确认你拖的是检查器里同一个Shader资源——资源列表里点错副本是高频翻车点。
怎么让效果不卡
Godot 着色器跑在 GPU 上,性能上限很高,但两个坏习惯照样掉帧:
- 数一数取纹理的次数:每次
texture(TEXTURE, UV)都有成本,同一张贴图要用两次就存进局部变量,只取一次。 - 关掉用不到的光照:3D 着色器若不需要受光,加上
render_mode unshaded,引擎会跳过整套光照计算,只按你给的颜色出图。
想看引擎自己怎么写着色器,可以去 editor/shader/ 目录翻一翻,里面有大量参数声明和编译期检查的现成写法。
两个现在就能做的动作
- 把呼吸灯改成警报灯:把
sin换成abs(sin),再让strength随时间起伏,观察波形变化如何让光晕从柔和变成急促闪烁。 - 把本文两个效果叠起来:给同一个 3D 模型加扫描线,再让扫描线亮度被呼吸值调制,一个像样的全息投影就成型了。
跑通之后欢迎在评论区说说你把它挂到了什么节点上;觉得有用,点个赞或收藏,下次想加效果时直接翻出来照着改。
【免费下载链接】godotGodot Engine – Multi-platform 2D and 3D game engine项目地址: https://gitcode.com/GitHub_Trending/go/godot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考