马上注册,加入CGJOY,让你轻松玩转CGJOY。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

Unity的技术经理Ciro Continisio在Connect上分享创作模仿任天堂游戏《塞尔达传说:旷野之息》角色风格的着色器,受到不少用户的关注,本文将在分享制作该着色器的方法。

1.gif (1.79 MB, 下载次数: 5)

2018-10-19 14:25 上传

说明事项:该着色器使用Shader Graph着色器视图制作。

使用了全新的轻量级渲染管线LWRP。

由于目前LWRP和Shader Graph着色器视图仍处于早期阶段,各自存在一些限制,本文将讲解如何使用技巧来解决这些限制问题。

受客户端所限制,为了方便大家更好阅读理解,本文中着色器完整视图图片提供了下载,请在文末获得下载地址。

目标

我打算实现二个层级的着色器,它带有强光和阴影。我要以二种方法支持镜面光照:头发使用简单的颜色面片实现,而皮肤要通过画笔描边来定义。

你可以在下图看到二种方法的不同,塞尔达的衣服呈现了特有的画笔描边效果,而她的头发上的高光只是明亮颜色的硬块。

2.jpg (23.44 KB, 下载次数: 16)

2018-10-19 14:26 上传

希望实现的着色示例效果

我还想实现面向太阳时出现的边缘光照效果,以及当光线在特定角度时出现的几乎全白的边缘,请注意图中塞尔达的耳朵、手指和右臂。

最后,我想支持高光、法线和发射贴图。

视图流程

下图是视图流程的概述,所有重要部分都根据功能用方块突出显示。

3.jpg (27.05 KB, 下载次数: 66)

2018-10-19 14:26 上传

左侧的TangentToWorld节点不是自定义节点,而是一个SubGraph。因为当时Transform节点存在bug,所以我必须使用SubGraph重新实现转换,从切线空间转为世界空间。

该节点内容如下图所示。

4.jpg (14.63 KB, 下载次数: 44)

2018-10-19 14:26 上传

TangentToWorld SubGraph

让我们返回该视图,如我们所见视图从左到右,从几何体的法线开始处理,它混合了来自图中紫色方框Normal map部分的法线。法线定义了表面的方向性,对计算光照非常重要。

然后来到黄色方框Lighting部分,使用自定义节点从场景的主定向光获取光照数据。

为了创建着色效果,我计算了二个向量的数量积,即光的方向和法线。通过使用Smoothstep节点获得该遮罩,它看起来是带有硬边缘的黑色和白色。

除了作为模型实际的光线和阴影外,该遮罩还用于遮蔽高光和和镜面反射。可以看到,从Smoothstep节点中心分出了三个分支。

镜面高光和画笔效果

视图下方是蓝色方框Specular,我获得了视线和光线方向的半个向量,然后使用该向量来计算镜面的遮罩。在此阶段中,我使用了非常简单的Blinn-Phong着色模型。

我不认为该模型的实现是最完美的,但足以满足演示本项目,该效果取决于光线和视线角度,你也可以自行调整该实现。

然后,我使用这个遮罩来裁剪屏幕空间纹理,创建画笔轻触效果,即上半部分的Paint brush部分;还使用了该遮罩的原本功能,处理头发部分面片形状的镜面效果,即下半部分的Patch部分。为了切换使用这二个功能,我暴露了名为UseSpecularDabs的属性,通过分支节点验证该属性。

5.jpg (6.25 KB, 下载次数: 13)

2018-10-19 14:26 上传

这个部分也是支持镜面贴图的关键部分,可以使金属物品看起来更有光泽,例如:皮肤或木材。

使用边缘效果实现有趣的反差

视图顶部的青色方框Rim highlights,在这里,我使用预制的Fresnel Effect节点,但我仍然使用了光线和视线方向的数量积来过滤该节点,这样做会得到只在对象面向光线时出现的边缘。

当对象背对着阳光或夕阳时,你知道观察此时该对象会得到什么效果吗?

对象会完全被黑暗掩盖。而通过加入该节点,角色会得到彩色的轮廓,即使这样的效果不现实。这是个伪造的效果,但它让角色看起来更有趣。

