介绍

你好普京努。

在本文中,我们使用 Unity 的 ShaderGraph 功能移动的 2D 半色调着色器将产生。
因为我还没有写技术文章的经验,拼写错误、不正确的表达方式等。可能含有。
当你找到它时,评论或我的 Twitter (@putinu3),如果您能与我联系,我将不胜感激。

这篇文章是如何创作的

半色调有时会以时尚的 UI 和阴影表情的形式出现,但当我对“我想做!”感兴趣时(我看过很多关于 3D 阴影的半色调文章……)

既然如此,我想我可以自己为 UI 创建一个半色调着色器,并在一篇文章中作为示例进行介绍。
如果您有兴趣,请看一看。

很重要的一点

  • 在这篇文章中,仅关于如何为 UI 制作半色调着色器我专注于
    • 我不会提及 3D 的半色调着色器。
  • 关于Canvas显示UI,Screen Space - Overlay这没用.
    • 只有Screen Space - Camera 可以正常工作。
    • 详情如下。

这次做什么

在本文中,我们将创建以下内容。

以下是此着色器的概述和属性:
【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた

属性名称 类型 解释
MainTex 纹理 2D 保留Sprite 的纹理信息
粗糙度 漂浮 丸粗糙度
最大圆尺寸 漂浮 圆圈大小限制
隐藏偏移 漂浮 半色调消失的位置
隐藏距离 漂浮 直到半色调消失的距离
回转 漂浮 UV的旋转量
移动速度 漂浮 半色调移动速度
移动方向 矢量 2 半色调移动方向

环境

  • Unity 2021.3.9f1 个人版
  • 通用 RP 12.1.7

1. 什么是半色调?

半色调或半色调是灰度或彩色图像的可打印表示,带有有限数量颜色的小点图案(例如,白纸上的黑点)。它就是制作出来的。

通过调整圆圈(圆点)、阴影等的大小。颜色的深浅好像是在表达

好像主要是用来打印的,但是现在一种设计也用作
我也看到了一些将它用作游戏 UI 的一部分的例子。
您可以从下面的链接中使用半色调检查各种游戏 UI。

2. 准备

准备创建着色器的环境。

Unity 和 ShaderGraph 的基本操作没有涉及。
请相应地检查教程页面。

2.1. 文件创建

首先,使用2D (URP) 创建一个新的 Unity 项目。

项目启动后,在Project窗口右击选择Create > Shader Graph > URP > Sprite Unlit Shader Graph新建文件。

打开文件后,您将看到如下图所示的窗口。
【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた

2.2. 显示UI的排列

Hierarchy 窗口中右键单击并选择UI > Image 以创建将应用我们的着色器的游戏对象。
要使用Sprite,请自行准备或使用下面切换中的材料。

精灵材质

它分为内侧(左)和外侧(右)。仅将着色器应用于内容(左)。
【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた

创建后,Canvas 将被创建为其父对象,选择它。并将Inspector 窗口中的Canvas > Render Mode 更改为Screen Space - Camera
不要忘记将Main Camera 附加到Render Camera
【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた

屏幕空间问题 - 覆盖

从 2022/9/18 开始,如果在 Unity2021.2 或更高版本中将 Render ModeCanvas 设置为 Screen Space - Overlay,当您尝试将着色器应用于 UI应该透明的部分不透明,变成黑色。有一个错误(?)。

2D Object是没有问题的,但是用UI会出现上述问题,所以要小心。

Unity论坛上也有关于这个问题的贴子,但目前没有任何改善,解决方法就是干脆使用Screen Space - Camera

2.3. 创建/附加材料

Project 窗口中,选择之前创建的着色器文件,然后右键单击以使用从Create > Material 应用的着色器创建Material

然后选择Image 以应用Hierarchy 窗口中的着色器,并将刚刚创建的材质附加到Inspector 窗口中的Material 字段。
【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
准备工作完成。

3.逐个元素创建

首先,在制作这个半色调着色器时所需组件我认为
之后,我们将在 Unity 上实际创建着色器。

