Unity中Shader的屏幕抓取 GrabPass

文章目录


前言

Unity中Shader的屏幕抓取 GrabPass


一、抓取

1、抓取指令

屏幕的抓取需要使用一个Pass

GrabPass{}
GrabPass{"NAME"}

2、在使用抓取的屏幕前,需要像使用属性一样定义一下,_GrabTexture这个名字是Unity定义好的

sampler2D _GrabTexture;

测试代码:

复制代码
Shader "MyShader/P0_10_3"
{
    SubShader
    {
        Tags{"Queue" = "Transparent"}
        //屏幕抓取需要单独使用一个Pass ------ GrabPass{} 里面什么都不写
        GrabPass{}
        
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            
            struct v2f
            {
                float2 uv : TEXCOORD0;
            };

            //在使用抓取的屏幕前,需要像使用属性一样定义一下,_GrabTexture这个名字是Unity定义好的
            sampler2D _GrabTexture;
            //在顶点着色器的输入处,不用appdata,直接使用用到的参数,防止 SV_POSITION 重复定义
            v2f vert (
                float4 vertex : POSITION,
                out float4 pos : SV_POSITION
            )
            {
                v2f o;
                pos = UnityObjectToClipPos(vertex);
                return o;
            }

            fixed4 frag (v2f i,UNITY_VPOS_TYPE screenPos : VPOS) : SV_Target
            {
                
                fixed2 screenUV = screenPos.xy / _ScreenParams.xy;
                //对抓取的屏幕进行采样
                fixed4 grabTex = tex2D(_GrabTexture,screenUV);
                return grabTex;
            }
            ENDCG
        }
    }
}

效果:

为了优化节省性能:一次抓取就存储下来渲染完,再进行下次抓取

使用:GrabPass{"NAME"}

使用这个抓取后,对应的定义名也要换成 NAME

修改后代码:

复制代码
Shader "MyShader/P0_10_3"
{
    SubShader
    {
        Tags{"Queue" = "Transparent"}
        //屏幕抓取需要单独使用一个Pass ------ GrabPass{} 里面什么都不写,或者GrabPass{"_GrabTex"}
        GrabPass{"_GrabTex"}
        
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            
            struct v2f
            {
                float2 uv : TEXCOORD0;
            };

            //在使用抓取的屏幕前,需要像使用属性一样定义一下,_GrabTexture这个名字是Unity定义好的
            sampler2D _GrabTex;
            //在顶点着色器的输入处,不用appdata,直接使用用到的参数,防止 SV_POSITION 重复定义
            v2f vert (
                float4 vertex : POSITION,
                out float4 pos : SV_POSITION
            )
            {
                v2f o;
                pos = UnityObjectToClipPos(vertex);
                return o;
            }

            fixed4 frag (v2f i,UNITY_VPOS_TYPE screenPos : VPOS) : SV_Target
            {
                
                fixed2 screenUV = screenPos.xy / _ScreenParams.xy;
                //对抓取的屏幕进行采样
                fixed4 grabTex = tex2D(_GrabTex,screenUV);
                return grabTex;
            }
            ENDCG
        }
    }
}

注意:该操作对手机性能比较消耗,一般在中配或高配时才开启

相关推荐
zhiSiBuYu051714 分钟前
Godot 游戏引擎新手从零开发指南
游戏引擎·godot
winlife_13 小时前
在 Unity 里用 AI 做游戏:funplay-unity-mcp 从安装到第一次让 AI 改场景
人工智能·游戏·unity·ai编程·claude·mcp
qq_2052790513 小时前
Unity 运行时候会时不时卡顿一下,哪怕是空场景
unity·游戏引擎
美团骑手阿豪17 小时前
Unity UGUI自适应分辨率
unity·游戏引擎
LONGZETECH18 小时前
软硬协同+故障注入:无人机仿真维修与操控仿真底层算法逻辑拆解
大数据·c语言·算法·3d·unity·无人机
winlife_18 小时前
让 AI 跑通“调跳跃手感“的完整闭环:funplay-unity-mcp 实战案例
人工智能·unity·游戏引擎·ai编程·mcp·游戏手感
winlife_19 小时前
从一句话到可玩原型:用 funplay-unity-mcp 让 AI 搭起完整游戏循环
人工智能·游戏·unity·ai编程·mcp·游戏原型
ellis197021 小时前
Unity中使用Cursor辅助开发
unity
avi91111 天前
Unity商业插件之(三) Editor扩展,二次开发
unity·单例·editor扩展·editor开发
winlife_1 天前
让 AI 自动跑 PlayMode 回归测试:从 BUG 注入到自动判 FAIL 的完整闭环
人工智能·unity·bug·ai编程·mcp·回归测试·游戏测试