gamedev-skills/awesome-gamedev-agent-skills

godot-shaders

Write Godot 4.7 shaders in the Godot Shading Language: canvasitem shaders for 2D and spatial shaders for 3D, with vertex/fragment functions, uniforms (sourcecolor, hintrange), TIME/UV animation, and screen-reading via hintscreentexture.

View source

How to use

  1. Copy the installation command and review the source package before installing it in your own agent environment.
  2. Check the source document for required tools, credentials and supported hosts.
  3. Describe your input and desired deliverable; review the output against the source material.
npx skills add https://github.com/gamedev-skills/awesome-gamedev-agent-skills --skill godot-shaders

Before you start

  • Installation does not include a model subscription, API allowance or permission to access your files.
  • Repository stars and installation counts describe activity, not an independent quality or security test.
Original skill document

Rendered from the source repository. Headings, examples, code, tables, links, and referenced images are preserved.

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.)

  1. Attach via a `ShaderMaterial`. Create a ShaderMaterial, assign your .gdshader,

and put it on the node's material. Uniforms appear in the Inspector.

  1. Write `fragment()` to set the output: COLOR (2D) or ALBEDO/EMISSION/ALPHA

(3D). Optionally vertex() to move geometry and light() for custom lighting.

  1. Expose tunables as `uniform`s with hints (source_color, hint_range) so they are

editable and correctly color-managed.

  1. Animate with the built-in `TIME` and sample textures with texture(tex, UV).
  2. 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 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 dissolve using a noise threshold

glsl
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): 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.

Related by task

from this repository

More skills

All skills
gamedev-skills
Community

game-feel

Add "juice" and game feel that makes actions satisfying — screen shake, hit-stop/freeze frames, tweened/eased motion, squash & stretch, knockback, and layered audio-visual feedback — as engine-neutral techniques that pair with the detected engine's tween, particle, and camera APIs. Use when the user mentions game feel, juice, "make it feel good/punchy", screen shake, hit stop, screen freeze, easing, squash and stretch, impact frames, or feedback/polish on hits, jumps, pickups, and deaths.

installs
16
GitHub stars
4.3K
Updated
Oct 24
gamedev-skills
Community

audio-design

Implement game audio practice — bus/mixer architecture and gain in decibels, ducking (sidechain), adaptive/dynamic music via layering and re-sequencing, SFX variation, and beat synchronization. Engine-neutral. Use when the user mentions audio mixing, audio buses, adaptive/dynamic music, ducking, SFX variation, music layers, or syncing gameplay to the beat.

installs
13
GitHub stars
4.3K
Updated
Oct 24
gamedev-skills
Community

performance-optimization

Find and fix game performance problems methodically — measure with the engine profiler first, reason about the frame-time budget, locate the CPU-vs-GPU bottleneck, then apply the right fix: object pooling, draw-call batching, fewer allocations/GC spikes, and asset budgets. Engine- neutral method that pairs with each engine's profiler. Use when the user mentions performance, optimize, low/dropping FPS, frame drops, stutter, lag, profiler, frame budget, draw calls, batching, garbage collection/GC

installs
13
GitHub stars
4.3K
Updated
Oct 24
gamedev-skills
Community

shader-programming

Write game shaders from cross-engine fundamentals — the vertex→fragment pipeline, coordinate spaces, UV math, and common 2D/3D effects (tint, UV scroll, dissolve, outline, fresnel rim, vignette) in GLSL with HLSL equivalents. Use when the user mentions shaders, fragment/pixel shader, vertex shader, UV, GLSL, HLSL, or effects like dissolve, outline, or rim light.

installs
13
GitHub stars
4.3K
Updated
Oct 24