这一次,我们将按照以下方式进行。

  1. 制作半色调形状
  2. 使保持纵横比成为可能(使它成为一个美丽的圆圈)
  3. 根据位置减小圆
  4. 旋转
  5. 移动
  6. 适合纹理

    3.1. 创建半色调形状

    创建半色调图案时,您需要注意以下几点:

    • 尺寸变化
    • 等间距(图案化)
    • 移动

    首先,关于“大小变化”,使用Step函数,中心为1,外部为0二值化你可以通过

    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    中间为 1,外部为 0 的图像图像

    接下来,“等间距”意味着坚定不移使用Voronoi 节点生成Angle Offset 0
    “移动”使用UV 作为输入滚动似乎可以表达为
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    如下图所示放置,并将输出目的地连接到Alpha
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    Voronoi 节点在每个圆的中心有一个黑色的0。因此,使用Step函数二值化后,使用One Minus节点反转值我让你。

    此外,对于 Call DensityVoronoi 节点,可自由定制的粗糙度准备Roughness 输入属性Float 并连接它。

    Save Asset 以迄今为止创建的状态执行时,它处于以下状态。

    粗糙度:5
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた

    3.2. 允许保留纵横比

    当处理像上图那样垂直或水平长的Sprite时,UV0~1的范围内将被推迟.
    结果,圆圈被水平绘制。为了解决以上问题,需要保持纵横比有。

    具体来说,当前只有0~1 范围的UV 范围需要缩放以适应Sprite 的纵横比。

    这里Sprite的垂直长度设置为1固定的去做。
    然后,找出水平长度相对于垂直长度的长度,然后比率乘以原来的UV
    现在UV变化范围你可以。

    w, h, 和 u0, v0 u0, @987654413 u, @987654413 @teeth,

    (u, v) = (\frac{w\cdot {u_0}} h, v_0)
    

    变成。

    具体例子(垂直:100,水平:200)

    例如,Sprite 的垂直长度为100,水平长度为200
    在这种情况下,如果将其代入上述公式,

    (u, v) = (2u_0, v_0)
    

    变成。简而言之,u轴方向(水平方向)倍增您将能够绘制漂亮的圆圈。

    在 ShaderGraph 中,您可以使用TexelSize 节点获取纹理的垂直和水平长度。
    这一次,我们将使用它来保持纵横比。
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    对于连接到TextureMainTex 属性,从图像左下角的+マーク 中选择Texture 2D,并将名称创建为MainTex

    确保属性中的 Reference 名称为 _MainTex

    将前面的等式放入ShaderGraph 会得到下图。
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    保持纵横比的值从最右边的Vector 2 节点输出。
    通过将此输出值与Voronoi 节点的UV 连接,可以返回一个漂亮的圆圈。
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた

    3.3.按位置减圆

    这一次,通过使用Step 函数将Voronoi 节点的输出值二值化来表示半色调。
    还有,这改变边界值经过改变圆的大小我让它成为可能。

    所以要根据位置使圆变小,UV 取决于坐标为了能够改变二值化的边界值这看起来不错的样子。

    3.3.1. 直接连接UV

    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    我将Step 节点的UV 输出连接到Step 节点的Edge
    然后,如下图所示,创建了一个左端大小为0,右端大小为1 的半色调。
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた

    3.3.2. 设置上限

    接下来,到圆的大小这样我们就可以设置一个上限去做。
    您可以使用Clamp 节点设置上限和下限。

    将它放在UVStep 节点之间,并在Max 上设置一个新的Float 类型属性MaxCircleSize
    请随时使用Min
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    这样,我们就可以限制Step 节点的边界值。

    3.3.3. 可以调整消失位置

    接下来,让我们调整半色调淡出的位置。

    通过移动原UV坐标的位置,调整半色调消失位置。
    如下图,是移动边界值为0的位置的图像。
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    要更改位置,请使用 Add 节点添加偏移值去做。
    这里要添加的偏移值被做成HideOffset的属性,以便以后可以自由更改。
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた

    3.3.4. 使消失距离可调

    最后,我希望能够调整半色调消失后的距离。

    减小边界值的宽度,如下图所示。扩展指定倍数以便可以对其进行调整。
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    要表达这一点,请使用划分的Divide 节点,待除数准备一个新属性HideDistance
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    到此为止的排列完成后,通过调整附加shader的Material中的属性,可以在一定程度上实现类似半色调的调整。

    最大圆形尺寸:1
    隐藏偏移:-0.7
    隐藏距离:0.5
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた

    3.4. 旋转

    从这里开始,到目前为止,我们将向内容添加旋转元素。
    旋转可以像以前一样通过更改UV 坐标来表示。

    对于旋转表示,使用Rotation 节点并将其连接在UVDivide 节点之间。
    另外,此时将Rotation的值设为Rotation的属性,使其可以自由旋转。
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    通过如上排列它们,您可以创建一个倾斜的半色调,如下图所示。

    旋转:-0.2
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた

    3.5. 移动

    最后让半色调工作。
    这里,用于表示半色调的Voronoi节点的UV滚动来表达运动。

    3.5.1. 暂时运行

    为了表达运动,首先将某个点的UV坐标为t 秒后的位置应该被考虑。
    设起点为0,距离为d,移动速度为v,时间为t

    d = vt
    

    可以写成
    让我们把它放在图表上。

    首先,在Move 组中,准备一个通过将经过时间Time 与新创建的移动速度属性MoveSpeed 相乘获得的值。
    然后将其添加到UV 坐标的输出值,同时保持纵横比,并连接到Voronoi 节点的UV
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    如果在上述状态下从Save Asset保存,对角线半色调现在滚动。

    3.5.2. 给出运动方向

    现在只能向一个方向移动.
    因此,通过创建类型为 Vector 2 的新属性 MoveDirection被赋予运动方向去做。

    这里需要注意的是移动速度已经设置是。
    乘以 MoveDirection 的值时,使用正常化并且向量的大小应该是1

    将以上所有内容放在一起,我们得到下图。
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    Normalize 节点用于将运动方向的归一化向量与原始输出相乘。
    然后,将那里获得的输出值重新连接到新的Add 节点。

    对于One Minus 节点,运动方向调整从某种意义上说是这样安排的

    这里,如果MoveDirection的值为(x, y)=(-1, 0)向左移动你可以检查你在做什么。

    3.6.匹配纹理的形状

    至此,大部分的调整已经完成。
    从这里,附加的纹理符合形状做这项工作。

    首先,使用Sample Texture 2D节点,将MainTex属性连接到Texture,得到纹理的形状和颜色。

    不需要在纹理中投影alpha值为0的部分透明部分因此,输出到Alpha的值和Alpha 通道不透明度乘以
    使用Multiply 节点将alpha 通道与One Minus 节点的输出相乘,然后拼接回Alpha,如下图所示。

    颜色可以通过将Sample Texture 2D节点的RGBA连接到Base Color来表示。
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた
    如果你能做到这一点,你就完成了!
    Save Asset保存并确认,就是这次的目的遵循 UI 形状的半色调可以看到
    【Unity】ShaderGraphを用いて動く2D向けハーフトーン(Halftone)を作ってみた

    4.总结

    这是使用ShaderGraph 创建移动二维半色调的过程。
    我将简要总结到目前为止的步骤。

    1. 使用Voronoi 节点创建半色调形状
    2. 基于Texel Size节点,保持纵横比
    3. UV根据坐标把圆变小
    4. 旋转UV
    5. UV 滚动移动
    6. Sample Texture 2D 用节点排列形状和外观

      5. 后记

      感谢您阅读本文至此为止。

      这次创建的shader不仅是作为UI的重音或装饰,画面过渡在这种情况下似乎有使用空间。

      另外,这次半色调是垂直和水平对齐的,但是圆圈的位置是一步一步交替尝试创建这样的半色调可能会很有趣。
      我想把这个作为未来的问题。

      以我自己的方式,把它做成了易用性和一定程度的泛化,但我觉得还有更多的使用方式,所以我希望读者可以从这里自由扩展。

      好吧。

      参考


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308626380.html

相关文章:

  • 2022-01-12
  • 2021-05-15
  • 2022-12-23
  • 2021-04-08
  • 2022-12-23
  • 2021-07-20
  • 2021-04-19
猜你喜欢
  • 2021-04-02
  • 2021-11-20
  • 2022-12-23
  • 2021-04-22
  • 2022-12-23
  • 2021-11-30
  • 2022-12-23
相关资源
相似解决方案