美文网首页
ShaderLab: GrabPass

ShaderLab: GrabPass

作者: Bonging | 来源:发表于2018-08-21 23:14 被阅读0次

    原文链接: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抓取渲染时在对象后面要显示的内容,第二个执行颜色反转。请注意同样的效果可以通过使用一个反转融合模式更有效率的实现。

    相关文章

      网友评论

          本文标题:ShaderLab: GrabPass

          本文链接:https://www.haomeiwen.com/subject/uhisiftx.html