Shader Graph简介

news2024/9/21 12:29:52

        使用着色器(shader)和材质(material),我们能够创造出非常多有趣的效果。除了Unity自带的shader外,还可以自己编写shader或使用其他人所编写的shader。编写shader通常需要我们了解shader编程语言的语法和相关特性,总体来说入门难度相对较高,Shader Graph这个工具能够让编写shader的过程更加容易。

        Shader Graph可以让我们不用写代码就创建一些专用的shader。比如你能够组合不同的纹理,让它们在片元着色器中移动位置,或者在顶点着色器中改变顶点的位置。在专业的技术美术(technical artist)的手中,shader能够创造出千变万化的视觉效果。

打开已有的Shader Graph

        Shader Graph从名字来看,就是想让我们用画图表的方式来创建shader。我们先来看看Shader Graph打开后的样子。在下面例子中,有一个Example_Shimmer的shader,它是通过Shader Graph创建的。在工程中直接双击这个文件即可打开它。

         第一次看到这个界面,脑子会比较糊,没关系,我们接下来创建空的Shader Graph窗口来看。

Shader Graph窗口

        首先,我们在项目窗口中,右键新建一个Shader Graph,名字为Shimmer_ShaderGraph,创建好后双击打开(我的工程目录中创建Shader Graph的位置是Assets > CreativeCore_Shaders > ShaderGraphs,渲染管线是URP,因此右键选择Create > Shader  > Universal Render Pipeline > Lit Shader Graph(Unity版本2020.3.43f1c1)):

        1:Shader Graph工具栏,这里可以保存shader

        2:Blackboard,黑板,包含了所创建的shader可供外部所使用的属性。在这里我们可以定义属性的类型,名字,默认值等

        3:Workspace,工作空间,用于创建shader的node graph的地方

        4:Main Preview window,主预览窗口,可以实时预览当前的shader效果

        5: Graph Inspector window,类似于Unity Editor的Inspector面板,显示当前设置、属性和所选择的node的相关信息

        6: Master Stack,主堆栈,定义着色器最终表面外观的着色器图的终点,一个 Shader 中有且只有一个。它列出了顶点着色器和片段(片元)着色器的主要着色器属性,并提供插入必要值的终端节点

        在Shader Graph窗口中:

        平移:鼠标中间按住后拖动可以实现平移(或者按住Alt(windows)或Option(Mac))

        缩放:滚动鼠标滚轮

        聚焦和放大元素:选中元素后按F,按A恢复

        了解了基本的Shader Graph窗口后,我们以一个案例来练习一下。这个练习目标是创建一个自定义的shader,带有发光(glowing)、透明(transparent)和微光(shimmer)的效果。

添加程序化贴图(Procedural map)

        对于微光(shimmer)的效果,我们使用程序化噪声贴图(procedural noise map)来实现。程序化(Procedural)的意思是纹理是通过方程或算法来创建的,而不是从图片创建而来。Shader Graph提供了少量可选的程序化噪声贴图,每种贴图会产生像云朵流动效果的贴图。

        下面我们来在Shader Graph中添加第一个节点(node):

        1. 在Shader Graph的工作空间中按空格键打开Create Node菜单(也可以用右键选择Create Node)

        2. 在搜索框中输入noise,然后选择Gradient Noise

        3. 在工作空间中选择新建的Gradient Noise,查看结果

       

