这个早就想要学了,因为这个可以和图像处理结合在一起
我们知道,当所有的渲染管线流程走完一遍后,就会生成一张图,而对这个图片进行处理,就是后处理
# 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"
}