shadergraph是unity提供的shader可视化

image-20260522133437385

旧版本unity使用的是BuiltIn渲染管,新版本普遍使用URP(Universal Render Pipeline,通用渲染管线),因为这个支持多设备,当然要是制作纯PC端也可以使用HDRP

URP Shader Graph 的 7 种模板类型

1. Lit Shader Graph(光照着色器图)

  • 用途:标准 PBR 材质,最常用的 3D 着色器
  • 特点:完整的光照响应,支持主光源、附加光源、阴影、环境光
  • Master Stack 输出:Base Color、Normal、Metallic、Smoothness、Ambient Occlusion、Emission、Alpha
  • 典型应用:角色、道具、建筑、绝大多数 3D 场景物体
  • 性能:中等,适合大多数平台

2. Unlit Shader Graph(无光照着色器图)

  • 用途:不受任何光照影响的基础着色
  • 特点:性能开销最低,颜色完全由 shader 决定,不受场景灯光影响
  • Master Stack 输出:Base Color、Alpha
  • 典型应用
    • UI 元素和界面
    • 粒子特效(火焰、魔法效果)
    • 全息投影、扫描线效果
    • 天空盒、背景
    • 2D 游戏中的不受光物体
  • 性能:最低,移动平台首选

3. Sprite Custom Lit Shader Graph(精灵自定义光照着色器图)

  • 用途:2D Sprite 的自定义光照着色器
  • 特点
    • 基于 Sprite Lit,但提供更多自定义控制
    • 可以自定义光照计算方式,不完全遵循 URP 2D 灯光系统
    • 支持更灵活的光照交互
  • Master Stack 输出:Base Color、Normal、Alpha,以及自定义光照相关输出
  • 典型应用
    • 需要特殊光照效果的 2D 游戏
    • 风格化 2D 渲染(如手绘风格、水彩风格)
    • 需要自定义阴影或光照模型的 2D 项目
  • 注意:需要配合 2D Renderer 使用

4. Sprite Unlit Shader Graph(精灵无光照着色器图)

  • 用途:不受光照的 2D Sprite
  • 特点
    • 专为 SpriteRenderer 优化
    • 不响应任何 2D 或 3D 灯光
    • 支持 Sprite 的 Sorting Layer 和 Order in Layer
  • Master Stack 输出:Base Color、Alpha
  • 典型应用
    • UI 图片和图标
    • 2D 游戏背景
    • 不受光影响的 2D 角色或物体
    • 像素艺术游戏
  • 性能:2D 渲染中最低开销

5. Sprite Lit Shader Graph(精灵光照着色器图)

  • 用途:受 URP 2D 灯光系统影响的 Sprite
  • 特点
    • 响应 URP 的 2D Lights(Point Light 2D、Global Light 2D 等)
    • 支持法线贴图产生凹凸感
    • 支持 2D 阴影
  • Master Stack 输出:Base Color、Normal、Alpha
  • 典型应用
    • 需要光影的 2D 平台游戏
    • 俯视角 2D 游戏(如《哈迪斯》风格)
    • 2.5D 游戏
    • 任何需要动态光照的 2D 项目
  • 要求:URP Asset 必须使用 2D Renderer

6. Decal Shader Graph(贴花着色器图)

  • 用途:在现有几何体表面投影纹理
  • 特点
    • 使用投影渲染,不创建新几何体
    • 可以贴合任意表面形状
    • 支持法线贴花(改变表面法线)
    • 支持基于深度的贴花(Decal Projector)
  • Master Stack 输出:Base Color、Normal、Metallic、Smoothness、Ambient Occlusion、Emission、Alpha
  • 典型应用
    • 弹孔和弹痕
    • 血迹、泥渍
    • 路面标记和涂鸦
    • 墙面海报
    • 环境细节增强(如角落积尘)
  • 要求:需要 Decal Renderer Feature 或在 URP Asset 中启用 Decal 支持

