着色器是一个小型程序,其中包含针对GPU的指令。 它描述了如何计算特定材料的屏幕颜色。
尽管Unity具有标准着色器,但有时您需要实现标准着色器无法提供的效果。
以前,这需要特定着色器语言(例如Cg或HLSL)的知识,并且其中的方法与通常创建游戏脚本的方式略有不同。 对于许多人来说,编写着色器是游戏开发中不受欢迎的方面,因为它需要开发其他学习曲线。
Unity引入了
Shader Graph ,这使编写几乎不需要代码的着色器变得更加容易。 最重要的是,Shader Graph允许您使用可视的交互式界面。
在本教程中,您将创建第一个Unity着色器!
开始工作
本教程使用Unity 2019.1或更高版本。 在
此处下载新版本的Unity。
注意 :尽管本教程是供Shader Graph的初学者使用的,但假定您已了解Unity中开发的基础知识并已掌握引擎的界面。 如果您不熟悉Unity,请查看出色的Unity入门教程。
在
此处下载教程材料。 然后解压缩内容并在Unity中打开“
Shader Graph Starter简介” 。
“项目”窗口中的
RW文件夹的组织方式如下:
- 字体 :场景中使用的字体。
- 材料 :用于场景的材料。
- 模型 :游戏形状和背景的3D网格。
- PostFX :场景渲染的后处理效果。
- 预制件 :各种预制组件。
- 场景 :游戏场景。
- 脚本 :具有游戏逻辑的脚本。
- 着色器 :为本教程创建的着色器图。
- 精灵 :用作说明一部分的精灵。
- 纹理 :游戏形状和背景的纹理贴图。
现在从“
场景”文件夹中加载“
七巧板拼图 ”
场景 。
这是一个名为
七巧板的简单游戏,它于19世纪在中国出现。 玩家的任务是移动七个平坦的几何形状,使其成为程式化的象形图或轮廓。
在编辑器中启动“
播放”模式并测试演示游戏。
您可以单击形状并将其拖动。 使用方向键旋转形状。 旋转和移动形状,以使它们彼此不重叠。
您能弄清楚如何移动这七个形状来创建这样的图案吗?
因此,从
技术角度来看,该游戏可以运行,但不会提供有关所选图形的任何视觉反馈。
如果我们可以在鼠标悬停在其上方时使形状发光怎么办? 这将改善用户界面。
这是展示Shader Graph功能的绝好机会!
检查着色器图的管线参数
Shader Graph仅适用于相对较新的
可编写脚本的渲染管线 ,即适用于
High-Definition Render Pipeline或
Lightweight Render Pipeline 。
创建用于使用Shader Graph的新项目时,请选择正确的模板。
该示例项目已配置为可与“
轻量级渲染管道”一起使用 。 首先,在PackageManager中,选择
Window►PackageManager ,确认您已安装
Lightweight RP和
ShaderGraph软件包。
然后选择可用版本之一,如有必要,请单击
更新到按钮。 通常,最好的选择是最新的
验证版本。
更新软件包后,请在“
编辑”►“项目设置”中仔细检查管道参数的正确性。
在“
图形”选项卡上,“
可编写脚本的渲染管道设置”参数应设置为
LWRP-HighQuality 。 因此,项目将为“轻量级渲染管道”使用最高的默认设置。
确保使用
脚本编写的渲染管道资源之一后,关闭此窗口。
创建PBR图
在屏幕上渲染3D网格时,材质和着色器始终协同工作。 因此,在开始创建着色器之前,我们需要材料。
首先,在“项目”窗口中单击“
创建”按钮,以在
RW /材料文件夹中生成新材料。 选择
创建►材质 ,然后将其重命名为
Glow_Mat 。
然后,在
RW / Shaders文件夹中,通过选择
创建 ►Shader►PBR Graph来
创建PBR图 。 这是一个着色器图形,支持
物理上精确的渲染或PBR。
将其命名为
HighlightShaderGraph 。
到目前为止,“材质Glow_Mat”使用
LightweightRenderPipeline的标准着色器,称为
LightweightRenderPipeline /Lit。将其更改为新创建的新着色器图。 选择
Glow_Mat后 ,单击检查
器顶部的“
Shader”下拉菜单,然后选择“
Shader Graphs” ►HighlightShaderGraph 。
Glow_Mat会呈现较浅的灰色阴影,但其他情况下将保持沉闷。 不用担心,我们会尽快修复。
现在,双击
HighlightShaderGraph资产或在检查
器中单击“
打开着色器编辑器 ”。 这将打开“
Shader Graph”窗口。
查看此界面的主要部分:
- 主工作区是一个深灰色区域,将在其中存储图形操作。 您可以右键单击工作区以打开上下文菜单。
- 节点是图的单个元素。 每个节点都有一个输入,输出或操作,具体取决于其端口。 节点使用edge彼此连接。
- 主节点是图形的最后一个输出节点。 在此示例中,我们使用物理上准确的渲染选项,也称为PBR主节点。 您可能会注意到其中的某些属性,例如标准明暗器中使用的反照率,法线,发射和金属。
- 黑板可以提供对检查器中图形某些部分的访问。 这样,用户无需直接编辑图形本身即可配置参数。
- 主预览以交互方式将着色器的当前输出显示为球体。
通过连接各个节点,您可以创建一个
着色器图 ,Unity可以将该
着色器图编译并传输到GPU。
创建一个颜色节点
首先,让我们为着色器提供一些基本颜色。 为此,请将颜色节点与PBR主节点的Albedo组件相连。
右键单击工作区以通过选择
创建节点►输入►基本►颜色从上下文菜单创建第一个节点。
请注意,“
创建节点”菜单中有数百个节点! 乍一看似乎令人困惑,但是您很快就会发现最常用的那些。
接下来,将节点拖到工作区上,并保持其标题栏不变。 然后将其放在
PBR主节点左侧的某个位置。
“
颜色”节点允许您指定一种颜色。 单击颜色字段,然后选择漂亮的红色,例如
R:128,G:5,B:5 。
要将颜色输出到
PBR主节点,请将“
输出”端口拖到
Albedo端口,该端口指示着色器的基本颜色。
通过并排连接节点,您应该看到“
主预览 ”中的球体如何变为红色。
太好了! 在编写着色器方面,创建单色着色器类似于
Hello world!尽管您可能还不了解这一点,但是您只是创建了第一个着色器!
使用界面
尽管图中只有几个节点,但现在是适应Shader Graph界面的最佳时间。
尝试拖动节点,请注意
彩色输出端口和
PBR主输入端口之间的边缘保持连接。
节点可以包含各种类型的数据。 就像我们创建一个包含单个输入颜色的节点一样,我们可以创建一个代表单个数字的节点。 选择
创建节点►输入►基本►整数 。 我们不会对该节点做任何事情;仅需说明原理。
将
Integer Out端口连接到
PBR主节点的
Alpha端口。
我们的图仍然很小,但是我们已经有足够的节点来检查热键的动作。 选择一对节点,然后按以下键:
您也可以使用窗口顶部的按钮在
Main Preview和
Blackboard之间切换。 “
在项目中显示”按钮有助于在“项目”窗口中找到当前的着色器图形。
处理完图形的管理后,我们将其清除。 我们需要的只是
Color和
PBR Master节点。
右键单击
Integer和
Master节点之间的连接,然后选择
Delete 。 这会将节点与图形分开。
同样,您可以完全删除
Integer节点。 右键单击该节点,然后选择“
删除” 。
完成后,单击界面左上角的“
保存资产”按钮。 Unity将保存所有更改,然后编译并激活着色器。 每当您要在编辑器中查看最新更改时,都应执行此步骤。
现在回到窗口并选择
Glow_Mat材料。
随着着色器延伸到材质,检查器的预览窗口中的球体应变为红色。
现在,将“
Glow_Mat”材质
拖到 “
场景”窗口中的七巧板形状上。
不出所料,带有着色器的材质将网格物体涂成美丽,均匀的红色。
添加发光效果
如果希望Glow_Mat材质具有更神秘的发光效果,则需要再次编辑着色器图。
现在,
颜色输出将传输到
Albedo PBR主节点的输入。
您也可以将另一条边从“
出”拖到
“ 发射” 。 现在,两次使用相同的颜色:既用作基础颜色,又用作辐射线的颜色。
输出端口可以有多个边,输入端口只能有一个。
现在,将“
颜色”节点的“
模式”下拉菜单切换为
HDR模式。 因此,我们将包括
扩展的颜色
动态范围。
现在更改颜色字段。 在
HDR模式下 ,出现了其他
强度选项。 在底部面板中单击
+1两次,或将滑块拖动到
2.5左右。 现在保存更改并返回编辑器。
在编辑器中,该图将以亮橙色发光。 场景中的后处理功能已经启用,它可以增强动态范围的色彩。
现在,在层次结构中选择游戏对象
PostProcessing 。 发光是由于
布隆效应。
打开“
Bloom”选项,然后设置“
强度” (发光强度)和“
阈值” (发光起始阈值)。 该示例显示值
3和
2 。
哇,这闪耀!
创建突出显示脚本
我们不希望人物不断发光。 我们需要仅根据鼠标的位置打开发光。
当鼠标光标悬停在形状上时,我们必须启用Glow_Mat材料。 在其他情况下,该图应与标准材料Wood_Mat一起显示。
首先,在
RW /脚本中创建一个新的
C#脚本,并将其命名为
Highlighter 。 他将帮助我们在程序执行期间在两种材料之间切换。 用以下代码替换脚本中的所有行:
using UnityEngine;
让我们分析一下这个脚本:
- 该脚本只能应用于包含组件
MeshRenderer
和Collider
的对象。 这是通过将[RequireComponent]
属性添加到脚本顶部来控制的。 - 这些是指向
MeshRenderer
, originalMaterial
和MeshRenderer
链接。 用[SerializeField]
属性标记材料,该属性使您可以从检查器分配它们。 - 在
Start
方法中,我们使用GetComponent
自动填充GetComponent
。 - 称为
EnableHighlight(false)
。 这可以确保默认情况下显示非突出显示的内容。 下面是公共的EnableHighlight
方法,该方法可切换渲染器材质。 它接收布尔参数onOff
,该参数确定背光的状态。 - 防止所有NullReference错误
- 为了节省空间,我们使用三元运算符。
添加鼠标事件
由于此脚本适用于具有
MeshCollider
形状,因此我们可以使用内置方法
OnMouseOver
和
OnMouseOver
。 在
EnableHighlight
方法之后添加以下代码:
private void OnMouseOver() { EnableHighlight(true); } private void OnMouseExit() { EnableHighlight(false); }
当鼠标悬停在形状上时,它将调用
EnableHighlight(true)
。 同样,当鼠标离开Collider时,它将调用
EnableHighlight(false)
。
仅此而已! 保存脚本。
图高亮
如果在本教程的前面各节中将Glow_Mat应用于任何图形,那么在编辑器中,您需要将Wood_Mat材质返回给所有游戏图形。 现在,要打开发光效果,我们将在程序运行时使用
荧光笔 。
首先,我们将在变换
七巧板中选择七个对象,它们是单独的形状。 然后,我们将所有
Highlighter
脚本同时添加到它们。
然后将
Wood_Mat拖到“
原始材质”字段中,将
Glow_Mat拖到“
突出显示的材质” 字段中 。 现在运行“
播放”模式并检查我们的工作结果。
还不错! 当您将鼠标悬停在七巧板形状上时,它开始以亮红色发光。 如果从中删除光标,它将返回其原始状态。
在游戏本身中,什么都没有改变,但是高光效果增加了视觉趣味并允许玩家专注。
使用纹理节点
目前,我们的简单着色器具有纯色亮红色。 我们将更改着色器,以使其不会丢失其原始的木材纹理。 为此,我们将使背光显示为表面
周围的发光边缘。
首先,通过双击或选择来更改
HighlightShaderGraph在
Open Shader Editor中 。
右键单击并选择
Delete,以删除
Color节点。 我们将从头开始创建所有内容。
我们使用“
Sample Texture 2D ”(
采样纹理2D)节点代替单色,而不是单色。
通过右键单击并选择“
创建节点” ,或使用热键(空格),从上下文菜单
创建节点 。 选择
输入►纹理►采样2D纹理 。
Sample Texture 2D节点从纹理资产读取颜色信息并输出其RGB值。
从“
纹理”输入端口中选择一个纹理。 单击空白字段旁边的点以打开文件浏览器。
选择WoodAlbedo纹理
资产 。
将
Sample Texture 2D节点的
RGBA输出端口连接到
PBR主Albedo端口。
瞧! 现在,树的纹理显示在预览球体的表面上。
如果添加法线贴图,则可以在曲面上创建零件。 首先,通过选择
创建节点►输入►纹理►样本纹理2D来创建另一个
Sample Texture 2D节点。
在“纹理”输入端口中选择一个
WoodNormal纹理。
将
类型下拉菜单从
默认更改为
普通 。
将
RGBA值输出到
PBR主节点的“
普通”端口。
现在,“
主预览 ”的范围看起来应该更粗糙。 法线贴图模仿了表面上的小不规则和凹痕。 这使您可以模拟树的外观。
注意 :每个端口的数据类型显示在端口旁边的括号中。 (T2)表示该端口与二维纹理兼容, (4)表示该端口使用Vector4 。 根据上下文,着色器图可能会忽略额外的浮点值。
添加菲涅耳效果
现在,纯红色已更改为基本纹理和法线贴图,让我们使用另一种方法添加高光效果。
除了将整个对象均匀发光外,我们将发光仅限制在其边缘。 这可以使用
菲涅耳效应来实现。
通过
右键单击或空格键创建一个新节点,然后选择“
创建节点”►“数学”►“向量”►“菲涅耳效应” 。
这个新节点显示了一个直径为白色辐射环的球体。 您可以使用
电源输入端口调整此光晕的宽度。 单击并将
X拖动到该字段的左侧,或输入所需的数字。
值越大,光环变得越薄,值越小,使其变得非常宽。 要在边缘周围创建微妙的光晕,可以使用值
4 。
为了将此光晕传达给材料,我们将
菲涅耳效果输出连接到
PBR主节点的“
发射”输入。
现在,
MainPreview通过一个
菲涅耳效应获得了一个带有明亮白色光晕的木质球体。
注意 :菲涅耳效应是以法国物理学家奥古斯丁·让·菲涅尔的名字命名的。 他注意到,当观察者接近滑行角时,光线使表面非常明亮,看起来像镜子。
您可以尝试在厨房的桌子上用餐。 我们使用这种现象的Unity版本来给几何图形发光。
颜色相乘
您可以使用简单的颜色计算将颜色添加到发光轮廓。
创建一个新的颜色节点,该节点将指示发光环的颜色。
右键单击或用空格键打开上下文菜单,然后选择“
创建”节点►“输入”►“基本”►“颜色” 。 将色彩模式切换为
HDR 。
选择一种将指示背光源颜色的颜色。 例如,选择一个美丽的亮绿色:
R:5,G:255,B:5 。
将
强度增加到
3.5 。
我们不能将新颜色与菲涅耳效果结合使用。 因为它没有颜色输入。 因此,我们需要将效果的输出与颜色节点的输出结合起来。 可以使用“
乘”节点来完成。
右键单击以创建一个
乘法节点,然后选择
创建节点►数学►基本►乘法 。
删除
菲涅耳效果和
PBR主控之间的边缘。 将
菲涅耳效果输出连接到“
乘”节点的
A输入。
将“
颜色 ”节点的“
输出”节点连接到
“ 乘”节点的输入
B。然后将
“ 乘出”节点连接到
PBR主节点的“
发射”端口。 瞧! 现在,我们了解鲜绿色的HDR颜色如何围绕
主预览球体。
请记住,您可以使用
菲涅耳效果功率来增加或减少光晕。 如果将该值减小到1.5,则会发出宽绿色的光。
对于我们的游戏示例,从
4到
5的值
是好的,但是您可以尝试使用自己的值。
保存着色器图形并返回到编辑器。 您将立即看到您的
HighlightShaderGraph在起作用。
启动
播放模式。
将鼠标悬停在形状上时,它会保留其树纹理。 但是,现在在其边缘周围出现了明亮的绿色光芒。 正式而言,游戏中什么都没有改变,只有背光变弱了。
添加黑板属性
如果要更改发光效果的外观,则需要返回到“ Shader Graph”编辑器窗口并进行这些更改。 例如,使用
菲涅耳效果功率,扩大或缩小晕圈。
如果我们要测试各种更改,这不是很方便。 幸运的是,Shader Graph具有属性的概念。
您可以在检查器中使图形的一部分公开可见,从而允许您交互式地进行小的更改。 这是使用
Blackboard界面完成的。
返回到“着色器图”并打开“
黑板”显示。 如果它是隐藏的,则单击右上角的“
黑板”按钮。
添加基础纹理和法线贴图属性
现在,我们将同时打开基础纹理和法线贴图,以便可以通过检查器对其进行访问。
单击
Blackboard右上角的
+图标。 从下拉列表中选择“
Texture 2D ”。 该项目应出现在
黑板上 。 将其重命名为
BaseTexture 。
确保已选中
暴露的复选框。 如果您打开财产,它将在检查员中公开并可以访问。
要将属性添加到图形,只需将其通过标签拖动到工作区中即可。 将其放在“
采样纹理2D”节点左侧的某个位置。
将
BaseTexture端口连接到连接到Albedo的
SampleTexture 2D节点的
Texture输入端口。 这将替代先前的设定值。
对
法线贴图重复相同的过程。 单击
+图标,然后创建一个新的
Texture 2D 。 将其重命名为
法线贴图 。
将属性拖到工作区中,并将其附加到法线贴图的
Sample Texture 2D中。
单击
保存资产并返回到主编辑器窗口。
选择
Glow_Mat材质,并在检查器中注意两个新字段:
基本纹理和
法线贴图 。
由于尚未为其设置纹理,因此预览窗口中灰色球上方的绿色高亮显示。
为 BaseTexture和
NormalMap选择
WoodAlbedo和
WoodNormal 。
现在,在发光的边缘下,树的纹理将正确显示。
公共属性允许用户直接将数据输入到着色器中,而无需编辑着色器图。 自己尝试各种不同的基本纹理和法线贴图。
添加属性发光尺寸和发光颜色
现在,我们将揭示Blackboard中的其他类型的属性。 例如,更改菲涅耳效果功率值将很有用。
单击
Blackboard上的
+图标,然后创建
Vector1属性。 它表示float类型的单个参数。
将其重命名为
GlowSize 。
您可以通过将其转换为
滑块来限制为此属性输入的值的范围。 将“
模式”切换到“
滑块” ,然后将“
最小值”设置为
0.05 ,将“
最大值”设置为
6以指定范围。 将
默认值设置为
5 。
将
GlowSize属性拖到工作区中。 将输出端口连接到
菲涅耳效果电源输入。
现在,让用户设置发光的颜色。 不用在Blackboard中创建属性,而是变换图形中的现有节点。
选择“
颜色”节点,然后
右键单击并选择“
转换为属性” 。
“
颜色”节点在
Blackboard中转换为color属性,不能再在图形中直接更改。 将属性重命名为
GlowColor 。
单击
保存资产并返回到主编辑器窗口。
在“项目”窗口中选择
Glow_Mat材料。 您应该看到
GlowSize滑块和
GlowColor字段现在在检查器中可用。
根据您的口味更改材料值。 启动
播放模式以测试您的工作。
现在,您可以自定义背光,可以根据需要进行更改!
接下来要去哪里
恭喜你! 现在,您可以使用“着色器图”创建自己的着色器!
利用自己的创造能力,您自己会为成功感到惊讶。 要创建一个很酷的梦幻激光束或力场吗? 使我们的工作结果适应您所需的着色器。
尽管实际上有数百个节点,但是本教程应该可以帮助您学习Shader Graph。