Godot Shaders

作者 gamedev-skillsd4b0e35550c5无许可证1.3K 个星标收录于 2026年10月8日更新于 2026年10月8日仓库11天前更新

Write Godot 4.7 shaders in the Godot Shading Language: canvas_item shaders for 2D and spatial shaders for 3D, with vertex/fragment functions, uniforms (source_color, hint_range), TIME/UV animation, and screen-reading via hint_screen_texture. Use when authoring .gdshader files, writing fragment/vertex code, making 2D/3D visual effects, or porting 3.x shaders (SCREEN_TEXTURE, hint_color) to 4.x.

AI 生成的概览

使用 Godot 着色语言编写 Godot 4.x 着色器,涵盖 2D canvas_item 与 3D spatial 效果。

功能
指导编写 .gdshader 文件与配置 ShaderMaterial,面向 Godot 4.7,涵盖 canvas_item(2D)与 spatial(3D)着色器类型、vertex 与 fragment 函数、带 source_color 和 hint_range 等提示的 uniform、TIME/UV 动画,以及通过 hint_screen_texture 读取屏幕。它提供着色、UV 滚动、溶解、自发光边缘光和屏幕空间后处理等示例模式,并给出用 GDScript 设置着色器参数的方法。它还列出常见陷阱与 3.x 到 4.x 的改名,并附一份着色语言参考文档。
适用场景
适用于编写 .gdshader 代码或 ShaderMaterial、制作描边、溶解、闪光、水面等 2D 效果,构建边缘光、卡通、UV 滚动等 3D 表面着色器,或把 Godot 3.x 着色器移植到 4.x。不适用于与引擎无关的着色理论、粒子或特效节点,以及非着色器的视觉效果。
运行要求
不含脚本,仅提供说明和一份参考文档。假定使用 Godot 4.7,并熟悉 ShaderMaterial 与用 GDScript 设置 uniform。

Godot Shaders (4.x)

Write canvas_item (2D) and spatial (3D) shaders in the Godot Shading Language, animate with TIME/UV, expose uniforms, and read the screen. Targets Godot 4.7.

When to use

  • Use when writing .gdshader code or a ShaderMaterial: 2D effects (outline, dissolve, flash, water), 3D surface shaders (rim light, toon, scrolling UV), or screen-space post effects.

When not to use: the cross-engine concepts of shading (UVs, vertex/fragment theory) → shader-programming; particles/VFX nodes → general 3D; non-shader visuals.

Core workflow

  1. Pick the shader type on the first line: shader_type canvas_item; for 2D (Sprite2D, TextureRect, anything CanvasItem) or shader_type spatial; for 3D materials. (particles, sky, fog also exist.)
  2. Attach via a ShaderMaterial. Create a ShaderMaterial, assign your .gdshader, and put it on the node's material. Uniforms appear in the Inspector.
  3. Write fragment() to set the output: COLOR (2D) or ALBEDO/EMISSION/ALPHA (3D). Optionally vertex() to move geometry and light() for custom lighting.
  4. Expose tunables as uniforms with hints (source_color, hint_range) so they are editable and correctly color-managed.
  5. Animate with the built-in TIME and sample textures with texture(tex, UV).
  6. Set uniforms from code with material.set_shader_parameter("name", value).

Patterns

1. 2D (canvas_item): tint + scrolling UV

glsl
shader_type canvas_item;
uniform vec4 tint : source_color = vec4(1.0);     // source_color = sRGB-correct coloruniform 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 dissolve using a noise threshold

glsl
shader_type canvas_item;
uniform sampler2D noise : repeat_enable;          // a NoiseTexture2Duniform 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): emissive rim light

glsl
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. Screen-reading post effect (4.x hint, not SCREEN_TEXTURE)

glsl
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;}

Set a uniform from GDScript:

gdscript
$Sprite2D.material.set_shader_parameter("amount", 0.7)

Pitfalls

  • 3.x → 4.x renames. SCREEN_TEXTURE is removed — declare uniform sampler2D x : hint_screen_texture; and sample with SCREEN_UV. Color hints hint_color→source_color; hint_albedo/hint_white→source_color; hint_range stays. Depth/normal use hint_depth_texture / hint_normal_roughness_texture.
  • Wrong output variable. In canvas_item write COLOR; in spatial write ALBEDO (and EMISSION, ALPHA, ROUGHNESS, METALLIC). Writing COLOR in a spatial shader does nothing.
  • Color uniforms without source_color are treated as raw linear values and look wrong (washed/dark) because Godot won't sRGB-convert them.
  • Transparency needs opt-in (3D). For ALPHA < 1.0 to blend, add a render mode or set the material transparency; otherwise it's opaque/cut.
  • Sampling outside [0,1] UV without repeat_enable clamps. Add : repeat_enable to the sampler uniform for tiling/scroll.
  • TIME is seconds since start and keeps growing — wrap with fract()/mod() for periodic effects to avoid precision drift.
  • discard is costly on some hardware and breaks early-Z; prefer setting ALPHA/ COLOR.a when you can.

References

  • For built-in variables per shader type, render modes, varying, custom light(), vertex() displacement, and the visual shader graph, read references/shading-language.md.

Related skills

  • shader-programming — engine-agnostic shader concepts (GLSL/HLSL).
  • godot-3d-essentials — materials, environment, and where spatial shaders live.
  • godot-ui-control — applying shaders to UI for effects.

来源与署名

来源:gamedev-skills/awesome-gamedev-agent-skills位于skills/godot/godot-shaders提交d4b0e35

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架