关于 godot-shaders
面向 Godot 4.7 开发者的着色器编写指南,涵盖 2D、3D 与屏幕空间效果。说明 Godot 着色语言的常用模式及 3.x 到 4.x 的差异。
主要功能
- 01编写 canvas_item 与 spatial 着色器
- 02使用 uniform 暴露可调参数
- 03通过 TIME 和 UV 制作动画
- 04读取屏幕纹理与空间纹理
- 05应用 Godot 4.x 语法与颜色提示
适用场景
- 01制作 2D 溶解、描边或水面效果
- 02编写 3D 边缘光或卡通着色
- 03创建屏幕空间后处理效果
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gamedev-skills/ awesome-gamedev-agent-skills --skill godot-shaders安装后在 Claude Code 中输入/godot-shaders确认已加载。
附带文件references/shading-language.md
详细介绍
Godot 着色器(4.x)
使用 Godot 着色语言编写 canvas_item(2D)和 spatial(3D)着色器,使用 TIME/UV 制作动画,公开 uniform,并读取屏幕内容。目标版本为 Godot 4.7。
适用场景
- 编写
.gdshader代码或使用ShaderMaterial时:2D 效果(描边、溶解、闪光、水面)、3D 表面着色器(边缘光、卡通着色、滚动 UV)或屏幕空间后期效果。
不适用场景: 跨引擎的着色概念(UV、顶点/片段理论)→ shader-programming;粒子/VFX 节点 → 通用 3D;非着色器视觉效果。
核心工作流
- 在第一行选择着色器类型: 2D 使用
shader_type canvas_item;(Sprite2D、TextureRect 以及任何CanvasItem),3D 使用shader_type spatial;。 (此外还有particles、sky、fog。) - 通过
ShaderMaterial附加着色器。 创建ShaderMaterial,指定.gdshader,并将其赋给节点的material。Uniform 会显示在检查器中。 - 编写
fragment()来设置输出:2D 使用COLOR,3D 使用ALBEDO/EMISSION/ALPHA。也可以编写vertex()移动几何体,并编写light()自定义光照。 - **使用带提示的
uniform暴露可调参数,**例如source_color、hint_range,以便编辑并正确管理颜色。 - **使用内置的
TIME制作动画,**并使用texture(tex, UV)采样纹理。 - **通过代码设置 uniform,**使用
material.set_shader_parameter("name", value)。
常用模式
1. 2D(canvas_item):着色 + UV 滚动
shader_type canvas_item;
uniform vec4 tint : source_color = vec4(1.0); // source_color = sRGB-correct color
uniform float scroll_speed : hint_range(0.0, 2.0) = 0.3;
void fragment() {
vec2 uv = UV;
uv.x += TIME * scroll_speed; // scroll horizontally over time
COLOR = texture(TEXTURE, uv) * tint; // TEXTURE = the node's texture
}
2. 使用噪声阈值实现 2D 溶解
shader_type canvas_item;
uniform sampler2D noise : repeat_enable; // a NoiseTexture2D
uniform float amount : hint_range(0.0, 1.0) = 0.0;
void fragment() {
vec4 tex = texture(TEXTURE, UV);
float n = texture(noise, UV).r;
if (n < amount) {
discard; // cut the pixel away
}
COLOR = tex;
}
3. 3D(spatial):发光边缘光
shader_type spatial;
uniform vec4 base_color : source_color = vec4(0.2, 0.5, 1.0, 1.0);
uniform vec3 rim_color : source_color = vec3(0.6, 0.8, 1.0);
uniform float rim_power : hint_range(0.5, 8.0) = 3.0;
void fragment() {
ALBEDO = base_color.rgb;
// VIEW and NORMAL are view-space built-ins; rim is strong at grazing angles.
float rim = pow(1.0 - dot(NORMAL, VIEW), rim_power);
EMISSION = rim_color * rim;
}
4. 读取屏幕的后期效果(4.x 提示,不使用 SCREEN_TEXTURE)
shader_type canvas_item;
// 4.x: declare the screen as a uniform with hint_screen_texture.
uniform sampler2D screen_tex : hint_screen_texture, filter_linear_mipmap;
uniform float blur : hint_range(0.0, 4.0) = 1.0;
void fragment() {
vec2 px = SCREEN_PIXEL_SIZE * blur;
vec4 c = texture(screen_tex, SCREEN_UV);
c += texture(screen_tex, SCREEN_UV + vec2(px.x, 0.0));
c += texture(screen_tex, SCREEN_UV - vec2(px.x, 0.0));
COLOR = c / 3.0;
}
使用 GDScript 设置 uniform:
$Sprite2D.material.set_shader_parameter("amount", 0.7)
常见问题
- 3.x → 4.x 名称变更。
SCREEN_TEXTURE已移除——声明uniform sampler2D x : hint_screen_texture;并使用SCREEN_UV采样。颜色提示hint_color→source_color;hint_albedo/hint_white→source_color;hint_range保持不变。深度/法线使用hint_depth_texture/hint_normal_roughness_texture。 - 输出变量错误。 在
canvas_item中写入COLOR;在spatial中写入ALBEDO(以及EMISSION、ALPHA、ROUGHNESS、METALLIC)。在 spatial 着色器中写入COLOR不会产生任何效果。 - 颜色 uniform 未使用
source_color时会被视为原始线性值,显示效果会不正确(泛白/发暗),因为 Godot 不会将其转换为 sRGB。 - 透明效果需要主动启用(3D)。 若要让
ALPHA < 1.0产生混合效果,请添加渲染模式或设置材质透明度;否则会呈现不透明/裁切效果。 - **对 [0,1] 之外的 UV 采样时,**若未启用
repeat_enable,坐标会被钳制。要平铺/滚动,请在采样器 uniform 中添加: repeat_enable。 - **
TIME是从启动开始计算的秒数,**并会持续增长——周期性效果请使用fract()/mod()循环,以避免精度漂移。 - **
discard在某些硬件上开销较大,**且会破坏提前 Z;可以时优先设置ALPHA/COLOR.a。
参考资料
- 有关各着色器类型的内置变量、渲染模式、
varying、自定义light()、vertex()位移以及视觉着色器图,请阅读references/shading-language.md。
相关技能
shader-programming— 与引擎无关的着色器概念(GLSL/HLSL)。godot-3d-essentials— 材质、环境以及 spatial 着色器所在位置。godot-ui-control— 将着色器应用于 UI 效果。
评论
支持 Markdown