码迷,mamicode.com
首页 > 编程语言 > 详细

Unity3D教程宝典之Shader篇:第二十三讲GrabPass

时间:2015-03-11 14:28:48      阅读:309      评论:0      收藏:0      [点我收藏+]

标签:

转载自风宇冲Unity3D教程学院


GrabPass是一种特殊的pass类型。当物体将要被绘制时,它抓取屏幕内容并绘制到一张texture里。
总体来说GrabPass开销较大,不如 AlphaBlend等指令。故能用AlphaBlend等指令实现的效果尽量用指令,不得不用GrabPass时才用GrabPass。

(1)GrabPass{} 抓取当前屏幕内容,每次使用的开销都非常昂贵。 texture用_GrabTexture获取(2)GrabPass{"TextureName"}将抓取屏幕内容并保存至一张texture里。每帧只为第一次使用这张纹理的物体做一次,这种更高效

例1:ShaderLab用法
场景背景如下
技术分享

在前端放一个cube,shader如下

Shader "Custom/MyGrabPass" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
     SubShader {
        // Draw ourselves after all opaque geometry
        Tags { "Queue" = "Transparent" }
        // Grab the screen behind the object into _GrabTexture
        GrabPass { }
        // Render the object with the texture generated above, and invert it‘s colors
        Pass {
            SetTexture [_GrabTexture] { combine one-texture }
        }
    }
}

  

效果如下

技术分享

例2:
有背景如下
技术分享

在前端新建一个旋转为(90,180,0)的plane,代码如下

Shader "Custom/MyGrabPass" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags{"Queue"="Transparent"}
     
        GrabPass
        {
        }
       
        pass
        {
            Name "pass2"
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
           
            #include "UnityCG.cginc"
            sampler2D _GrabTexture;
            float4 _GrabTexture_ST;
            struct v2f {
                float4  pos : SV_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
            {
                float4 texCol = tex2D(_GrabTexture,i.uv);
                return texCol;
            }
            ENDCG
        }
    }
}

  

效果如下,就是抓取了屏幕背景并贴到前端的plane上

技术分享
但是uv上下反了,于是
把代码36行的float4 texCol = tex2D(_GrabTexture,i.uv);
改为 float4 texCol = tex2D(_GrabTexture,float2(i.uv.x,1-i.uv.y));
效果如下
技术分享

Grabpass并指定texture名称,效果也一样

Shader "Custom/MyGrabPass" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags{"Queue"="Transparent"}
     
        GrabPass
        {
            "_MyGrabTexture"
        }
       
        pass
        {
            Name "pass2"
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
           
            #include "UnityCG.cginc"
            sampler2D _MyGrabTexture;
            float4 _MyGrabTexture_ST;
            struct v2f {
                float4  pos : SV_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,_MyGrabTexture);
                return o;
            }
            float4 frag (v2f i) : COLOR
            {
                float4 texCol = tex2D(_MyGrabTexture,float2(i.uv.x,1-i.uv.y));
                return texCol;
            }
            ENDCG
        }
    }
}

  

Unity3D教程宝典之Shader篇:第二十三讲GrabPass

标签:

原文地址:http://www.cnblogs.com/zdlbbg/p/4329529.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!