ShaderForge简介
ShaderForge是适用于Unity,基于节点的着色器编辑器 。它可让你更轻松地创建自己的着色器 ,而不需要使用代码。只需要经过连线编译,就能很好的实现一些基于材质shader的效果或特效。用来做一些简单的特效,亦或是学习了解shader的语法,都是一个很好的选择。
以下是做的一些效果图,我将以卡通效果和屏幕等宽的outline来进行相关研究介绍。
一.什么是屏幕等宽的描边(outline)?
屏幕等宽是指无论离摄像机镜头远近都是固定的像素,作为描边宽度。shaderforge是有描边节点的,只需要设置描边宽度和颜色,就可以实现描边了。但是为什么不用它自带的呢?
因为它不是屏幕等宽的描边,当你的镜头离模型很近时,他的描边也会变粗,如下图:
这样会影响观察效果,所以在大多情况下,我们应该无论离摄像机镜头远近都是固定的像素的描边宽度,这样才是合理的。如下图:
二.修改shaderforge的源代码,创建自定义节点、属性
用过shaderforge的同学应该都知道,这个插件做出来的shader只需要在可视化界面中做做连线,修改参数等操作就可以做出一些不错的效果了,拿卡通效果和描边来说,如下图:
但是当你需要实现一些其他效果或者方案时,如果你找不到相关节点,比如我要做屏幕等宽的描边,但是右边的main节点中的outlineWidth是非屏幕等宽的描边。那么该怎么办?两种方案解决。
1.直接打开该shader,修改名字为outline的pass块,把自动生成的非等宽描边的计算删掉,重新写一个屏幕等宽的描边计算公式,代码如下:
Pass {
Name "Outline"
Tags {
}
Cull Front
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile_shadowcaster
#pragma multi_compile_fog
#pragma only_renderers d3d9 d3d11 glcore gles gles3
#pragma target 3.0
uniform float _OutLineSlider;
uniform float4 _OutLineColor;
struct VertexInput {
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct VertexOutput {
float4 pos : SV_POSITION;
UNITY_FOG_COORDS(0)
};
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.pos = UnityObjectToClipPos( float4(v.vertex.xyz + v.normal*lerp(0,0.05,_OutLineSlider),1) );
o.pos = UnityObjectToClipPos( v.vertex );
UNITY_TRANSFER_FOG(o,o.pos);
return o;
}
float4 frag(VertexOutput i) : COLOR {
return fixed4(_OutLineColor.rgb,0);
}
ENDCG
}
这段代码是当有连线连到outlineWidth和color时shaderforge自动生成的outline描边的代码pass块,然后你的模型就会显示一个描边了,宽度和颜色可以在shader面板中根据需要调节。
如果要实现等宽描边,把这块删掉重写(主要是对顶点、片元函数的代码块的修改,其他属性基本不变),代码如下:
Shader "Shader Forge/Toon03" {
Properties {
_Texture ("Texture", 2D) = "white" {}
_OutlineColor ("OutlineColor", Color) = (0,0,0,1)
_OutlineWidth("OutlineWidth",Range(0, 1))=0.01
_SepColor ("SepColor", 2D) = "white" {}
}
SubShader {
Cull Off
//使用cull front把外表面裁掉
Tags {
"RenderType"="Opaque"
"Queue" = "Geometry"
}