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


    转载自风宇冲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
            }
        }
    }
    

      

  • 相关阅读:
    uni_app 跳转到外部html5 的页面 (web-view) 的一些使用
    vue初学备份(动态切换class类)
    MySQL数据库基本操作
    蛋疼的JavaScript(二)this
    Java中的String,StringBuffer和StringBuilder
    LintCode_1 单例模式
    [转载]C语言EOF是什么?
    Python中的枚举
    对BOM的总结
    python类相关总结(持续更新)
  • 原文地址:https://www.cnblogs.com/zdlbbg/p/4329529.html
Copyright © 2020-2023  润新知