让程序化贴图动起来

        回忆一下之前讲过的纹理的Offset属性,它可以改变物体表面从纹理的哪个位置开始映射。前面一小节生成的贴图是一个随机的噪声图,我们可以让Offset值不停地变化来让这个图动起来。

        正如Tiling和Offset在URP/Lit Shader中是一起出现的一样,Tiling和Offset在Shader Graph中也是绑定到一个节点中的。

        1. 在工作空间中,按空格键或右键,在弹出的窗口中创建一个Tiling and Offset节点。这个节点可以用来调整noise map的缩放参数和起始位置

        2. 拖动Tiling and Offset节点的output到Gradient Noise Node的input。完成连接后,在Tiling and Offset里的值就会影响到Gradient Noise

        3. 改变Tiling and Offset节点上的Offset值,看看实际的效果。

         4. 创建一个Time节点,这个节点可以让我们随着时间变化改变一个值

        5. 由于我们想要Offset随着时间变化,因此我们将Time节点的output和Tiling and Offset节点的input连接起来,连接后,我们就可以看到noise纹理动起来了

        注意到Time节点有几种选择,对于Sine/Cosine Time,其效果就是一个来回往复的效果,正如正弦、余弦函数是周期函数的性质一样

         6. 最后,我们将Gradient Noise节点的output连接到Master Stack的Base Color,这样就能看到这个材质所呈现的效果了

        注意:记得经常使用Shader Graph窗口的左上角的 Save Asset保存你的成果!!!

 添加材质的可输入属性

        对于使用你所创建的材质的艺术家或你自己而言,如果我们能够提供外部可调的参数来控制材质的效果,比如本例子中,shimmer效果的移动速度,那么这个材质会变得更加实用。要实现这个功能,我们可以使用input node来设置材质属性,允许使用者修改最终效果。

        Input node在Blackboard中创建,黑板的标题和shader的名字是一样的。

        1. 在Blackboard上点击“+”,选择Float,创建一个浮点值input node。将其命名为“ScrollSpeed”。使用这个input node,使用者就可以通过输入一个浮点数来调整滚动速度了

        

         2. 拖动刚刚在Blackboard中创建的input node到工作空间中

         3. 由于Time节点并没有input节点,我们无法直接将ScrollSpeed的输出和Time节点输入连接起来。这里我们用另一种方式来实现这两者的结合,创建一个Multiply节点,它可以用来将两个值组合到一起,组合的方式是相乘并输出结果。

              提示:还有一种让Create Node菜单出现的方法,就是拖动ScrollSpeed的output节点到工作空间的空白处,然后松开鼠标左键,这时就会出现Create Node菜单。

        4. 我们将原来Time节点的output和Tiling And Offset之间的连接,改到ScrollSpeed连接的Multiply节点上的B输入上(要删除原来的连线,可以选择原来的连线,然后按delete),接下来将Multiply节点的output和Tiling and Offset的input连接起来。

         注意此时,noise贴图停止运动了。这是因为ScrollSpeed的默认值是0,因此Multiply所返回的结果是0,因此Tiling And Offset节点中Offset的值固定为0,所以就没有动的效果了。

        7. 要修改ScrollSpeed的默认值,选中ScrollSpeed,在Graph Inspector中,输入一个默认值。

 贴图组合

        前面的几个小节中,我们已经实现了一个能够移动的噪声贴图,我们还可以再增加一个造成贴图,让这个贴图移动速度不同,然后叠加组合这两幅噪声贴图的效果来实现更有趣的效果。

        首先我们先复制一份原来的Gradient Noise,Multiply,Tiling And Offset节点(不用选择Time或ScrollSpeed)。

        1. 在工作空间中,拖出一个方框,框住这些节点(或者通过按住Ctrl后点击这些节点)

        2. 选中所有要复制的节点后,点击右键,选择Duplicate,然后复制这些节点(也可以用Ctrl+D)

         3. 接下来,我们调节一下复制出的噪声贴图的移动速度,这里我们要将移动速度变慢。因此我们增加一个Divide节点,用来做除法,将Time的Cosine Time的output连接到Divide节点的A输入,然后设置B输入为2,表示Time输出的值除以2.

            4. 将Divide节点的output和Multiply的B节点连接起来

        5. 现在我们得到了两张不同移动速度和方向的噪声贴图,为了将它们的效果融合到一起。我们再新建一个Multiply节点,然后将两个Gradient Noise Map的output连接到Multiply的A,B输入,然后将Multiply的output连接到Master Stack的Base Color上

使用节点分组功能

        当Shader Graph中节点数量变得庞大时,我们有必要对完成特定功能的节点进行分组管理,以便让图看起来更加简洁。下面我们将所有用来生成Offset值的节点(不包括Gradient Noise节点)放大一个Group中来维护。

        1. 首先选中所有的节点,如下图

         2. 在任意一个选中的节点上点击右键(注意不是工作空间空白处),点击Group Selection(或者按Ctrl + G(MAC上按CMD+G) ),然后将Group的名字改为“Changing Offset over Time”

         当这些节点被划分为一个group后,我们可以对它们做整体移动管理,并且从逻辑上看这些节点的功能一目了然

