Agent Skills
返回列表
💻

Shader编程

开发编程 更新于 2026.08.29

将以下提示词粘贴到你的 AI 对话框中:

请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/shader-programming-2m2b。

技能介绍

你要解决什么问题

写了几周材质球,第一次打开一个 .gdshader 文件时,多半会被满屏的 uniform、varying、gl_FragColor 卡住。更常见的是另一种情况:效果在编辑器预览里是对的,换到手机真机就崩——色偏、闪烁、机身烫手。这个技能要解决的就是「看起来会一点,但说不清为什么错」的那类问题。

它聚焦跨引擎通用的着色器基础:管线各阶段做什么、坐标空间怎么流转、UV 如何驱动动画、GPU 上什么写法会拖慢速度。

它如何工作

核心能力

  • 分清 vertex 与 fragment 两个阶段的职责:顶点着色器把顶点变换到裁剪空间并传递 UV、法线;片元着色器对每个光栅化像素输出颜色。
  • 掌握常见效果的构建方式:tint / 换色、UV 滚动、溶解、描边、菲涅尔边缘光、暗角、色彩分级。
  • 在 GLSL 与 HLSL 之间做概念翻译:mix ↔ lerp、fract ↔ frac、texture() ↔ .Sample()、vec2 ↔ float2,以及列主序与行主序矩阵的差异。

关键步骤

  1. 先确认自己在哪个阶段工作,多数游戏效果落在 fragment 阶段。
  2. 追踪坐标空间:模型 → 世界 → 视 → 裁剪,法线属于世界或视图空间。
  3. 用 UV 与时间驱动效果,UV 是 0..1 的纹理坐标,可偏移、缩放、扭曲。
  4. 逐像素、轻分支:优先 mix、step、smoothstep、clamp,而不是 if。
  5. 通过 uniform 传常量、varying 传插值数据;纹理采样次数直接决定开销。
  6. 在目标硬件上目视验证,桌面能跑的着色器在移动端可能因精度或特性缺失而失效。

边界与注意点

这个技能不覆盖某个引擎的完整语法和内建变量。需要 Godot 精确写法时用 godot-shaders,需要 Unity/Unreal 材质节点时查阅引擎官方文档。它也不负责完整粒子特效系统(那是 unreal-niagara 的范围)和后处理栈(直接用引擎渲染器设置即可)。

几个高频坑值得单独列出:

  • 坐标空间混用:拿世界空间法线去和视图空间光源做点积,会得到「看起来差不多但总不对劲」的阴影。选一个空间,把所有东西转换进去。
  • 忘记归一化:插值会缩短向量,dot() 结果会漂移,fragment 阶段记得补 normalize()。
  • UV 原点假设:部分引擎会翻转 V 轴,贴图上下颠倒时先查引擎约定。
  • discard 破坏 early-Z:在 tile 式移动 GPU 上代价明显,能做 alpha blend 就做 alpha blend。
  • 移动端精度:highp 与 mediump 的差别在时间值和大 UV 上会直接表现为闪烁,坐标与时间要给足精度。

使用场景

  • 第一次写顶点着色器,需要理清模型到裁剪空间的变换链路
  • 给游戏角色加溶解特效,要用噪声阈值和边缘发光
  • 把GLSL着色器迁移到HLSL,需要查mix与lerp等函数对照
  • 排查移动端画面闪烁,要检查UV和时间uniform的精度

适合人员

  • 初学渲染的程序员,想弄清顶点与片元着色器的分工
  • 在两个引擎间迁移着色器的图形工程师,需要GLSL与HLSL对照
  • 负责移动端表现的技术美术,需要排查精度和分支性能
  • 计算机图形学学生,做作业时需要可参考的着色器写法