ワンクリックで
godot-shader-patterns
Godot 4 常见 Shader 特效案例,包括描边、像素化、溶解、水波、模糊等。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Godot 4 常见 Shader 特效案例,包括描边、像素化、溶解、水波、模糊等。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Godot 4.x .tscn 场景文件纯文本格式规范与 AI 操作指南 — 文件结构、资源引用、 Transform 变换、属性值格式、信号连接,以及 AI 直接读写 .tscn 文件的操作方法。
Godot 4.x .tscn 场景文件纯文本格式规范与 AI 操作指南 — 文件结构、资源引用、 Transform 变换、属性值格式、信号连接,以及 AI 直接读写 .tscn 文件的操作方法。
Godot 4 Autoload单例模式最佳实践,包含全局管理、事件总线、信号通信。
Godot 4 Buff系统完整实现,支持状态效果管理、持续时间、循环效果、层叠机制等。使用Resource+Component架构。
Godot 4 建造系统实现,包含GridMap方块管理、第一人称视角、射线交互。
Godot 4 ECS实体组件系统模式,包含组件化设计、数据与逻辑分离、组件通信。
| name | godot-shader-patterns |
| description | Godot 4 常见 Shader 特效案例,包括描边、像素化、溶解、水波、模糊等。 |
为精灵或字体添加外轮廓效果,常用于 UI 元素、选中状态或卡通风格的描边效果。
shader_type canvas_item;
uniform float outline_width = 1.0;
uniform vec4 outline_color: source_color = vec4(1, 0, 0, 1);
void fragment() {
vec2 uv = UV;
vec2 uv_up = uv + vec2(0, TEXTURE_PIXEL_SIZE.y) * outline_width;
vec2 uv_down = uv + vec2(0, -TEXTURE_PIXEL_SIZE.y) * outline_width;
vec2 uv_left = uv + vec2(TEXTURE_PIXEL_SIZE.x, 0) * outline_width;
vec2 uv_right = uv + vec2(-TEXTURE_PIXEL_SIZE.x, 0) * outline_width;
vec4 color_up = texture(TEXTURE, uv_up);
vec4 color_down = texture(TEXTURE, uv_down);
vec4 color_left = texture(TEXTURE, uv_left);
vec4 color_right = texture(TEXTURE, uv_right);
vec4 outline = color_down + color_up + color_left + color_right;
outline.rgb = outline_color.rgb;
vec4 original_color = texture(TEXTURE, UV);
COLOR = mix(outline, original_color, original_color.a);
}
将画面处理成像素风格,模拟复古游戏的视觉效果。
shader_type canvas_item;
uniform float pixel_size = 4.0; // 像素块大小
void fragment() {
vec2 uv = floor(UV * pixel_size) / pixel_size;
COLOR = texture(TEXTURE, uv);
}
将图片转换为灰度图或带有复古色调。
shader_type canvas_item;
void fragment() {
vec4 color = texture(TEXTURE, UV);
float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));
COLOR = vec4(vec3(gray), color.a);
}
实现物体逐渐溶解消失的效果,溶解边缘带有燃烧的色泽。
shader_type canvas_item;
uniform sampler2D dissolve_texture: source_color;
uniform float dissolve_value: hint_range(0, 1) = 1.0;
uniform float burn_size: hint_range(0.0, 1.0, 0.01) = 0.1;
uniform vec4 burn_color: source_color = vec4(1.0, 0.3, 0.0, 1.0);
void fragment() {
vec4 main_texture = texture(TEXTURE, UV);
vec4 noise_texture = texture(dissolve_texture, UV);
float burn_size_step = burn_size * step(0.001, dissolve_value) * step(dissolve_value, 0.999);
float threshold = smoothstep(noise_texture.x - burn_size_step, noise_texture.x, dissolve_value);
float border = smoothstep(noise_texture.x, noise_texture.x + burn_size_step, dissolve_value);
COLOR.a *= threshold;
COLOR.rgb = mix(burn_color.rgb, main_texture.rgb, border);
}
NoiseTexture2D 作为 dissolve_texturedissolve_value(0 = 完全溶解,1 = 未溶解)模拟水面的波纹效果,包含波动和扭曲效果。
shader_type canvas_item;
uniform sampler2D noise_tex;
uniform float speed = 0.25;
uniform float strength = 0.02;
uniform vec4 tint_color: source_color = vec4(1.0, 1.0, 1.0, 1.0);
void fragment() {
vec2 uv = UV;
float noise = texture(noise_tex, uv + vec2(TIME * speed, 0.0)).r;
float noise2 = texture(noise_tex, uv + vec2(0.0, TIME * speed * 0.5)).r;
vec2 offset = vec2(
cos(TIME * speed + uv.y * 10.0) * strength,
sin(TIME * speed + uv.x * 10.0) * strength
) * (noise + noise2);
vec4 color = texture(TEXTURE, uv + offset);
COLOR = color * tint_color;
}
对图像进行模糊处理,常用于景深效果、UI 毛玻璃效果。
shader_type canvas_item;
uniform float blur_radius = 2.0;
uniform vec2 blur_direction = vec2(1.0, 0.0);
const float MATRIX[5] = float[](0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216);
void fragment() {
vec2 uv = UV;
vec2 texel_size = TEXTURE_PIXEL_SIZE;
vec3 result = texture(TEXTURE, uv).rgb * MATRIX[0];
for (int i = 1; i < 5; i++) {
float offset = float(i) * blur_radius;
result += texture(TEXTURE, uv + texel_size * offset * blur_direction).rgb * MATRIX[i];
result += texture(TEXTURE, uv - texel_size * offset * blur_direction).rgb * MATRIX[i];
}
vec4 original = texture(TEXTURE, uv);
COLOR = vec4(result, original.a);
}
为图像添加发光效果,常用于霓虹灯、魔法特效或 UI 高亮显示。
shader_type canvas_item;
uniform float glow_intensity = 0.5;
uniform float glow_radius = 3.0;
void fragment() {
vec2 uv = UV;
vec2 texel = TEXTURE_PIXEL_SIZE * glow_radius;
vec4 color = texture(TEXTURE, uv);
vec3 glow = vec3(0.0);
for (float x = -2.0; x <= 2.0; x += 1.0) {
for (float y = -2.0; y <= 2.0; y += 1.0) {
vec2 offset = vec2(x, y) * texel;
glow += texture(TEXTURE, uv + offset).rgb;
}
}
glow /= 25.0;
COLOR = color + vec4(glow * glow_intensity, 0.0);
}
shader_type canvas_item;
uniform sampler2D light_vector;
uniform float width = 0.08;
uniform vec4 flowlight = vec4(0.3, 0.3, 0.0, 0.3);
void fragment() {
vec4 color = texture(TEXTURE, UV);
if (color.a != 0.0) {
float v = texture(light_vector, UV).r;
float diff = v - cos(TIME * 0.5);
if (abs(diff) < width) {
color = color + mix(flowlight, vec4(0.0), abs(diff) / width);
}
}
COLOR = color;
}
模拟卡通/动漫风格的渲染效果,通过离散的色调过渡创造手绘感。
shader_type canvas_item;
uniform float levels = 3.0;
uniform vec4 light_color: source_color = vec4(1.0, 1.0, 1.0, 1.0);
uniform vec4 shadow_color: source_color = vec4(0.2, 0.2, 0.3, 1.0);
void fragment() {
vec4 color = texture(TEXTURE, UV);
float light = dot(color.rgb, vec3(0.33));
light = floor(light * levels) / levels;
COLOR = mix(shadow_color, color * light_color, light);
}
通过 Shader 实现 SpriteSheet 图集的帧动画播放。
shader_type canvas_item;
uniform int h_frames : hint_range(1, 100) = 4;
uniform int v_frames : hint_range(1, 100) = 1;
uniform float speed : hint_range(0.1, 30.0) = 10.0;
uniform bool loop = true;
void fragment() {
float frame_width = 1.0 / float(h_frames);
float frame_height = 1.0 / float(v_frames);
int total_frames = h_frames * v_frames;
int frame_index;
if (loop) {
frame_index = int(TIME * speed) % total_frames;
} else {
frame_index = min(int(TIME * speed), total_frames - 1);
}
int col = frame_index % h_frames;
int row = frame_index / h_frames;
float uv_x = float(col) * frame_width;
float uv_y = 1.0 - float(row + 1) * frame_height;
vec2 anim_uv = vec2(uv_x, uv_y) + vec2(UV.x * frame_width, UV.y * frame_height);
COLOR = texture(TEXTURE, anim_uv);
}
实现 Photoshop 风格的混合模式。
shader_type canvas_item;
uniform sampler2D blend_texture: source_color;
uniform float opacity: hint_range(0.0, 1.0) = 1.0;
uniform int blend_mode = 0;
vec3 multiply(vec3 base, vec3 blend) {
return base * blend;
}
vec3 screen(vec3 base, vec3 blend) {
return 1.0 - (1.0 - base) * (1.0 - blend);
}
vec3 overlay(vec3 base, vec3 blend) {
return mix(
2.0 * base * blend,
1.0 - 2.0 * (1.0 - base) * (1.0 - blend),
step(0.5, base)
);
}
void fragment() {
vec4 base = texture(TEXTURE, UV);
vec4 blend = texture(blend_texture, UV);
vec3 result;
if (blend_mode == 0) {
result = multiply(base.rgb, blend.rgb);
} else if (blend_mode == 1) {
result = screen(base.rgb, blend.rgb);
} else {
result = overlay(base.rgb, blend.rgb);
}
COLOR = vec4(mix(base.rgb, result, opacity * blend.a), base.a);
}
shader_type spatial;
render_mode cull_front, unshaded;
uniform vec4 outline_color : hint_color = vec4(1.0, 0.0, 0.0, 1.0);
uniform float grow = 0.05;
void vertex() {
VERTEX += NORMAL * grow;
}
void fragment() {
ALBEDO = outline_color.rgb;
}