Shader "Custom/GrabShader" //把截屏 显示到Show物体上
{
//绑定到编辑器属性面板上的变量;
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader//子着色器
{
//shader标签=队列渲染、 "Queue"="OverLay最後绘制,截屏不会截到这个物体
Tags { "RenderType"="Opaque" "Queue"="OverLay" }
//设置subShader子着色器LOD值,Shader脚本每次只会根据情况来选择一个可执行的SubShader子着色器
// (也就是一直找到第一个<= Shader脚本.maximumLOD的 那个SubShader子着色器执行,如果都没有 就“降级处理”
LOD 100
//添加截屏通道
GrabPass{ //截屏通道(把当前屏幕绘制好的东西 截图截出来),不指定名字就会保存到 "_GrabTexture"字段里面,就通过"_GrabTexture"字段来访问
}
//end
Pass
{
CGPROGRAM//CG代码开始
#pragma vertex vert //命名vert为顶点Shader入口
#pragma fragment frag //命名frag为(片元)像素Shader入口
// make fog work让雾工作
//#pragma multi_compile_fog
#include "UnityCG.cginc"//引用unity CG库文件: Unity\Editor\Data\CGIncludes\UnityCG.cginc
struct appdata//已经bind语义的结构体
{
float4 vertex : POSITION;//bind纹理位置 xyzw
float2 uv : TEXCOORD0; //bind第一张纹理图的uv
};
struct v2f//已经bind语义的结构体
{
float2 uv : TEXCOORD0;//bind第一张纹理图的uv
//UNITY_FOG_COORDS(1) 雾统一坐标(1)
float4 vertex : SV_POSITION;//内置向量xyzw bind 位置Pos
};
sampler2D _MainTex; //为了使用属性块内的属性 命名1个同名的_MainTex(2d纹理图)
float4 _MainTex_ST; //因为使用了TRANSFORM_TEX 所以要这个额外float4 _XXX_ST变量名 来让转换坐标操作符合规范
sampler2D _GrabTexture;//保存截屏通道 的纹理采样
float4 _GrabTexture_ST; //因为使用了TRANSFORM_TEX 所以要这个额外float4 _XXX_ST变量名 来让转换坐标操作符合规范
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);//把纹理图位置xyzw转世界坐标 mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _GrabTexture);//根据流水线uv坐标 计算出对应的_MainTex纹理图 的真正UV坐标(1.流水线uv坐标,2.纹理图)
//UNITY_TRANSFER_FOG(o,o.vertex);注释掉 雾的操作
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_GrabTexture, i.uv);//获得纹理颜色
//UNITY_APPLY_FOG(i.fogCoord, col); 注释掉 雾应用
return col;
}
ENDCG//CG代码开始
}
}
}