版本:Unity 6 (6000.0)
语言:英语
在内置渲染管线中使用内置着色器函数
内置渲染管线中的 HLSL 着色器示例

使用 GrabPass 命令获取当前帧缓冲区

GrabPass 是一个命令,它创建一种特殊的 Pass 类型,将帧缓冲区的内容抓取到纹理中。该纹理可以在后续的 Pass 中使用,以实现高级的基于图像的效果。

此命令会显著增加 CPU 和 GPU 帧时间。您通常应该避免使用此命令,除非用于快速原型设计,并尝试通过其他方式实现您的效果。如果您确实使用此命令,请尽可能减少屏幕抓取操作的次数;可以通过减少此命令的使用次数,或者在适用时使用将屏幕抓取到命名纹理的签名来实现。

GrabPass 仅适用于帧缓冲区。您不能使用此命令来抓取其他渲染目标的内容,深度缓冲区一个内存存储,用于保存图像中每个像素的 z 值深度,其中 z 值是每个渲染像素相对于投影平面的深度。 更多信息
参见 术语表
,等等。

示例

此内置 渲染管线一系列操作,用于获取场景的内容,并将其显示在屏幕上。Unity 允许您从预构建的渲染管线中选择,或编写自己的渲染管线。 更多信息
参见 术语表
示例演示了如何使用 GrabPass 反转渲染目标的颜色。请注意,这不是实现此效果的有效方法,仅用于演示 GrabPass 的使用;可以使用反转混合模式更有效地实现相同的效果。

Shader "GrabPassInvert"
{
    SubShader
    {
        // Draw 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
        }

    }
}

其他资源

在内置渲染管线中使用内置着色器函数
内置渲染管线中的 HLSL 着色器示例