7. Fullscreen Shader Graph(全屏着色器图)

  • 用途:全屏后处理效果
  • 特点
    • 渲染覆盖整个屏幕的四边形
    • 可以访问场景颜色、深度、法线等纹理
    • 用于后处理效果(Post-Processing)
    • 在 URP 中通常配合 Fullscreen Pass Renderer Feature 使用
  • Master Stack 输出
    • Base Color(输出到屏幕)
    • 可以采样 _BlitTexture(场景颜色)、_CameraDepthTexture
  • 典型应用
    • 全屏特效(故障艺术 Glitch、老电影效果)
    • 边缘检测、描边效果
    • 颜色分级、色调映射自定义
    • 水面反射扭曲
    • 热扭曲效果
    • 屏幕空间雾效
  • 注意:这是 URP 12+(Unity 2021.2+)引入的,用于替代之前的后处理方式
image-20260522135119433

保存资源并将材质添加到3d物体上

这里我们可以在colorexample里制作颜色节点

image-20260522135542916

将这个与刚才的fragment相连并调整颜色并exposed暴露给inspector窗口

image-20260522135742866

然后我们可以在这个shadergraph上创建材质的副本也就是Material

image-20260522140030711

在inspector里设置

image-20260522140111209

纹理和UV坐标

image-20260522140848527

Texture纹理本质上是图片,所以我们可以去itch或者unity资源商店下载

而UV就是 Texture Coordinates(纹理坐标),用于告诉引擎如何把 2D 图片贴到 3D 模型表面

因为 3D 模型已经有 X、Y、Z 表示三维空间位置了,所以纹理坐标用 U、V 来区分:

  • U → 对应 2D 图片的 水平方向(X)
  • V → 对应 2D 图片的 垂直方向(Y)

简单说:UV 就是 3D 模型的”皮肤展开图”坐标

unity不允许直接将纹理节点连到BaseColor输出,因为要求必须明确指定用于纹理采样的UV坐标

这里需要使用到SampleTexture2D采样节点,往节点图中添加节点有两种方式:

①直接右键菜单选择节点并输入sampletexture2d找到并回车

image-20260522142207325

② 按空格键调出节点创建面板并输入sampletexture2d找到并回车

image-20260522142432822

然后得到这个东西

image-20260522142622067

左侧接口用于接收纹理输入

对于图片模糊的可以设置为point no filter并apply

image-20260522142920299

此时就非常清晰了

image-20260522143326824

​ Unity 中 Texture 的 Filter Mode(过滤模式) 决定了当纹理被放大或缩小时,引擎如何采样像素颜色。三种模式如下:


三种 Filter Mode

1. Point(点过滤 / 最近邻)

  • 原理:直接取最近的像素颜色,不做任何插值
  • 效果:边缘锐利,出现明显的像素块(Pixelated)
  • 性能:最快,计算量最小
  • 典型应用
    • 像素艺术游戏(Pixel Art)
    • 复古风格渲染
    • UI 中需要清晰像素边界的图标
    • 低分辨率纹理刻意保留块状感
    • 数据纹理(如 ID 贴图、索引贴图,不能插值)

2. Bilinear(双线性过滤)

  • 原理:在纹理的 u、v 两个方向 各做一次线性插值,综合 4 个相邻像素
  • 效果:过渡平滑,但近距离看仍有些模糊
  • 性能:中等
  • 典型应用
    • 大多数 3D 游戏的基础纹理
    • 需要平滑过渡但不需要极致清晰的场景
    • 移动端性能与质量的平衡选择

3. Trilinear(三线性过滤)

  • 原理:在 Bilinear 基础上增加 Mipmap 层级之间的插值
    • 先对相邻两个 Mipmap 层级分别做 Bilinear
    • 再对两个层级的结果做线性插值
  • 效果:Mipmap 切换时过渡最平滑,无突兀跳变
  • 性能:最高,比 Bilinear 多一次插值计算
  • 典型应用
    • 高质量 3D 渲染
    • 第一/第三人称视角中纹理远近变化明显的场景
    • 需要消除 Mipmap 边界闪烁的情况

