use pass
use pass 用于帮助shader代码重复使用。
使用步骤:
1, 被引用的shader,在被引用的shader中定义shader名和pass名
shader 1:
// 定义shader 路径
Shader "Unlit/shader1"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
//定义pass 名
Name "Mypass1"
}
2,引用shader的写法
Shader "Unlit/shader2"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
// 引用 shader路径 + 大写的pass名,注意一定要大写
UsePass "Unlit/shader1/MYPASS"
}
}
Grab pass
Grab pass 是一种特殊的pass ,通过他我们可以捕获屏幕上已经渲染的所有像素。在做一些后期效果时可以用到。
调用grab pass 有两种方式,一种是默认方式,比较耗费性能。另一种是指定变量方式,相比第一种会节省很多性能开销,在下面代码中有详细解释
Shader "Custom/NewSurfaceShader"
{ Properties
{
_LineColor("Line Color", COLOR) = (0,1,0,1)
_MainColor("Main Color", COLOR) = (0,0,0,1)
_MainTex ("Texture", 2D) = "white" {}
}
SubShader {
// 设置渲染顺序 和渲染类型
Tags { "RenderType"="Opaque" "Queue"="Overlay" }
// 使用 GrabPass 捕获屏幕像素
// 第一种方式,直接调用,会自动保存到_GrabTexture中。但如果场景中有多个物体会导致多次调用。
GrabPass { }
// 第二种放方式,科学节能方式。只会为第一个渲染的物体调用
GrabPass { "_RefractionTex" }
Pass
{
Cull back
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_instancing
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
// pass 和贴图一样,引用时需要声明
sampler2D _RefractionTex;
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _MainColor;
v2f vert (appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_TRANSFER_INSTANCE_ID(v,o);
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(i);
// 将屏幕像素截图、自定义贴图、自定义颜色等信息 添加到模型像素
return tex2D(_MainTex, i.uv) * tex2D(_RefractionTex, i.uv) * _MainColor;
}
ENDCG
}
}
}