ShaderLab: GrabPass

2018-08-21  本文已影响0人  Bonging

原文链接:https://docs.unity3d.com/Manual/SL-GrabPass.html

        GrabPass是一个特殊的pass类型,它可以抓取屏幕上显示的内容然后将这个对象绘制到一个纹理中。此纹理可用于后面的pass中以实现更进一步的图像效果。

语法

        GrabPass在subshader内部,他有两种存在形式:

        ·只通过GrabPass{}抓取屏幕内容到一张纹理上。这个纹理可以在后面的pass中通过“_GrabTexture”这个名字访问到。请注意,这种形式的GrabPass会为每个使用它的对象进行一次耗时的屏幕抓取工作。

        ·GrabPass{"TextureName"}抓取当前的屏幕内容到一张纹理中,但是每帧只会为使用给定纹理名字的的第一个对象执行一次。这个纹理可以在后面的pass中通过给定的名字访问到。当你在场景中有多个对象使用GrabPass时,这是一个更有效率的方法。

        另外,GrabPass可以使用Name和Tags命令。


例子

        这是一个低效的方式来反转先要渲染的颜色:

Shader "GrabPassInvert"

{

    SubShader

    {

        // Draw ourselves after all opaque geometry

        Tags { "Queue" = "Transparent" }

        // Grab the screen behind the object into _BackgroundTexture

        GrabPass

        {

            "_BackgroundTexture"

        }

        // Render the object with the texture generated above, and invert the colors

        Pass

        {

            CGPROGRAM

            #pragma vertex vert

            #pragma fragment frag

            #include "UnityCG.cginc"

            struct v2f

            {

                float4 grabPos : TEXCOORD0;

                float4 pos : SV_POSITION;

            };

            v2f vert(appdata_base v) {

                v2f o;

                // use UnityObjectToClipPos from UnityCG.cginc to calculate

                // the clip-space of the vertex

                o.pos = UnityObjectToClipPos(v.vertex);

                // use ComputeGrabScreenPos function from UnityCG.cginc

                // to get the correct texture coordinate

                o.grabPos = ComputeGrabScreenPos(o.pos);

                return o;

            }

            sampler2D _BackgroundTexture;

            half4 frag(v2f i) : SV_Target

            {

                half4 bgcolor = tex2Dproj(_BackgroundTexture, i.grabPos);

                return 1 - bgcolor;

            }

            ENDCG

        }

    }

}

        这个shader有两个pass,第一个pass抓取渲染时在对象后面要显示的内容,第二个执行颜色反转。请注意同样的效果可以通过使用一个反转融合模式更有效率的实现。

上一篇下一篇

猜你喜欢

热点阅读