调节纹理的缩放

        在实际使用中,我们要让shader尽可能的有更多的灵活性。当前的shader的纹理看起来有些密集,我们可以添加一个input节点来调节纹理的缩放效果。

        本例子中,我们会增加一个叫GradientScale的浮点类型输入节点,然后实现两个Noise Map有不同缩放比例的效果。具体的过程不再详细描述,使用之前的知识已经完全足够了,下面的示例图是一个参考,大家练习的时候可以自由发挥,创造出不同的效果。

 调整对比度

        目前为止,我们的shader已经越来越有微光的效果了,但效果本身只有黑白两种对比强烈的颜色,并且也无法修改颜色。

        要调整对比度,我们需要使用Remap节点,它可以将0-1范围的值缩到更窄的范围内。

        1. 首先在Blackboard中增加一个Vector2 input节点,它只有两个值。我们取名为RemapValues,将它拖到工作空间中,并设置Y为1

        2. 增加一个Remap节点到工作空间

        3. 连接之前作为Base Map input节点的Multiply节点的output,到Remap的的In节点

        4. 连接RemapValues节点到Reamp节点的Out Min Max,这个值指定了Remap节点所能输出的值的最小值和最大值,可供外部进行调节

        5. 确保Remap节点的In Min Max的值设置为了0和1,这个值是用来匹配输入值In的实际范围的。

        6. 在Graph Inspector中,调节一下RemapValues的默认值

        7. 将Remap节点的output和Master Stack的Base Color进行连接,看看实际效果

 调整颜色和透明度

        为了能够调整颜色,我们再添加一个Multiply节点,让当前Remap输出的颜色和一个TintColor的input节点进行叠加,有了之前的基础,这里应该很容易能够完成。

         如果要让颜色看起来更加突出,这里TintColor的Mode可以选择HDR。

         颜色看起来似乎还是不够突出?我们还可以将Multiply节点的output连接到Master Stack的Emission节点上,看看效果

         接下来我们来实现透明效果,在Graph Inspector中,在Graph Settings标签页上,将Surface改为Transparent,然后将Remap节点的output和MasterStack的Alpha连接起来

 最后的练习

        观察目前为止我们所创建的Shader的Master Stack,里面还有Metallic和Smoothness这两个值我们没有动过,我们可以尝试添加Input节点来让使用者能够调节这两个值,这个练习留给大家自己实现。

        重要提示:记得点击Save Asset及时保存你的进展

创建一个测试材质

        到这里我们已经创建出了一个shader了,要使用这个shader,我们创建一个新的材质,取名为MyShimmerMaterial,然后将这个材质的Shader选择为我们用Shader Graph创建的shader

         我们将其应用到场景中的某个模型上,看看实际效果

 Shader Graph更多的探索

        上面的练习我们创建了一个简单的shader并且应用到了材质上。Shader Graph还有许多东西值得探索,在具体使用过程中,我们可能会想要了解某一个节点的详细帮助信息。我们可以在Shader Graph中选择一个节点,右键点击后,选择Open Documentation选项,Unity会帮助我们打开这个节点相关的文档。

        Unity官方关于Shader Graph的手册地址:About Shader Graph | Shader Graph | 10.7.0

        Unity官方的一个制作飘扬的旗帜的案例:Make a Flag Wave with Shadergraph - Unity Learn

        Unity资源商店中其他创作者的案例:Unity Asset Store - The Best Assets for Game Making

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/359677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IO流详解及常用方法

1.1. 什么是IO流IO流: Input/Output Stream流: 指的是一串流动的数据, 在数据在流中按照指定的方向进行流动。 实现数据的读取、写入的功能。1.2. IO流的使用场景使用File类, 只能做关于文件的操作, 获取属性、 创建文件、 删除文…

数字化时代,如何做好用户体验与应用性能管理

引言 随着数字化时代的到来,各个行业的应用系统从传统私有化部署逐渐转向公有云、行业云、微服务,这种变迁给运维部门和应用部门均带来了较大的挑战。基于当前企业 IT 运维均为多部门负责,且使用多种运维工具,因此,当…

[numpy算法复现]-第27节 Apriori算法原理(相关性)

文章目录 0. 结论1. 算法起源2. Apriori算法思想2.1 算法综述2.2 示例0. 结论 Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合的模式有助于我们做一些决策。比如在常见的超市购物数据集,或者电商的网购数据集中,如果…

公会发展计划(GAP)第三季

继前两季发布的公会发展计划取得成功之后,Yield Guild Games 现在推出了第三季的公会发展计划(GAP)。GAP 在第二季有了显著的增长,有超过 3000 个成就 NFT 被铸造。GAP 是以成就为导向的社区代币分配协议,下一次迭代将…

实验一 基于MATLAB语言的线性离散系统的Z变换分析法

实验一 基于MATLAB语言的线性离散系统的Z变换分析法 一、实验目的 1. 学习并掌握 Matlab 语言离散时间系统模型建立方法; 2.学习离散传递函数的留数分析与编程实现的方法; 3.学习并掌握脉冲和阶跃响应的编程方法;…

智慧校园:电子班牌+家长端小程序源码

说到智慧校园家长端微信小程序大家有多少了解呢?它有哪些优点和功能呢? 下面就来说说智慧校园家长端微信小程序的特色和优点。 1.学生通过闸机人脸、刷卡进出校,如出校则推送给家长小程序孩子已离校的信息,如进校则实时推送孩子已进校信息…

