Shader Forge

一、前言

Shader Forge_第1张图片
ShaderForge

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

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


二、ShaderForge插件使用

官方主页:http://www.acegikmo.com/shaderforge/
通过ShaderForge新建Shader后,会提供一些Shader模板,创建对应于不同光照模型的Shader。

New Shader

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

Unlit:无光照的Shader模板,选择此模板,使用该Shader的材质将不受光照影响。
Lit(PBR):符合Unity PBR的Shader模板,采用基于物理的光照模型。
Lit(Basic):使用基础光照模型的Shader模板。
Custom Lighting:自定义光照Shader,在此Shader模板中实现自己的光照模型。
Sprite:2D精灵Shader模板,基于2D。
Particle(Additive):主要应用在发光效果的粒子Shader。
Particle(Alpha-Blended):主要应用在细碎效果的粒子Shader,如风沙。
Particle(Multiplicative):主要应用在昏暗效果的粒子Shader,如黑烟。
Sky:天空盒。
Post-Effect:屏幕空间后期处理Shader

三、设置面板

Shader Forge_第2张图片
setting.png

Return to menu:返回主界面。
Real-time node rendering:实时节点渲染,是否开启看需求。
Using scroll in the quickpicker:在快速拾取中使用滚动。
Show variable name & precision:显示变量名和精度,看需求开启。
Show node browser panel:显示节点浏览面板,是否开启看个人习惯。
Hierarchal Node Move:层次节点移动。
Compile shader:编译为.shader文件,编译成功按钮为绿色,编译不成功or改动后按钮为红色。
Auto:是否自动编译shader,建议选中。 Skybox:选择天空盒,在不受天空影响的模板中被冻结。
Rotate:选中后模型自动旋转。 左上角摄像机按钮:保存当前的连接节点图。
预览面板也支持缩放和旋转视图。


Shader Forge_第3张图片
shaderSetting.png

Path:文件路径,可修改。
Fallback:在运行平台硬件不支持该shader的情况下,选择替代shader。
Allow using atlased sprites:2D开发使用,3D默认即可。
Draw call batching:批处理绘制调用,默认Enable。
Inspector preview mode:3D/2D/sky,制作的什么类型选什么。
Target renderers:目标渲染器,如无特殊需求,默认。


Shader Forge_第4张图片
properteis.png

可以拖动改变显示位置,同时在Inspector面板更新。


Shader Forge_第5张图片
Lighting.png

Render Path:渲染路径,正向渲染或延迟渲染,移动平台选择正向渲染即可。
Light Mode:光照模型,对应不同的Shader模板。分别是无光照(UnLit模板)、Blinn-Phong光照模> > 型,Phong光照模型,PBL(基于物理光照,Lit(PBR)模板)。
Gloss Mode:使用光泽度还是粗糙度模型,根据自己需要。
Transparent Mode:透明度模式,淡出or反射。
Remap gloss from [0,1] to [1,2048]:重映射光泽度从[0,1]到[1,2048]。
Enery Conversing:能量守恒,PBR需要勾选。
Lighting Count:光源数量,单一定向光(太阳光)or多重光源
Lightmap & light probes:灯光贴图&灯光探针。
Per-pixel light probe sampling:逐像素光照探针采样。
Reflection probe support:支持反射探针。
Receive Ambient Light:是否接受环境光。
Mask directional light specular by shadows:定向光高光是否被阴影遮挡。


Shader Forge_第6张图片
Geometry.png

Face Culling:面剔除,默认是剔除背面,可选剔除正面,也选择双面渲染。
Normal Quality:法线质量,插值或归一化,默认使用归一化。
Vertex Positioning:顶点位置,世界空间or裁剪空间or广告牌(法线面向摄像机)。
Normal Space:法线空间选择,切线or建模or世界,默认切线空间。
Vertex offset mode:顶点偏移模式,相对偏移or绝对偏移。基于模型空间的顶点偏移叫做相对偏移,世界空间的顶点偏移叫做绝对偏移。
Tessellation Mode:曲面细分模式,一般不需要用到曲面细分。
Outline Extrude Direction:描边挤出方向,一般都是沿着顶点法线方向。
Per-pixel screen coodinates:逐像素屏幕坐标。
Show 2D sprite pixel snap option in material:在材质中显示2D精灵像素单元设置,3D开发忽略。


