一、前言

ShaderForge是一款为Unity所用的、基于节点操作的Shader插件。笔者一直想写一篇关于ShaderForge的教程,希望可以分享给想学习Shader的美术。通过该插件,美术不需要编写代码就可以制作Shader。同时笔者也希望Shader程序员能客观看待这款插件,美术效果和代码优化需要美术和程序的共同配合来完成。

本文主要从插件使用和代码优化两个方面来介绍ShaderForge在手机游戏上的应用。

二、ShaderForge插件使用

官方主页:Shader Forge
通过ShaderForge新建Shader后,会提供一些Shader模板,创建对应于不同光照模型的Shader。

ShaderForge的默认用户界面分为预览、Shader设置(名称、属性、光照模型、几何绘制、混合模式)、节点连线编辑面板、节点列表

节点连线编辑面板

1. Main节点
在新建Shader文件时,默认会有一个唯一的Main节点,用于输出材质效果。大家可以参考Unite2014-ShaderForge教程进行整理,链接如下:
https://www.youtube.com/watch?v=WMHpBpjWUlY

基本输出会根据 Lighting 设置中的所选的不同光照模型(Unlit/Custom、Blinn-Phong、Phong、PBL)进行计算。

无光照的情况下 FinalColor.rgb = Emission。

使用光照模型的情况下 FinalColor.rgb = Diffuse + Specular + Emission,Normal用于Diffuse和Specular的光照计算。

手机游戏使用光照 一般使用 Forward 前向渲染,使用光照模型 Blinn-Phong ,会计算漫反射、环境光和高光。 Light Count 代表接受单个光源Single Directional还是多个光源Multi-light的影响。 Lightmap & light probes 代表可参与光照烘焙。 Receive Ambient Light 代表接受Lighting面板中设置的环境光的影响。

光照部分的输出 用于在基本光照模型上添加间接光照(Ambient Light和Ambient Occlusion)或者改变光照模型使用自定义光照模型(Custom Lighting)。

以Diffuse为例

使用基本光照模型时,Diffuse = DirectDiffuse + IndirectDiffuse, DirectDiffuse = GI.DirectDiffuse, IndirectDiffuse = (GI.IndirectDiffuse + DiffuseAmbientLight) * Diffuse AmbientOcclusion。

使用自定义光照模型时,Diffuse = CustomLighting。

透明部分的输出用于计算透明值。ShaderForge会根据连线情况来配置 Blending 设置中的混合模式(Opaque、AlphaBlend等)。

默认没有透明输出时,混合模式为Opaque不透明模式,FinalColor.a = 1。Opacity有输出时,根据混合模式对应的运算得到透明度,FinalColor.a = Opacity。

常用的半透明混合模式有AlphaBlend、Additive,AlphaBlend的计算方式为:SrcAlpha+DstOneMinusSrcASlpha;Additive的计算方式为SrcAlpha+DstOne。

OpacityClip有输出时,会忽略混合模式,默认情况下只渲染高于0.5的颜色值,FinalColor.a = Clip(OpactiyClip -0.5)。

Receive Fog 代表接受雾效影响。 Auto Sort 代表根据混合模式自动选择渲染队列,一般情况下不需要手动修改。 Ignore Projectors 代表忽略投影这类对象的影响。 Write to Depth buffer 代表写深度。

几何绘制部分的输出可以改变绘制物体的顶点计算。

2. 节点操作

从节点列表里选择节点拖动到编辑面板中,熟练后可以通过节点名称的首字母以快捷键的方式找到节点。比如使用快捷键“T”找到Texture2D节点,点击添加。

3. 其他常用的快捷操作

选中节点:使用Alt+鼠标框选

断开连线:使用Alt+右键划动

常用节点

官方对节点的说明有详细的描述和图解,建议有疑问的时候去查看官方文档:
Shader Forge

这里简单说明下颜色的加减乘幂运算。Multiply乘法通常用于使颜色变亮(Color2.0)或变暗(Color0.5),Add加法通常用于使颜色变亮(Color+0.5),Subtract减法通常用于使颜色变暗(Color-0.5),Power幂可以用于对比度调整(Pow(Color,2.2))。

涉及判断(If)的运算通常不推荐在手机游戏中使用,可以通过Min、Max、Step等运算避开。

节点实例

1. 偏色

2. UV变化
Pannel、Rotation等节点可用于改变UV,配合Time节点的运算可以产生UV动画。

3. 勾边光
Fresnel节点用于获取绘制对象的边缘。

4. 地形
Lerp线性插值可以通过一个蒙版贴图来混合两张贴图来得到混合效果。

三、代码和优化

从美术的角度来看,不管是否想学习Shader代码,都需要了解它并配合程序员完成最终的优化。优化工作一部分在于节点的使用,另一部分在于代码的删减,这两个方面都可以由程序员来配合完成。从程序的角度来看,也许会认为美术制作Shader是不可掌控的,而实际上,我们应该鼓励美术去学习图形化的Shader编辑工具,并进行指导和优化。

使用ShaderForge制作的Shader可以通过文本的方式打开查看,ShaderForge通过代码开始位置的注释来还原节点连线。

一个普通Shader使用ShaderForge与手写代码的对比如下图所示。

Shader设置与代码之间的关联

根据Shader设置会生成对应的代码,对应的关系如下图所示。

1. Shader Settings 和 Properties 模块

