查看原文
其他

Unity Polybrush与顶点色着色器

Unity Unity官方平台 2018-11-14

今年年初,我们宣布了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官方教师培训报名火热进行中

Unity将在10月22-26日,举办为期5天的专业的Unity官方教师培训课程,诚邀广大教师与Unity一同学习分享最新技术![了解详情...

报名地址:

https://connect.unity.com/events/2018jiaoshipeixun


Unity开学季|重磅教育活动来袭

九月开学季,Unity将在南京、南昌、上海开展重磅教育活动,欢迎教育领域的领导、专家、教师团队莅临交流![了解详情...


优惠活动|Unity订阅新起航,开启您的创作之旅

现在访问Unity在线商店(store.unity.com),成功订阅Unity Pro专业版、Unity Plus加强版即可享受全新增值服务组合。11月18日之前订阅,更有指定插件资源限时赠送。[了解详情...]

活动地址:https://store.unity.com/cn


点击“阅读原文”访问Unity官方中文论坛

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存