Godot 着色器
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/godot-shaders-uwhd 技能。
技能介绍
写 Godot 着色器容易卡在哪
Godot 4 的着色器写法和 3.x 差别不小:SCREEN_TEXTURE 被移除,颜色相关的 hint 改名,2D 和 3D 着色器的输出变量也不是同一套。照着旧代码或通用 GLSL 经验写,常常出现「着色器没报错但画面没变化」的情况——比如在 spatial 着色器里写 COLOR,编译器不报错,但什么都不会发生。
这个技能覆盖哪些工作
它把 Godot 4.3+ 的 .gdshader 编写拆成一条明确路径:
- 先定类型:2D 用
shader_type canvas_item;,3D 材质用shader_type spatial;,粒子、天空、雾也有各自的类型。 - 挂载方式:新建
ShaderMaterial,把.gdshader赋给它,再放到节点的 material 上,uniform 会自动出现在检查器里。 - 写输出:
fragment()里输出COLOR(2D)或ALBEDO/EMISSION/ALPHA/ROUGHNESS/METALLIC(3D),可选的vertex()做几何位移,light()做自定义光照。 - 调参:用
uniform加 hint 暴露可调参数,source_color让颜色走 sRGB 管理。 - 动画与采样:内置
TIME驱动周期动画,texture(tex, UV)采样贴图,GDScript 里用material.set_shader_parameter("name", value)从代码赋值。
内置示例覆盖常见场景:2D 的 tint + 滚动 UV、基于噪声阈值的溶解、3D 的自发光边缘光,以及读取屏幕的后处理效果(4.x 用 hint_screen_texture 配合 SCREEN_UV)。
适用边界与注意点
它只处理 Godot 4 的着色器代码本身。跨引擎的着色概念(UV、顶点/片元理论)属于 shader-programming;粒子和 VFX 节点属于通用 3D 技能;非着色器视觉表现不在范围内。
几个容易踩的坑:
- 输出变量写错:canvas_item 写
COLOR,spatial 写ALBEDO,写反等于没写。 - 颜色 uniform 不加
source_color:会被当成原始线性值,画面偏暗或发灰。 - 3D 透明度需要显式开启:
ALPHA < 1.0要配合 render mode 或材质 transparency,否则仍是不透明或镂空。 - UV 越界:不写
repeat_enable会被 clamp,滚动或平铺贴图记得加上。 - TIME 会一直增长:周期效果用
fract()/mod()包一层,避免精度漂移。 - 慎用
discard:会破坏 early-Z,能设ALPHA/COLOR.a就别丢弃片元。
内置变量、render mode、varying、自定义 light() 和可视化着色器图,参考技能附带的 references/shading-language.md。
使用场景
- 给 Sprite2D 加描边、溶解或受击闪白时,需要编写 `canvas_item` 着色器并输出 `COLOR`。
- 给 3D 模型做边缘光、卡通着色或滚动 UV 时,需要编写 `spatial` 着色器并输出 `ALBEDO`、`EMISSION`。
- 实现屏幕空间后处理时,需要声明 `hint_screen_texture` 并通过 `SCREEN_UV` 读取当前画面。
- 需要从 GDScript 动态调整着色器参数时,会用 `set_shader_parameter` 写入暴露的 uniform。
适合人员
- 独立游戏开发者在 Godot 4.3+ 项目中为 2D 精灵和 UI 节点编写自定义材质。
- 技术美术需要在 Godot 4 中实现边缘光、溶解和后处理等可复用渲染效果。
- 从 Godot 3.x 迁移的工程师需要修正着色器里的 `SCREEN_TEXTURE`、颜色 hint 和输出变量写法。