相关文档
Unity Shader学习笔记(3)Unity Shader模板、结构、形式
SubShader之Pass
SubShader 有3种方式使用Pass
-
Pass : 创建一个新的“渲染通道”
-
UsePass : 引用已经存在的“渲染通道”, 直接使用别的Shader的Pass块。在使用时必须使用大写形式如:UsePass “MyShader/MYPASSNAME”
-
GrabPass : 抓取屏幕,并将结果存储到一张纹理中,用于后序的Pass处理。
UsePass
Float 类型换成Range(min, max)就可以在材质球上显示滑块
SubShader
{
// UsePass : 引用已经存在的“渲染通道”, 直接使用别的Shader的Pass块。在使用时必须使用大写形式如:UsePass "MyShader/MYPASSNAME"
UsePass "Reflective/Bumped Unlit/BASE"
Pass
{
Name "MyPassName"
Blend One One
SetTexture [_MainTex] { combine texture }
}
}
GrabPass
Shader "GrabPassInvert"
{
SubShader
{
// Draw ourselves after all opaque geometry
// 画出所有不透明的几何图形
Tags { "Queue" = "Transparent" }
// Grab the screen behind the object into _BackgroundTexture
// 抓住物体后面的屏幕 _BackgroundTexture
GrabPass
{
"_BackgroundTexture"
}
// Render the object with the texture generated above, and invert the colors
// 使用上面生成的纹理渲染对象,并反转颜色
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float4 grabPos : TEXCOORD0;
float4 pos : SV_POSITION;
};
v2f vert(appdata_base v) {
v2f o;
// use UnityObjectToClipPos from UnityCG.cginc to calculate
// the clip-space of the vertex
o.pos = UnityObjectToClipPos(v.vertex);
// use ComputeGrabScreenPos function from UnityCG.cginc
// to get the correct texture coordinate
o.grabPos = ComputeGrabScreenPos(o.pos);
return o;
}
sampler2D _BackgroundTexture;
half4 frag(v2f i) : SV_Target
{
half4 bgcolor = tex2Dproj(_BackgroundTexture, i.grabPos);
return 1 - bgcolor;
}
ENDCG
}
}
}