解决Visual Studio Code 热键冲突

因为最近很火的ChatGPT,更新了VSCode的版本,但是界面和配置有了一些变化,原来的热键也有所调整,在使用markdown的时候,enter键竟然都出现了冲突,在此记录一下操作步骤,非常简单。 报错如下&…

为什么要用数据库视图?

视图的定义 视图(View)是一种虚拟的表,其结构和数据来自于一个或多个基本表,可以被当作普通表一样进行查询操作,但实际上不存储任何数据。在数据库中,视图可以被看作是一种数据访问的方式,它可…

16.hadoop系列之MapReduce之MapTask与ReduceTask及Shuffle工作机制

1.MapTask工作机制 以上内容我们之前文章或多或少介绍过,就已网络上比较流行的该图进行理解学习吧 MapTask分为五大阶段 Read阶段Map阶段Collect阶段溢写阶段Merge阶段 2.ReduceTask工作机制 ReduceTask分为三大阶段 Copy阶段Sort阶段Reduce阶段 3.ReduceTask并…

eBPF双子座:天使or恶魔?

启示录 新约圣经启示录认为:恶魔其实本身是天使,但炽天使长路西法背叛了天堂,翅膀变成了黑色,坠落地狱,堕落成为恶魔。这些恶魔主宰著黑暗势力,阻碍人类与上帝沟通,无所不用其极。所以可以说天…

box-shadow详解

box-shadow详解 属性定义及使用说明 box-shadow属性可以设置一个或多个下拉阴影的框。 语法 box-shadow: h-shadow v-shadow blur spread color inset;注意:boxShadow 属性把一个或多个下拉阴影添加到框上。该属性是一个用逗号分隔阴影的列表,每个阴…

使用多种算法对sin函数进行拟合-学习记录

1.使用linear层拟合 原代码链接在这里,效果如下: 2.使用LSTM预测 原代码链接在这里,效果如下: 3.使用GAN拟合 忘记代码哪里找的了,不过效果很差。 4.使用LSTM-GAN 这个代码在GitHub上找的,然后改了改&…

3、内存管理

文章目录1、内存的基础知识1.1、什么是内存?1.2、进程的运行原理--指令1.3、逻辑地址 & 物理地址1.4、从写程序到程序运行1.5、装入模块到运行1.6、装入的三种方式--绝对装入1.7、装入的三种方式--静态重定位1.8、装入的三种方式--动态重定位(重定位…

移动WEB开发四、rem布局

零、文章目录 文章地址 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee:https://gitee.com/bluecusliyou/TechLearnGithub:https:…

树的概念及结构

前言 什们是树?树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。树 (1)树的特点 有一个特殊的…

Blazor入门100天 : 身份验证和授权 (3) - DB改Sqlite

目录 建立默认带身份验证 Blazor 程序角色/组件/特性/过程逻辑DB 改 Sqlite将自定义字段添加到用户表脚手架拉取IDS文件,本地化资源freesql 生成实体类,freesql 管理ids数据表初始化 Roles,freesql 外键 > 导航属性完善 freesql 和 bb 特性 本节源码 https://github.com/…

采用aar方式将react-native集成到已有安卓APP

关于react-native和android的开发环境搭建、环境变量配置等可以查看官方文档。 官方文档地址 文章中涉及的node、react等版本: node:v16.18.1 react:^18.1.0 react-native:^0.70.6 gradle:gradle-7.2开发工具:VSCode和android studio 关于react-native和…

即拼商城系统之七人拼团会员模式

即拼商城系统之七人拼团会员模式,在商城选购399商品可加入会员体系,参加7人拼团盈利。购买产品或礼包成为团长,铺满剩余6个位置拼团成功。满团后即可用赚来的钱去复购礼包再次开团,继续盈利。 ◇◆商城系统团长获得礼包提成&#…

【matplotlib】可视化解决方案——如何向图表中添加数据表

概述 虽然 matplotlib 主要用途是绘图,但是他还是可以在绘图时帮助我们做一些其他事务,比如在图表旁边放置一个整齐的数据表格。我们必须明白为数据绘制可视化图形主主要是是为了解释那些不能理解的数据。将一些来自数据整体集合的总结性或者突出强调的…

大地量子全面使用亚马逊云科技提供的多样化云服务

近年来,我国光伏和风电并网装机容量持续增长,截至2021年底,全国可再生能源装机规模突破10亿千瓦,占总发电装机容量的44.8%。其中,风电装机3.28亿千瓦、光伏发电装机3.06亿千瓦。风光电总装机和新增装机规模多年来位居全…