写在前面
由于本人美术出身,加上不会写代码,,无奈成为连连看玩家,从最早的Shader Forge,Amplify Shdaer Editor,到现在的Shader Graph,Substance Designer,都有所涉及。 Shader Graph早期版本,节点贫瘠,问题众多,所以弃坑了许久,偶然听闻近期更新之频繁,群友哀嚎学习资源之匮乏,遂重新开坑Shader Graph,望大家多多捧场。 我会找些有意思的shader案例,在Shader Graph中重现出来,主要讲解 制作思路 与 基础原理,要学习软件操作的请自己加油。 提前声明:除部分常见shader效果实现外,本人文章将多以Youtube的Shader Graph案例为主。或把Forge/ASE的shader,在Shader Graph重现,如果是别人的案例,我会贴出链接地址或原始出处。本人能力有限,如过看到有任何地方写的不对,请告之,我会改正。
正文开始
现有Shader Graph节点被分为8类,每个节点的详细信息可以看官方文档
Node Library | Shader Graph | 7.1.6
https://docs.unity3d.com/Packages/com.unity.shadergraph@7.1/manual/Node-Library.html
也可以对着节点右键,点Open Documentation,查看指定节点的文档。
所有节点用处,其实可以总结为3大类:输
入→运算→输出
- 输入:图片,数字等一些列外部能取到的信息
- 运算:加减乘除平方开方等,将上述输入内容进行处理,生成新的图像
- 输出:将运算后的图片或数据,喂给各种光照模型的Master节点,完成着色。
这就是着色器(Shader)
这是一个最基础的连法
他一共做了4件事
- 以图中UV方式映射一张图
- 外部输入一张彩图
- 外部输入一个颜色,颜色与上图相乘
- 该图输出到 Unlit Master 的 Color
可见,输入有2个:图片 与 颜色,运算也有2个:UV 与 乘法(运算)。如果要做文章,自然在UV和运算上。
UV
可能某些程序,天天能看到模型贴图,但至今不知道UV是起什么作用。
UV是什么?他其实是一种规则,告诉贴图应该怎么贴在模型上。模型做完后,需要手动展开UV,再制作贴图。之后贴图便能以该UV的规则,贴在模型上。
*Split:分离通道 / Combine:合并通道
基础的UV看似一张彩图,其实是用两个通道来记录贴图的上下左右位置。拆开UV,可以看到UV的U记录左右信息,UV的V记录上下信息。
所以,改变UV也会改变图片映射方式
*OneMinus:用一减去输入(即1-x)
我将U左右翻转,最终图片也会左右翻转
UV乘以一个数值,就是缩放(Tiling),UV加减一个值,就是移动(Offset)。当然你也可以直接用Tiling And Offset这个节点。
UV大类中还有很多节点,都可以试试,还挺好玩的。
理解了UV含义后,现在回头再看看。并非只有制作模型时的UV,能当作图片映射规则,只要是能再画面中变化的数值,均可当作UV。
举个例子,以
世界坐标的XZ来当作UV
这个可以用来做地面重复的瓷砖材质,模型都不用展UV。(或者你可以用Triplanar节点,做三面映射)
铺垫结束,下篇开始说实际案例。节奏大概是 简单节点,一篇介绍两个;复杂节点,一篇说一个。
基础材质
这次来做连连看案例,基础的PBR材质,刚入门shadergraph的可以来看看,案例文件会放在文章底部。
为了显示效果,我选择HDRP来做演示项目的管线,ShaderGraph做的内容可以通用,但数值上会有稍许不同。
基础材质,也就是Standard材质,是我们使用unity过程中最常见的一种着色器,相信大家对基础材质的每项参数都很熟悉。
所以把这个作为第一章,不会有技术门槛(主要是熟悉节点操作)。当然,如果觉得这篇内容都会,可以跳后面文章。
PBR材质,自然要以PBR Master作为输出节点
先来分析下Standard材质球的贴图和控制参数
Metallic工作流:
贴图
- 颜色:Albdeo(RGB)+Alpha(A)
- 材质:Metallic(R)+AO(G)+Smoothness(A)
- 法线:Normal(RGB/OpenGL)
- 自发光:Emission(RGB)
控件
- 所有贴图的UV位移和缩放
- 与Albedo相乘的颜色
- 法线强度
- 金属度/光滑度/AO强度滑块(0-1)
- 与自发光相乘的颜色(可以是HDR)
- 自发光强度
把贴图贴好
首先是UV
创建一个Vector4,取名叫Tiling And Offset,RG做Tiling,BA做Offset,这个在上篇也写过。
将所有贴图位放入Graph中,并将对应线条都连好。
注意法线要选择Type为Normal。以及每种贴图位在缺少贴图时的默认颜色,比如法线要选为Bump,自发光选为Black等。
接下来是控件
普通的强度控制,就直接是一个数值乘上去。强度数值可以设置为滑块,比如金属度/光滑度/AO这种,只能在0到1之间变化,可以用滑块来控制。而法线强度这种就无需用滑块。
可以在左边Properties,切换参数的模式为滑块Slider。
但不是所有强度都是用乘,AO和Normal不同。要用Lerp和Normal Strength
*Lerp:线性插值 / Normal Strength:法线强度
AO这个很好理解。你希望AO强度是0的时候,颜色应该是白色,也就是1。强度是1的时候,颜色应该是贴图。
如果用乘法,任何数乘0都是黑。所有行不通,要用插值来切换AO强度。
除此之外
HDRP是用的物理单位的灯光,一个10000Lux的平行光作为太阳光,再用后期调整曝光值,强行把颜色压下来。
这会导致,同一个Emission的强度,所产生的Bloom效果,在HDRP与URP(LWRP)中差很多。
Unity默认的HDR颜色选项,范围只有-10到10。
而我为了达到图中Bloom效果,强度乘了10w倍。
tql
当然,具体数值,你可以自己调整。
下面是我的文件
文件分享
https://share.weiyun.com/5fg7YEG
share.weiyun.com
密码:7rdabm
使用方法:找个HDRP或着URP(LWRP),拖进去。我的文件夹下有预制体。记得调自发光强度。
下面是我的artstation地址:https://www.artstation.com/luteli
作者:Lute Li
专栏地址:https://zhuanlan.zhihu.com/p/98052762