0评论

Shader实例(五)GrabPass捕捉屏幕纹理

文章来自CSDN博客 2018-04-14 17浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯GAD游戏开发行业精英群711501594

最近在看热扭曲效果,里面用到了GrabPass。

之前看过官方翻译版本的说明http://blog.sina.com.cn/s/blog_89d90b7c01019run.html

但是还是无法理解GrabPass{}是捕捉物体后面的屏幕纹理,还是整个屏幕的纹理,至于为什么,可以看下面的例子,如果你知道原因求分享。

1、固定管线版本:
Shader "Custom/Grab" {
 Properties {
  //_MainTex ("Base (RGB)", 2D) = "white" {}
 }
 SubShader {
  // 在所有不透明对象之后绘制自己,更加靠近屏幕
  Tags { "Queue" = "Transparent" }
  // 通道1:捕捉对象之后的屏幕内容放到_GrabTexture纹理中
  GrabPass{}
  // 通道2:设置材质
  Pass{
   // 使用上面产生的纹理,进行颜色反相(1-原材质色)
   SetTexture[_GrabTexture]{combine one-texture}
  }
 }
 FallBack "Diffuse"
}
效果如下,它是取模型背后的屏幕纹理:

2、顶点,片段版本:
Shader "Custom/GrabAllVF" {
 Properties {
  //_MainTex ("Base (RGB)", 2D) = "white" {}
 }
 SubShader {
  // 在所有不透明对象之后绘制自己,更加靠近屏幕
  Tags{"Queue"="Transparent"}
  // 通道1:捕捉屏幕内容放到_GrabTexture纹理中
  GrabPass{} 
  // 通道2:设置材质
  Pass{
   Name "pass2"
   CGPROGRAM
   #pragma vertex vert
            #pragma fragment frag
   #include "UnityCG.cginc"
   sampler2D _GrabTexture;
   float4 _GrabTexture_ST;
   // 片段程序的输入
   struct v2f {
                float4  pos : POSITION;
                float2  uv : TEXCOORD0;
            };
   v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
    o.uv = TRANSFORM_TEX(v.texcoord, _GrabTexture);
                return o;
            }
   float4 frag (v2f i) : COLOR
            {
    half4 texCol = tex2D(_GrabTexture, float2(1-i.uv.x , 1-i.uv.y));
    // 颜色反相,便于观察效果
                return 1 - texCol;
            }
   ENDCG
  }
 }
 FallBack "Diffuse"
}

效果如下:取到的是全屏的纹理:
1和2为什么取到的屏幕纹理不一样呢?

3、使用vf的方式,只获取物体后面的屏幕纹