Shader Forge_第7张图片
Blending.png

Blend Mode:混合模式,如果是不透明的就选择Opaque,其余根据需要选择。
Source_+Destination:源*+目标*_,决定了源图像与目标图像以哪种方式混合。
Color Mask:颜色遮罩,需要过滤的通道取消选择。
Dithered alpha clip:抖动透明裁剪,开or关。
Offset Factor:偏移因子。
Offset Units:偏移单位。
Per-object refraction/scene color (expensive):
Receive Fog:应用雾。
Auto Sort:自动排序,如需手动改变排序,在Order中改变数值。数值越小,在渲染队列越靠前。
Depth Test:深度测试。
Ignore Projectors:忽略投影器。
Write to Depth buffer:是否写入深度缓存。
Stencil Buffer:是否开启模板缓存。


四、节点连线编辑面板

1. Main节点

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

Shader Forge_第8张图片
Main面板

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


Shader Forge_第9张图片
Setting面板

无光照的情况下 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)。

2. 以Diffuse为例

使用基本光照模型时,Diffuse = DirectDiffuse + IndirectDiffuse, DirectDiffuse = GI.DirectDiffuse, IndirectDiffuse = (GI.IndirectDiffuse + DiffuseAmbientLight) * Diffuse AmbientOcclusion。
使用自定义光照模型时,Diffuse = CustomLighting。
透明部分的输出用于计算透明值。ShaderForge会根据连线情况来配置 Blending 设置中的混合模式(Opaque、AlphaBlend等)。

Shader Forge_第10张图片
Blending面板

默认没有透明输出时,混合模式为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 代表写深度。
几何绘制部分的输出可以改变绘制物体的顶点计算。

Shader Forge_第11张图片
Geometry面板

3. 节点操作

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


Shader Forge_第12张图片
节点操作

4. 其他常用的快捷操作

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


Shader Forge_第13张图片
Alt+鼠标框选

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


Shader Forge_第14张图片
Alt+右键划动

5. 常用节点

官方对节点的说明有详细的描述和图解,建议有疑问的时候去查看官方文档:
http://www.acegikmo.com/shaderforge/nodes/

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

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

节点实例

1. 偏色

Shader Forge_第15张图片
偏色

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

Shader Forge_第16张图片
UV变化

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

Shader Forge_第17张图片
勾边光

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

Shader Forge_第18张图片
地形


五、代码和优化

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

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

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


Shader Forge_第19张图片
请输入图片描述

Shader设置与代码之间的关联

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

1. Shader Settings 和 Properties 模块

Shader Forge_第20张图片
请输入图片描述

2. Lighting 模块

Shader Forge_第21张图片
请输入图片描述

3. Geometry 和 Blending 模块

Shader Forge_第22张图片
请输入图片描述

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

节点连线生成的代码大部分在frag这段内容中,可以通过对比的方式来找到节点计算对应的代码,对前文节点示例中的节点图举几个例子:


Shader Forge_第23张图片
请输入图片描述
Shader Forge_第24张图片
请输入图片描述
Shader Forge_第25张图片
请输入图片描述

通常我们会手动修改node_9660这种临时参数为可理解的变量名称。

代码的优化空间

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

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

Shader Forge_第26张图片
请输入图片描述

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

Shader Forge_第27张图片
请输入图片描述

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

Shader Forge_第28张图片
请输入图片描述

参考:https://blog.uwa4d.com/archives/USparkle_ShaderForge.html

你可能感兴趣的:(Shader Forge)