Unity中Shader的屏幕抓取 GrabPass

2023-09-08 18:36:24


前言

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
        }
    }
}

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

更多推荐

【云原生】kubernetes中pod(最小的资源管理组件)

目录前言一、pod1.1pause容器使得Pod中的所有容器可以共享两种资源:1.2通常把Pod分为两类1.2.1自主式Pod1.2.2控制器管理的Pod1.3Pod容器的分类1.3.1基础容器(infrastructurecontainer)1.3.2初始化容器(initcontainers)1.3.3应用容器(Ma

【C/C++】指针常量、常量指针、指向常量的常指针

目录1.概念2.constpointer3.pointertoaconstant3.1(pointertoaconstant)-constant3.2poiner-constant3.3(pointertoaconstant)-variable3.4poiner-variable3.5多层级关系时的兼容3.6用处4.a

3.docker仓库(Nexus、Harbor)的安装

本文目录前言1.Aliyun镜像仓库2.Nexus1.Nexus私服搭建2.登录控制台3.配置nexus仓库4.配置nexus仓库地址为安全的镜像地址5.镜像推送至nexus仓库6.拉取nexus仓库镜像3.Harbor1.DockerCompose安装2.Harbor安装3.配置Harbor仓库地址为安全的镜像地址4

MySQL数据库管理

目录一、数据库1.1数据1.2表1.3数据库1.4数据库分类1.41关系型数据库1.42非关系型数据库1.5MySQL介绍二、SQL语句查看数据库创建数据库切换数据库创建数据表查看库中的表删除表删除库在表中插入数据查询数据表中的数据更改表中数据删除表中字段克隆表创建临时表创建主表创建从表为主表profession添加一

用 Python实现Python解释器

介绍Byterun是一个用Python实现的Python解释器。随着我对Byterun的开发,我惊喜地的发现,这个Python解释器的基础结构用500行代码就能实现。在这一章我们会搞清楚这个解释器的结构,给你足够探索下去的背景知识。我们的目标不是向你展示解释器的每个细节---像编程和计算机科学其他有趣的领域一样,你可能

LeetCode 42. 接雨水

题目链接力扣(LeetCode)官网-全球极客挚爱的技术成长平台题目解析先算出每个位置的面积,然后把每个位置的面积相加就得到了最终可以接多少雨水!每个位置的面积等于(该位置左边包括自己最大的高度)与(该位置右边包括自己最大的高度)中最小的那个数,然后减去当前位置的高度,就是当前位置可以存放的雨水。首先定义两个数组lef

面试算法11:0和1个数相同的子数组

题目输入一个只包含0和1的数组,请问如何求0和1的个数相同的最长连续子数组的长度?例如,在数组[0,1,0]中有两个子数组包含相同个数的0和1,分别是[0,1]和[1,0],它们的长度都是2,因此输出2。分析首先把输入数组中所有的0都替换成-1,那么题目就变成求包含相同数目的-1和1的最长子数组的长度。在一个只包含数字

【ES6知识】ESModule 模块化

文章目录一、前言:模块化背景1.1后端模块化1.2关于前端模块化二、模块的导出三、模块的导入四、应用模块到HTML中五、exportdefault默认导出命令六、重命名导出与导入七、创建模块对象八、动态加载模块一、前言:模块化背景JavaScript程序本来很小——在早期,它们大多被用来执行独立的脚本任务,在你的web

MySQL性能分析常见方式

1、慢查询SQL日志查看慢SQL是否开启showvariableslike'%slow_query_log';执行下面的命令开启慢查询日志setglobalslow_query_log='ON';修改慢查询阈值#N为设置的时间setglobal/sessionlong_query_time=N;查看设置的慢查询时间sh

零基础学前端(七)将项目发布成网站

我们学习了HTML和CSS,已经可以做出精美的静态网页。我们不慌学习JavaScript,因为Javascript的作用是为网页增加动作和数据交换,只能让网页更完美而已,现在网页的基础我们已经可以搭建,我们不妨先将网站发布出去,让更多人看到你所作的内容。我想这是非常有意义的,让人激动人心的。一、导言发布网站才是编程中最

【Linux】【网络】传输层协议:UDP

文章目录UDP协议1.面向数据报2.UDP协议端格式3.UDP的封装和解包4.UDP的缓冲区UDP协议UDP传输的过程类似于寄信。无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接。不可靠:没有确认机制,没有重传机制;如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。面向数据报:不

热文推荐