练习项目链接
1. Shader 介绍
Shader其实就是专门用来渲染图形的一段代码,通过shader,可以自定义显卡渲染画面的算法,使画面达到我们想要的效果。小到每一个像素点,大到整个屏幕,比如下面这个比较常见的效果。
2. Shader Graph介绍
Shader Graph 能够帮助直观地构建着色器,可以在图形框架中创建并连接节点,而不必手写代码。Shader Graph 提供了能反映所作更改的即时反馈,对于不熟悉着色器创建的用户来说非常简单。
创建新的 Shader Graph 资源。右键单击 Project 窗口,在上下文菜单中找到 Create > Shader,然后选择所需的 Shader Graph 类型。
2.1 Shader Graph 窗口
Shader Graph 窗口包含 Master Stack(主栈)、Preview 窗口、Blackboard 和 Graph Inspector。
![](https://file.jishuzhan.net/article/1771430781130903553/08ea1b4411fea93ed650964ebde2cb7a.webp)
主栈
主栈是 Shader Graph 的终点,用于定义着色器的最终表面外观。Shader Graph 应始终包含一个且仅包含一个主栈。 主栈包含两个上下文:Vertex 和 Fragment。分别代表着色器的两个阶段。连接到 Vertex Context 中的 Block 的任何节点都将成为最终着色器的顶点函数的一部分。连接到 Fragment Context 中的 Block 的任何节点都将成为最终着色器的片元(或像素)函数的一部分。如果您将任何节点连接到两个上下文,它们将被执行两次,一次在顶点函数中,然后在片元函数中再次执行。上下文不能剪切、复制或粘贴。
![](https://file.jishuzhan.net/article/1771430781130903553/880287b8b87d53d33afbca0ae92fa3a9.webp)
Preview 窗口
预览当前着色器输出的区域。在这里,您可以旋转对象,并放大和缩小。您还可以更改预览着色器的基本网格。
![](https://file.jishuzhan.net/article/1771430781130903553/e3ab614a0a0461590f622001adbed76f.webp)
Blackboard
该区域在单个视图中汇总所有着色器属性。使用 Blackboard 可对属性进行添加、删除、重命名和重新排序
![](https://file.jishuzhan.net/article/1771430781130903553/c6c1f71324a421a29680d27200ad73b4.webp)
Internal Inspector
包含与用户当前单击的任何内容关联的信息的区域。这是一个默认情况下自动隐藏的窗口,仅在用户选择可以编辑的内容时才会出现。使用 Internal Inspector 来显示和修改属性、节点选项和图形设置。
![](https://file.jishuzhan.net/article/1771430781130903553/e42c127670db6be6efff9e1fe64087f6.webp)
2.2 窗口实例
练习在图表中移动:
- 平移: 单击鼠标中键并拖动,或者按住 Alt (Windows) 或 Option(macOS) 并单击并拖动。
- **缩放:**旋转滚轮或使用触控板缩放。
- 聚焦并放大: 选择一个元素并按 F键。
- 适合窗口: 按 A键。
3. 练习项目 - 程序噪声图Shader
生成**程序噪声图(Procedure Noise)**shader图像,使得噪声贴图的程序纹理提供闪烁效果的变化
3.1 新建一个shader graph
- Project窗口,在Assets目录下点击ShaderGraphs目录,在右侧的窗口中点击鼠标右键,弹出的菜单中选择 Create > Shader Graph > URP > Lit Shader Graph ,新建一个机遇URP的 lite shader graph,取名 newShimmer.
![](https://file.jishuzhan.net/article/1771430781130903553/81ace4e4e1350fc4562e622ea203d596.webp)
- 双击newShimmer,打开Shader Graph窗口,里面工作区空间只有上述2.1中介绍的4个窗口内容
![](https://file.jishuzhan.net/article/1771430781130903553/3a82620b968d46259b1650f1e9b60f9e.webp)
-
在空的工作区域内,按空格键或者点击鼠标右键,在弹出菜单中选择 Create Node
-
在顶部的搜索输入输入"Gradient Noise",梯度噪声节点将出现在结果中。双击将其选中
- 在空的工作区域内,按空格键或者点击鼠标右键,在弹出菜单中选择 Create Node,顶部的搜索输入输入"Tiling And Offset",双击将其选中该节点,在工作区中新建了该节点,将该节点的Out(2)连接 Gradient Noise 节点的 UV(2),即平铺和偏移中输入的值将影响渐变噪声。
![](https://file.jishuzhan.net/article/1771430781130903553/777b8cc4255772943e510a234c54389e.webp)
- 将Gradient Noise 节点的 Out(1)连接 主栈的Fragment中Base Color(3), 可以在Main Preview中看到噪声的平铺和偏移效果图。但是该效果图是静止图案,不是移动的,需要让图案随着时间而变换,产生闪烁的效果
![](https://file.jishuzhan.net/article/1771430781130903553/74020664a4b166826faa84988cf27d0f.webp)
7.仿照步骤 5, 在工作区内新建一个 Time 节点,允许随时间更新值,将"Time"节点的**"Time(1)"输出拖动到**"Tilling And Offset"节点上的**"Offset(2)"输入,**这时Main Preview中噪声纹理现在已动画化!
![](https://file.jishuzhan.net/article/1771430781130903553/78dc5483c68f519c855df3b9ef954b50.webp)
3.2 设置速度变量
- 为了方便更改shader,需要在Blackboard中创建参,例如更新上述时间节点的取值,使得动画效果可以更快或更慢。 选择Blackboard上的 加号 ( + ) 按钮,然后选择**"Float"**以创建新的 float(浮点值)输入节点。将其命名为"ScrollSpeed"。使用此输入节点,艺术家可以通过在材质中输入浮点数来调整速度。
![](https://file.jishuzhan.net/article/1771430781130903553/ba804f5d4fba70262230ef96d93134a9.webp)
- 将"ScrollSpeed"节点拖到工作区中,同时仿照步骤 5 在工作区新建一个Multiply 节点。新建该节点的原因是Time 节点上没有输入槽,因此需要采用不同的方式来组合 Time 和 ScrollSpeed 值。为此,创建一个Multiply 节点,组合两个值的简单方法。它需要两个值,将它们相乘,然后输出结果
![](https://file.jishuzhan.net/article/1771430781130903553/8b9d2b1d5dc4964d496d89ad981a342e.webp)
- 通过选择连接器并将其删除,断开Time、Tiling And Offset节点的连接, 将 Time 和 ScrollSpeed 节点的输出连接到 Multiply 节点的输入,再将乘法输出连接到Tiling And Offset输入.
![](https://file.jishuzhan.net/article/1771430781130903553/d3c9504f36aac519637ff2c8195207cf.webp)
- 此时Main Preview中显示的噪声还没有运动起来,是因为ScrollSpeed的默认值是 0. 点击ScrollSpeed节点,在右侧的 Graph Inspector窗口将Defult值从 0 改为 0.4,这是Main Preview中显示的噪声图就闪烁起来了。
![](https://file.jishuzhan.net/article/1771430781130903553/9ffd2fbef7cfaa17a5ee141b0fa7297a.webp)
3.3 设置两个噪声图
- 在工作区中选择Multiply, Tiling And Offset, Gradient Noise三个节点,右击鼠标,在弹出菜单中选择 Duplicate 选项,将三个节点复制,该三个新复制节点之间会自动连接,同时新的 Mulitplay 节点与原先的 ScrollSpeed 和 Time 节点也保持连接。此时点击左上角的 Save Asset,保存所有的操作。
![](https://file.jishuzhan.net/article/1771430781130903553/40c1b043929ccf6c25eb28cf4349d19a.webp)
- 仿照步骤 5 新建一个 Divide 节点,该节点将时间减半,控制新的Gradient Noise中的图像闪烁速度减半,按照下图连接Time 与 Divide 与 Multiply 的节点
![](https://file.jishuzhan.net/article/1771430781130903553/7cf2d222584951f3d81589f4adeaecc5.webp)
- 仿照步骤 5 新建一个 Multiply 节点,将两个Gradient Noise的图像组合后在输入到 Fragment的 Base Color中,实现两个噪声图的融合。
![](https://file.jishuzhan.net/article/1771430781130903553/75b158e18d52cd4306fd5fcc4329a82e.webp)
- 选择如下图中的节点,再点击鼠标右键,在弹出菜单中选择Group Selection,新建一个组,命名为 "Changing Offset over Time".
![](https://file.jishuzhan.net/article/1771430781130903553/389dd1ec7a62ccfca949894dd9616a78.webp)
3.4 设置放缩变量
- 点击左侧blackboard中的 "+",新建一个"GradientScales" 的 float 变量,该变量用来改变噪声图的放缩变化,并在右侧 Graph Inspector 窗口将默认值从0 改为 10,然后将该变量拖到工作区
- 为了对两幅噪声图的放缩不同比例,增添一个新的 Divide 节点,实现如下连接
![](https://file.jishuzhan.net/article/1771430781130903553/3a65e875623b850d25ab9e23269ee571.webp)
3.5 设置噪声灰度对比变量
利用 Remap 节点将黑白色素强度对比从 0-1范围变为更小的范围(例如 0.2 - 0.6),是的图像中灰度点变多
- 仿照步骤 16,在左侧blackboard 中增加一个 Vector2 变量 "RemapValues",并将该变量拖到工作区中,并在右侧Graph Inspector中将Y值从 0 改为 1
19.仿照步骤 5,在工作区中新建一个 Remap 节点,将合并噪声图的 Multiply、RemapValues、Remap 实现下图连接,将 Remap 节点中的 In Min Max 设置为 0 和 1,这样与初始黑白色素强度对应,后续可以在unity editor界面改变这个范围,实现灰度的调控。
![](https://file.jishuzhan.net/article/1771430781130903553/c1aa8dfea8da5799983a510cf419a803.webp)
3.6 设置噪声颜色变量
自我练习:
-
仿照上述3.5步骤,新增一个 Color变量,取名"TintColor",将其Mode 改为 HDR,选择一个鲜艳颜色,如红色。
-
再新增一个 Multiply 节点,实现如下节点连接,连接完成后,将3.5 和 3.6 新增的节点组成一个组 group,设置名称为 "Intensity and Color"。
![](https://file.jishuzhan.net/article/1771430781130903553/10cb709657d2ea6052dcb44fe8d45256.webp)
3.7 设置透明度
-
连接上图中Multiply 的output到右侧 Fragment 的 Base Color 和 Emmission 输入
-
选择 Fragment,在 Graph Inspector 的Graph Settings中,设置Surface Type为 Transparent,此时 Alpha 输入将会显示
![](https://file.jishuzhan.net/article/1771430781130903553/bd9d95e59dbf7174adabddc1244f3aa1.webp)
- 连接 Remap 的output 到这个新显示的 alpha
![](https://file.jishuzhan.net/article/1771430781130903553/1574e57cf384e1fba65a8f6a69d2fb29.webp)
3.8 增加 Metallic 和 Smoothness 变量
-
仿照步骤 16 在blackboard中新增两个 float 变量 Metallic 和 Smoothness,将其拖到工作区,直接连接 fragment 的Metalic 和 smoothness 输入
-
点解左上角的 Save Asset,保存上述所有修改,退出 Shader Graph 窗口
![](https://file.jishuzhan.net/article/1771430781130903553/8a8536f0571af1b50c60070d2e9ffb59.webp)
3.9 应用 Shader材质
-
在Unity Editor 界面的 Project 窗口,在 Assets > CreativeCore_Shaders > Materials 目录下,在右侧窗口右击鼠标,在弹出菜单中选择 Create > Material, 命名新的材质为 "Shimmer".
-
在右侧 Inspector窗口,设置其shader 为 Shader Graphs/newShimmer
![](https://file.jishuzhan.net/article/1771430781130903553/f644b62aca6c22eab5f7843cd1d81c44.webp)
- 复制场景中的一个球 Sphere,将球放到中间的空桌子上,将新建的Shimmer材质代替原有的材质,如图所示
![](https://file.jishuzhan.net/article/1771430781130903553/fb6ee197471984acca309c1161ba13d8.webp)
- 可以通过改变shimmer材质的Surface Input,查看不同的材质效果,例如改变颜色等
![](https://file.jishuzhan.net/article/1771430781130903553/c993b04bf18b9f144b80a55f03bfe61a.webp)
shader graphs练习:Shader Graphs