效果如下图所示。

6.jpg (14.42 KB, 下载次数: 16)

2018-10-19 14:26 上传

Fresnel节点连接到了二个Step,这是为什么呢?

下方的Step效果能在黑暗区域出现并重写这些区域,实现前面提到的“夕阳”效果。本示例中,光线没有人为加强,你会得到完全被阳光照射时的颜色。上图中角色身体和脸部轮廓可以看到该效果。

7.jpg (10.69 KB, 下载次数: 7)

2018-10-19 14:26 上传

顶部部分呈现了白色轮廓,可以从特定角度观察到,它只出现在已经受光的区域。所以该部分与表示卡通效果的Smoothstep相乘,所以它不会在黑暗区域呈现。Step函数偏移了0.2,这意味着该效果只会出现在靠近形状边缘的位置,使二个效果可以共存和重叠。

上图中女孩的手套上能清楚地看到该效果,手套几乎是全白色。

Master节点:合并所有节点

视图的剩余部分比较简单,你可以看到不同组件如何合并到着色器的“主干”,用红色表示,它最后会链接到Master节点,即右边的最后一个节点,这部分我只使用了一个技巧。

Shader Graph着色器视图如今支持二种类型的Master节点:PBR和Unlit。理想情况下,Unlit节点很适合卡通着色器,因为我要自己计算颜色。但由于我想要得到阴影,而无光照着色器不会默认获取阴影,所以我不得不使用PBR节点。如果以后Unity加入新的Master节点类型,我可能会修改Master节点类型。

8.jpg (8.82 KB, 下载次数: 8)

2018-10-19 14:26 上传

PBR Master节点可以带来预制光照模型,适用于逼真的材质。然而,我不需要该模型,我只需要阴影而已。如果使用反照率的话,光线会再乘以已计算的颜色,这不是想要的效果,我想在视图中自行控制颜色。所以我没有使用反照率,我将反照率设为黑色,所以该材质没有得到任何PBR效果。

那么我是如何控制颜色的呢?答案是使用发射。这会带来额外问题:Emission槽需要同时充当反照率、镜面反射、金属度和发射。

发射是最难处理的:我需要计算所有着色器,将发射看作反照率,在最后为顶部添加发射值,不管它是单个值还是纹理,然后缩放它的大小,使不应具有发射效果的部分不被获取,例如:被Bloom屏幕过滤器获取。

实现该平衡的过程很麻烦,而且也不完美,但它让我得到了想要的效果:卡通风格的颜色、发射支持和自阴影。

资源下载

我很满意此次实践得到的结果,我也希望你喜欢该着色器和这篇文章。

我决定不分享视图的ShaderGraph文件,如果我分享了该文件,你会直接将它放到自己的游戏中,这样学不到任何知识。所以我将提供完整大小的着色器视图图片,你可以放大查看图片,了解所有节点和属性的细节。

当你重建该视图的话,你会学习到Shader Graph着色器视图的很多知识,了解这样的效果为什么能够实现。

完整大小的着色器视图图片地址:

https://pan.baidu.com/s/1nLIgow13HxdUzYhFUbovrw

本文中关于Blinn-Phong模型的信息,请访问:

https://paroj.github.io/gltut/Illumination/Tut11%20BlinnPhong%20Model.html

结语

可视化编程工具Shader Graph的出现,帮助更多开发者,美术等,进行可视化的着色器构建,不必手工编写代码.我们希望以这个着色器为示例帮助你更好理解和使用着色器视图Shader Graph.

转自:Unity官方平台

