Notifications
Article
Unity Polybrush与顶点色着色器
Published 13 days ago
17
0
今年年初,我们宣布了ProBuilder和Polybrush将正式成为Unity的一部分。我们已经详细介绍过使用ProBuilder快速关卡建模,而Polybrush可以帮助我们完成粗略的雕刻、纹理混合、对象散布和顶点色绘制等功能。
通常为了处理顶点色,必须进行3D程序代码编写并估计最终结果。但有了Polybrush后,我们可以直接在编辑器中进行绘制,然后看到处理后的效果。
本文将展示一些使用顶点色的着色器示例,介绍如何将Polybrush和它们一起使用。

获取Polybrush

你可以访问Asset Store资源商店下载Polybrush :
https://www.assetstore.unity3d.com/cn/?stay#!/content/111427
下载完毕后导入资源包,点击菜单栏,选择Tools > Polybrush > Polybrush Window。
打开Polybrush 窗口中,如下图所示,我们可以看见四个功能选项:
  1. 雕刻(Sculpting)
  2. 顶点色绘制(Vertex Color Painting)
  3. 对象散布(Object Scattering)
  4. 纹理混合(Texture Blending)

功能介绍

1.雕刻

该功能拥有二个标签页,第一个标签页用于升降顶点位置,第二个标签页用于平滑处理顶点位置。

2.对象散布

在使用该部分功能前,首先需要给Palette添加一些预制件,预制件位于目录Procore > PolybrushPrefab Palettes > Default下。
将想要绘制的预制件拖入到此处。如果想要删除预制件,选取后按下退格键。
现在就可以点击放置对象,笔刷的强度(Strength)属性控制对象密度。

3.纹理混合

纹理混合功能需要具体的着色器设置,它使用三个UV集。资源包内含有一些示例,我们可以通过示例了解如何进行设置。
下面展示Polybrush的TriPlanar Blend功能。
给材质添加想要的纹理,然后在Texture Paint Settings中选择纹理即可。Flood选项会将整个网格绘制为所选颜色,Fill选项只会绘制预览图中的顶点,Brush选项会以光标为圆心绘制特定半径的圆形区域。

顶点色绘制

现在让我们详细介绍顶点色绘制。

1.读取着色器中的顶点色

为了访问着色器中的顶点色,你只需在Input Struct(表面着色器使用的结构)或Appdata Struct(顶点/片段着色器使用的结构)添加一行代码即可。
  • 顶点/片段着色器
下图代码会在Appdata struct中读取颜色,在v2F struct中声明颜色,然后将颜色在二个结构间传递。你可以在片段着色器中使用"i.color"读取颜色。
  • 表面着色器
你可以使用"IN.vertexColor"读取顶点色。
如果你不想编写代码,访问下面链接,这是最基本的顶点着色器:
https://pastebin.com/6wwsnJgY
现在我们就可以绘制顶点色了,让我们了解一些有趣的示例。

示例

1.高光

访问下面的链接,这是一个卡通高光着色器(Toon Specular):
https://www.patreon.com/posts/quick-game-art-13059579

如果不设置静态遮罩,该着色器效果会更棒,我们可以使用该着色器在任意位置进行绘制,从而使对象看起来潮湿或看起来像玻璃。
为了实现这部分,我们将伪高光数值乘以IN.vertexColor.r,o.Emission通道的边缘光也乘以IN.vertexColor.r,所以绘制区域也有发光效果。
float3 spec = (step(_SpecSize, rampS.r) * IN.vertexColor.r;
o.Emission = pow(rim, _RimPower) * IN.vertexColor.r;
这意味着绘制红色的位置都会发光,如果不想让发光效果太明显,可以使用较深的红色。
高光顶点色着色器代码:https://pastebin.com/xBMNuySz
卡通色阶如下图所示:
高光色阶如下图所示:

2.摇摆动画

该动画类似动态草丛,如果我们不想在旗帜、树叶和链子等一些静态物体使用Cloth/Physics模拟效果,我们可以使用一个处理顶点动画的着色器。
多数全局解决方案会带来剪裁问题。使用顶点色版解决方案的好处是可以设置允许的移动量。在下图的示例中,我们想要使旗帜的顶端不会移动,但只让旗杆的中间位置稍微移动一点。
我们可以乘以红色顶点色通道,控制效果的位置。
v.vertex.yz += sin(_Time.y * movementcalculation ) * v.vertexColor.r;
摇摆顶点色着色器代码:https://pastebin.com/SsDaBEgy

3.三平面多纹理

本文前面部分展示的纹理混合工具提供了非常平滑或模糊效果。对于一些艺术风格而言,该效果还不错,但我们可以尝试让边缘更清晰并带有噪音效果。
该着色器使用了和三平面一样的基色,但没有在世界法线使用“Grass”,它使用红色和蓝色顶点通道来添加新纹理。
float primary = step(0.6* noisetexture,IN.vertexColor.r );
将它与红色通道上显示的纹理相乘,然后对于纹理周围的边缘,将比原始部分稍大的区域乘以反转的原始部分,从而只留下一小部分。
float primaryEdge = (step(0.5* noisetexture,IN.vertexColor.r )) * (1-primary);
顶点色非常模糊,但是由于Step函数和噪音纹理的缘故,获得的结果非常干净。我们也可以重制纹理混合着色器来实现类似效果,因为多个UV集会得到更多纹理。
三平面顶点色着色器代码:https://pastebin.com/r9EcWvgH

小结

关于Polybrush就分享到这里,希望你能使用该工具并尝试文中的示例,但是需要注意,如果你修改了正在处理网格的导入设置,可能会破坏几何体,导致必须重新进行制作。
Polybrush仍然在测试阶段,但计划今年会直接集成进入Unity,相关信息请关注Unity官方中文论坛(UnityChina.cn)!

Unity China
316
Comments