跳到主要内容
知仓学习社ZHICANG

godot-shaders

>

不碰外部(只输出文字)无严重或高危命中gamedev-skills/awesome-gamedev-agent-skills

它会碰到什么

扫了多少2 个文本文件,9 KB
它会碰到什么不碰外部(只输出文字)
命中总数0 处
命中统计严重 0 · 高 0 · 中 0 · 低 0

这一栏是扫描器报的事实,不是结论。命中多不等于有毒(安全工具、规则库、示例脚本本来就会包含危险写法),命中少也不等于干净。它和你手上的凭据、文件、网络有什么关系,需要你自己看。

技能内容

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 uniforms 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

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

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

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)

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:

$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_colorsource_color; hint_albedo/hint_whitesource_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.

想直接用这个技能?

本站把开放许可(MIT / Apache 等)的技能按仓库打包整理到网盘,点一下转存到你自己的网盘,不用一个个从 GitHub 拉。许可未声明的技能只给原始仓库链接,不打包。