php代码着色器,使用Shader Graph实现《塞尔达传说:旷野之息》风格的着色器(转)...相关推荐

  1. 使用Shader Graph实现《塞尔达传说:旷野之息》风格的着色器

    本文转自Unity Connect Unity的技术经理Ciro Continisio在Connect上分享创作模仿任天堂游戏<塞尔达传说:旷野之息>角色风格的着色器,受到不少用户的关注, ...

  2. 为新手准备的 Codea 着色器(Shader)教程

    为新手准备的 Codea 着色器(Shader) 教程 原文标题:<Shaders for dummies>  作者:Ignatz  译者:FreeBlues  译文链接:http://m ...

  3. Shader Graph入门

    目录 Shader Graph 简介 1. 什么是 Shader Graph 4. Shader Graph 界面 4.1 Shader Graph 窗口 4.2 Shader Graph 窗口操作方 ...

  4. Shader Graph 7.5.1

    一.关于Shader Graph Shader Graph使您可以直观地构建着色器.你无需编写代码,就可以在图框架中创建和连接节点. Shader Graph可通过Unity版本2018.1及更高版本 ...

  5. [技术] 使用Shader Graph着色器视图制作交互式顶点特效

    ------------------------------------------------本文转载于unity官方老论坛------------------------------------- ...

  6. Unity Shader:细分着色器(Tessellation Shader)在Unity顶点着色器中的写法以及各参数变量解释

    图1:在Unity内将sphere细分后 图2:在Unity内将sphere细分后 Unity官网关于细分着色器的资料比较少,只有在Surface Shader中使用的例子.我看了下Surface S ...

  7. shader变体是什么_[Unity/shaderlab]关于着色器变体

    在Unity中可以通过#pragma multi_compile或者#pragma shader_feature指令来实现着色器多样化. 在运行时,相应的着色器变体是从材质的关键词中取得的(Mater ...

  8. Learn OpenGL(四)——片段着色器(Fragment Shader)

    片段着色器(Fragment Shader) 片段着色器是第二个也是最终我们打算创建的用于渲染三角形的着色器. 片段着色器的全部, 都是用来计算你的像素的最后颜色输出. 为了让事情比较简单, 我们的片 ...

  9. 3D河豚鱼—OpenGL着色器(Shader)和GLSL程序

    3D河豚鱼-OpenGL着色器(Shader)和GLSL程序 效果图 程序代码 #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #el ...

最新文章

  1. oracle vm virtualbox如何设置u盘启动_电脑自主U盘装机 如何设置U盘启动
  2. 使用Unsafe真的是关于速度或功能吗?
  3. oracle cascade是什么意思啊,Oracle外键(Foreign Key)之级联删除(DELETE CASCADE)
  4. 好用的前端组件收集(ing)
  5. java实现顺序表的增加,删除,查找,打印
  6. 镜像串之字符串常量用处
  7. 网友发给我一个游戏钓鱼网站,我用python渗透了该网站所有信息!
  8. ajax调取mysql数据显示在html_ajax实现从后台拿数据显示在HTML前端的方法
  9. 消防信号总线原理_消防总线隔离模块作用及工作原理?
  10. JAVA名字正则表达式(包含新疆姓名)
  11. 华为防火墙基于IP地址的带宽管理
  12. 微信视频通话怎么美颜
  13. 笔记本扩展显示器,微信界面显示字体模糊如何解决?
  14. 国外计算机从什么开始学,从零开始学电脑知识 1(国外英语资料).doc
  15. Linux ARM平台开发系列讲解(摄像头V4L2子系统) 2.12.5 V4L2 control的原理和实现
  16. 在windows11上安装cuda,cudnn,以及GPU版的pytorch
  17. java电话面试_记一次java电话面试
  18. Android 9.0 (P)
  19. 【资讯】辉煌十载!BDTC 2017 中国大数据技术大会在京盛大召开
  20. Sonar代码扫描常见规则总结

热门文章

  1. ySQL字符串函数:字符串截取
  2. Java设计模式之观察者模式(UML类图分析+代码详解)
  3. 袋鼠云数栈基于CBO在Spark SQL优化上的探索
  4. 移动支付公司iZettle融资逾1400万美元
  5. hidl 原理分析_AIDL原理分析
  6. 计算机二级考试手机app,计算机二级考试
  7. 我想对雷军说:请做点实事为用户,别天天在微博上吹牛逼
  8. excel数据技巧:6条最实用的透视表偏方
  9. mysql distinct where_MySQL-数据库表数据查询基础(DISTINCT、WHERE)
  10. ORACLE锁表解决办法