GrabPass是一个特殊的Pass,它从frame buffer抓取物体所在位置屏幕中将要绘制的内容,将其填充至一个临时的texture,以供同一个Shader中其后的Pass使用。我们现在就要用它来实现高斯模糊的毛玻璃效果。
效果:
Shader
首先我们需要声明Shader所需属性:
Properties
{
_BumpAmt("Distortion", range(0, 2)) = 1
_TintAmt("Tint Amount", Range(0,1)) = 0.1
_TintColor("Tint Color", Color) = (1, 1, 1, 1)
_MainTex("Tint Texture (RGB)", 2D) = "white" {}
_BumpMap("Normalmap", 2D) = "bump" {}
_BlurAmt("Blur", Range(0, 10)) = 1
}
- _BumpMap 和 _BumpAmt控制扭曲
- _TintColor 和 _TintAmt控制叠加颜色
- _BlurAmt 控制模糊程度
在SubShader中,增加GrabPass,GrabPass中可以是空的,也可以加入一个字符串作为Texture名,或者添加其他必要的Tag。如果GrabPass为空,那Texture名默认为_GrabPassTexture。
GrabPass {}
vertex shader 须向fragment shader传递_GrabTexture的uv:
struct v2f
{
float4 vertex : SV_POSITION;
float2 texcoord : TEXCOORD0;
float4 uvgrab : TEXCOORD1;
};
模糊函数:
float blurWeight[49];
half4 blur(half4 col, sampler2D tex, float4 uvrgab) {
float2 offset = 1.0 / _ScreenParams.xy;
for (int i = -3; i <= 3; ++i) {
for (int j = -3; j <= 3; ++j) {
col += tex2Dproj(tex, uvrgab + float4(offset.x * i * _BlurAmt, offset.y *