而左侧的UV坐标 unity会自动提供一个UV0,通常不需要手动指定UV坐标

右侧的最上面的RGBA是RGBA输出全通道,包含纹理的全部色彩信息

其余的R,G,B,A分别指的是红色,绿色,蓝色,和阿尔法透明通道

将纹理和基础色相混合

这个可以使用乘法节点器

这个会将左侧的两个红色通道的值相乘

image-20260522144244046

大概这个样子

image-20260522144507211

然后你就会看到我们的箱子实现了,这就是所谓的游戏贴图

image-20260522144918734

控制滚动方向

image-20260522145143923

拖入刚才创建的vector2节点,将默认值改为(1,0),并加入Time节点

image-20260522145407847

time节点在着色器动画制作中很实用,可以提供多个不同的时间参数,最常用的就是Time参数,该数值表示场景加载后经过的秒数

将滚动速度scrollvelocity和时间Time相乘后最终会得到一个随时间推移持续朝同一方向增长的向量,初始滚动速度越大,其增长速度就越快

image-20260522145916584

这个偏移向量将被应用于网格的默认UV坐标

我们需要添加一个叫做Tiling And Offset(平铺与偏移)来实现偏移向量的应用

image-20260522150746404

此时就会实现贴图的滚动,此时启动游戏就可以看到材质的滚动了

image-20260522151146892

透明度和Alpha通道

透明物体的渲染逻辑和不透明物体存在本质差异

出于渲染性能unity在渲染不透明物体时,通常采用从近到远的绘制顺序,近物遮挡机制可以有效提升提升渲染效率

对于透明物体需要根据Alpha值与背景物体进行颜色混合即Alpha混合透明机制,首先必须完成所有不透明物体的渲染才能进行后续的颜色计算,对于shader需要手动设置渲染优先级,数值越小渲染优先级越高,而shadergraph会自动处理顺序,采用从远到近的渲染顺序,距离最远的物体会优先绘制,而靠近摄像机的物体则后绘制

image-20260522152723034

由于节点图采用的是不透明渲染模式,我们需要做一些调整

将Fragment的surface type表面类型改为transparent透明

image-20260522153226862

由于输出的有multiply输出的有四个值,光学三原色和阿尔法透明值,我们的base color只接受了三原色,此时需要split组件将输出结果分离并提取出来alpha值

image-20260522153541210

我们然后创建材质并修改阿尔法值

image-20260522154354937

Alpha裁剪

这里首先换一张类似的贴图,然后打开alpha clipping阿尔法裁剪

image-20260522170848852

然后制作material,修改阿尔法值并附加到cube上得到

image-20260522171122042

然后添加一个浮点类型节点

image-20260522171246685

image-20260522171657427

image-20260522171902519

Dither抖动纹理

添加dither节点,因为如果我们直接用脚本控制一个物体逐渐消失会出现色块不均匀消失的情况

Unity Shader Graph 的 Dither(抖动)节点 用于在屏幕空间应用有序抖动(Ordered Dithering),核心作用是通过引入可控噪声来随机化量化误差,从而避免色带(Color Banding)等大面积图案问题

端口 方向 类型 说明
In 输入 动态矢量 输入值(通常连接 Alpha 或颜色值)
Screen Position 输入 Vector 4 屏幕坐标,用于确定抖动图案的平铺位置。默认绑定屏幕空间坐标,也可连接 UV 等自定义坐标
Out 输出 动态矢量 抖动后的输出值

image-20260522174312941

这样我们改变透明度的时候就会有那种点状消失的效果

image-20260522174004488

这个不太明显,换一个纹理就很直观了

image-20260522174632318