这个早就想要学了,因为这个可以和图像处理结合在一起

我们知道,当所有的渲染管线流程走完一遍后,就会生成一张图,而对这个图片进行处理,就是后处理

# GrabPass

GrabPass 比较特殊,它运行时会抓取屏幕位置渲染的图像,传递给接下来的 Pass 进行处理.GrabPass 是用于渲染图像的,图像的范围是物体所在屏幕的位置。

如果屏幕中有大量的物体使用 GrabPass, 那对性能的影响非常大的.

我的世界都褪了色效果.

# 效果

# 代码

Shader “Custom/GrabPass”
{
Properties
{
_GrayScale(“Grab Scale”,Range(0,1)) = 0
}
SubShader
{
Tags

    //调用GrabPass,并定义抓取图像的名称
    GrabPass{"\_ScreenTex"}
    Pass{
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        struct v2f {
                float4 pos : SV\_POSITION;
                float4 grabPos : TEXCOORD0;
        };

        v2f vert(float4 vertex:POSITION) {
            v2f o;
            o.pos = UnityObjectToClipPos(vertex);

            //计算抓取图像在屏幕上的位置
            o.grabPos = ComputeGrabScreenPos(o.pos);
            return o;
        }

        fixed \_GrayScale;
        //声明抓取图像
        sampler2D \_ScreenTex;

        half4 frag(v2f i) : SV\_TARGET{
            //采样抓取图像
            half4 src = tex2Dproj(\_ScreenTex,i.grabPos);

            half grayscale = Luminance(src.rgb);
            half4 dst = half4(grayscale, grayscale, grayscale, 1);

            return lerp(src, dst, \_GrayScale);
        }
        ENDCG
    }

}
FallBack "Diffuse"

}