2. Lighting 模块

3. Geometry 和 Blending 模块

节点连线与代码之间的关联

节点连线生成的代码大部分在frag这段内容中,可以通过对比的方式来找到节点计算对应的代码,对前文节点示例中的节点图举几个例子:
通常我们会手动修改node_9660这种临时参数为可理解的变量名称。

代码的优化空间

经过了几个版本的更新,ShaderForge生成的代码实际并没有太多的冗余部分。主要表现在三个方面:

1. 多余的编译指令
根据实际使用的光照情况可以选择性地去掉多余的光照编译指令项。

2. 多余的采样UV定义
当需要采样多个贴图时,考虑到贴图的UV可以从同一个UV采样进行计算,可以省去多余的UV采样。

3. 多余的变量定义
冗余的变量定义可以手动进行合并。

Unity插件ShaderForge新版(2)相关推荐

  1. 使用SubstanceDesign和Unity插件ShaderForge制作风格化火焰

    使用 SubstanceDesign 软件可以制作shader用的特殊图片,原来真有这种软件,一直好奇这种图片怎么做的 https://www.kancloud.cn/hazukiaoi/sd_sf_ ...

  2. 日落20181218001 - Unity插件应用之ShaderForge制作顶点动画

    环境 系统:Windows 10 引擎:Unity 2017.2.1f1 工具:Shader Forge 1.38 目的 使用Shader Forge制作顶点动画的实例. (1)场景布局如下. (1- ...

  3. SteamVR 2.0 Unity插件使用指南

    随着VR生态的日益增长,以及Valve Knuckles控制器的逐渐完善,SteamVR未来能够提供给用户更多的交互方式,比如手指跟踪和力反馈.近期,Valve在Unity资源商店中将SteamVR插 ...

  4. Unity插件之NGUI学习(4)—— 创建UI2DSprite动画

    创建一个新的Scene.并按 Unity插件之NGUI学习(2)创建UI Root,并在UI Root的Camera下创建一个Panel. 然后在选中Panel,在菜单中选择NGUI->Crea ...

  5. Unity插件-NGUI使用教程

    Unity插件-NGUI使用教程 本文提供全流程,中文翻译. Chinar坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 NGUI 一款强大 ...

  6. Unity插件之NGUI学习(8)—— Table和NGUI尺寸转换为世界坐标系尺寸

    依据 Unity插件之NGUI学习(2),创建一个UI Root,在UI Root下创建一个Texture作为背景图,并设置图片,在Wiget下调整大小:然后在UI Root下再创建一个Panel. ...

  7. UNITY插件信息收集

    UNITY插件信息收集 2018.8.7 UNITY超级优化神器 : Amplify Impostors posted on 2018-08-07 20:53 时空观察者9号 阅读(...) 评论(. ...

  8. AR+LBS街景实景红包PokemonGo游戏捉妖夺宝营销解决方案定制开发暨百度高德地图Unity插件SDK

    AR+LBS街景实景红包PokemonGo游戏捉妖夺宝营销解决方案定制开发暨百度高德地图Unity插件SDK 作者 komstone https://blog.csdn.net/komstone/ar ...

  9. Unity接入穿山甲广告(使用unity插件SDK接入)看这一篇就够了

    自己做的小游戏需要接广告,之前尝试过UnityAds和AdMob,但是都有点小问题.UnityAds对国内本土支持不好,Banner广告经常没有内容.Admob基本上都要对接到googlePlay,国 ...

最新文章

  1. 自动发邮件的程序 c语言,5分钟!教你用C语言发送邮件:附送源码+教学!
  2. flutter 局部状态和全局状态区别_给 Android 开发者的 Flutter 指南
  3. 阿里巴巴分布式服务框架 Dubbo
  4. 洛谷——P3807 【模板】卢卡斯定理
  5. python调用pyd_Python生成pyd文件
  6. ACCESS SQL语法参考
  7. java.util中,util是什么意思
  8. Linux 系统应用编程——网络编程(I/O模型)
  9. Cisco路由器 VOIP 配置
  10. 方法调用_thinkphp跨模块调用方法
  11. 手机需不需要更新系统?
  12. python画三维散点图-Python散点图与三维图
  13. 字符集在本地化过程中的影响
  14. linux 查看libevent 安装目录,关于Linux下libevent库的基础安装和使用
  15. dll导出类比较好的方式
  16. svn图标没有显示的解决办法
  17. Python实现的爬取百度文
  18. 大疆2018网申之机器学习算法工程师笔试题B卷
  19. 使用SecOC打造的CAN网络依旧很不安全
  20. fafa什么意思_fafafafafa 什么意思

热门文章

  1. Xcode8.2 真机测试 ,添加iOS10.3的idk到Xcode8.2中
  2. 数据结构 K - 团战可以输、提莫必须死
  3. android 7.0新特性
  4. excel中怎么拆分表格之按指定行数拆分
  5. Qt开发环境搭建(Linux)
  6. Java按行读取大文件
  7. windows10桌面_Windows 10自带桌面快捷方式管理工具!非常方便值得一试
  8. Ubuntu下teamviewer的安装及使用
  9. html不鼓励使用的标签,鼓励和提醒孩子使用敬语.html
  10. Flink入门第十二课:DataStream api/Flink sql实现每隔5分钟统计最近一小时热门商品小案例