Unity中Shader使用最简屏幕坐标并且实现屏幕扭曲

news2024/12/24 11:05:59

文章目录

  • 前言
  • 一、在之前写的shader中,用于对屏幕坐标取样的pos是在顶点着色器中完成计算的,然而还有一种更为简洁的方法,就是用顶点着色器中传给片元着色器的pos来给屏幕抓取进行采样
    • 原理:在顶点着色器中,o.pos是裁剪坐标,若不对其做出处理直接传到片元着色器中,则在片元着色器中,传入的i.pos就是屏幕坐标。


前言

Unity中Shader使用最简屏幕坐标并且实现屏幕扭曲


一、在之前写的shader中,用于对屏幕坐标取样的pos是在顶点着色器中完成计算的,然而还有一种更为简洁的方法,就是用顶点着色器中传给片元着色器的pos来给屏幕抓取进行采样

原理:在顶点着色器中,o.pos是裁剪坐标,若不对其做出处理直接传到片元着色器中,则在片元着色器中,传入的i.pos就是屏幕坐标。

在这里插入图片描述

//使用传入片元着色器的 pos 来计算得到,用于给抓取的屏幕采样的变量
fixed2 screenUV = i.pos.xy / _ScreenParams.xy;


代码:

Shader "MyShader/P0_10_6"
{
    Properties
    {
        //实现扭曲,就需要传入贴图来实现扰度
        _DistortTex("DistortTex",2D) = "white"{}
        
        _Distort("SpeedX(X) SpeedY(y) Distort(Z)",vector) = (0,0,0,0)
    }
    SubShader
    {
        Tags{"Queue" = "Transparent"}
        //屏幕抓取需要单独使用一个Pass —— GrabPass{} 里面什么都不写,或者GrabPass{"_GrabTex"}
        GrabPass{"_GrabTex"}
        //使用Cull off 让两面都有扭曲
        Cull Off
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                //从应用程序阶段的输入,多加一个uv,用于对扭曲纹理的采样
                float2 uv : TEXCOORD;
                
            };
            
            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
                float4 screenUV:TEXCOORD1;
            };

            //在使用抓取的屏幕前,需要像使用属性一样定义一下,_GrabTexture这个名字是Unity定义好的
            sampler2D _GrabTex;
            sampler2D _DistortTex;float4 _DistortTex_ST;
            float4 _Distort;

            
            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv,_DistortTex) + _Distort.xy * _Time.y;
                
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                //使用传入片元着色器的 pos 来计算得到,用于给抓取的屏幕采样的变量
                fixed2 screenUV = i.pos.xy / _ScreenParams.xy;
                 
                fixed4 distortTex = tex2D(_DistortTex,i.uv);

                //使用线性插值来控制UV的扭曲程度
                float2 uv = lerp(screenUV,distortTex,_Distort.z);
                //对抓取的屏幕进行采样
                fixed4 grabTex = tex2D(_GrabTex,uv);
                return grabTex;
                
            }
            ENDCG
        }
    }
}


效果和上一篇中的效果没有变化,只是过程变了:
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flv怎么转换成mp3?挑选三个方法给大家

flv怎么转换成mp3?FLV(Flash Video)是一种被广泛应用于互联网的流行视频格式,然而该格式并非适用于所有设备和媒体播放器。相反,MP3作为数字音频格式,能够将高质量的音频文件压缩成相对较小的大小&#xff…

IDEA使用database

一、导出数据库表结构 右键数据库、表,选择SQL Generator 可以查看多表的创建语句、删除语句、清空语句 1.创建脚本 初始创建脚本 rdbms提供的脚本 definition provided by rdbms server 2.脚本是否关联数据库名称 Qualify objects with schema names: aut…

记录造数据测试接口

一、前言 在java开发中经常需要造数据进行测试接口,这里记录一下常用的通过造数据测试接口的方法。 二、一般的接口传参方式 1、接口的方式最好是使用JSON或者map的方式,这样的好处是传参可以灵活伸缩,返回的结果也最好是JSON或者map的方式…

【Spring面试】六、@Autowired、@Configuration、第三方Bean的配置

文章目录 Q1、如何让自动注入没有找到依赖Bean时不报错?Q2、如何让自动注入找到多个依赖的Bean时不报错?Q3、Autowired注解有什么作用?Q4、Autowired和Resource之间的区别Q5、Autowired注解自动装配的过程是怎样的?Q6、Configurat…

sql server事务隔离别 、 mysql 事务隔离级别、并发性问题

隔离级别和锁 SQL中 mysql 、Oracle 、sql server 等数据库 都是客户端和服务器架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称为一个 【会话(session&#xff0…

leaflet 加载地图-引入各种地图

leaflet 加载地图-引入各种地图 一、智图地图 1、Geoq.Normal.Gray (或 Geoq.Normal.Map)灰色 let gaoDeLayer L.tileLayer.chinaProvider(Geoq.Normal.Gray);gaoDeLayer.addTo(this.map);2、Geoq.Normal.Warm 黄色 let gaoDeLayer L.tileLayer.chin…

计算机竞赛 基于计算机视觉的身份证识别系统

0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen…

2023年数维杯数学建模A题河流-地下水系统水体污染研究求解全过程文档及程序

2023年数维杯数学建模 A题 河流-地下水系统水体污染研究 原题再现: 河流对地下水有着直接地影响,当河流补给地下水时,河流一旦被污染,容易导致地下水以及紧依河流分布的傍河水源地将受到不同程度的污染,这将严重影响…

安全可靠的文件传输服务助力完成更高效的医疗保健工作(上)

医疗保健工作是关乎人类健康和社会进步的重要领域,需要处理和传输大量医疗数据,如患者资料、医疗图像、化验单、电子病历、诊断建议等。这些数据不仅涉及患者的个人隐私和医疗安全,还关系到医院的运行效率和医疗水平。 因此,如何…

推荐5款同类型中独树一帜的软件

今天要给大家推荐的是5款软件,每个都是同类软件中的个中翘楚,请大家给我高调地使用起来,不用替我藏着掖着。 1.动画演示制作——Focusky ​ Focusky 是一款专业的动画演示制作软件,可以让你用简单直观的方式制作各种折线图、柱状…

智慧工地:让工地可视化、数字化、智能化

智慧工地平台功能包括:劳务管理、施工安全管理、视频监控管理、机械安全管理、危大工程监管、现场物料监管、绿色文明施工、安全隐患排查、施工综合管理、施工质量管理、设备管理、系统管理等模块。 一、项目开发环境 技术架构:微服务 开发语言&#…

win11怎么删除PIN码

现在有很多用户都将电脑更新升级成win11系统,一些小伙伴对新系统的某些操作不是很熟悉,近期就有一部分小伙伴想要知道win11系统如何删除PIN码,这里小编就给大家详细介绍一下win11删除PIN码的教程,有需要的小伙伴快来看一看吧。 w…

解决: 使用html2canvas和print-js打印组件时, 出现空白页

如图所示: 当我利用html2canvas转换成图片后, 然后使用print-js打印多张图片, 会出现空白页 使用html2canvas和print-js打印组件的文章可参考这个: Vue-使用html2canvas和print-js打印组件 解决: 因为是使用html2canvas转换成图片后才打印的, 而图片是行内块级元素, 会有间隙…

基于若依框架实现markdown在线编辑

基于若依框架实现markdown在线编辑 1. 下载mavon-editor npm install mavon-editor --save2. 打开main.js文件, 添加如下 // markdown组件 import { mavonEditor } from "mavon-editor"; import "mavon-editor/dist/css/index.css";// markdown组件 Vue…

【目标检测】YOLOv8:快速上手指南

YOLOv8概述 YOLOv8是YOLOv5团队在今年新推出的一代YOLO版本,与前几代版本相比,其性能和速度差距如下图所示: 和其它版本不同的是,该仓库并非起名为YOLOv8,而是公司名ultralytics,因为他们想将此版本作为一…

职场新人对测试用例的困惑

职场新人对测试用例的困惑无非有以下几点: 什么是测试用例,为什么要写测试用例? 不知道怎么写,写了也不知道写的是否完整。 一、什么是测试用例? 百科的释义: 测试用例是对一项特定的软件产品进行测试任…

探索多态的本质【C++】

文章目录 多态的构成条件虚函数虚函数的重写(覆盖) 虚函数重写的两个例外C11 override和final区分重载、覆盖(重写)、隐藏(重定义)抽象类接口继承和实现继承多态的原理虚函数表 动态绑定和静态绑定动态绑定静态绑定 单继承中的虚函数表多继承中的虚函数表…

基于51单片机实现W25Q64-FLASH读写

一、前言 STC89C52是一款8位单片机,具有强大的功能和灵活性,广泛应用于各种嵌入式系统中。W25Q64是一款容量为64Mb的串行闪存芯片,采用SPI接口进行通信。本项目利用STC89C52单片机实现对W25Q64闪存芯片的读写操作,实现数据的读取和存储。 在本项目中,通过模拟SPI(Seria…

本末科技再获融资,直驱机器人来到价值兑现前夕?

在去年10月完成近亿元A轮融资后,今年9月,本末科技又宣布完成数千万元A轮融资,由立湾资本领投,建元投资跟投,北拓资本担任公司长期独家财务顾问。 本末科技长期专注于机器人机械模组与动力供应领域。虽然我国自2013年起…

项目交付谈判的6大技巧

针对项目交付问题,在面对甲方时,项目经理如果采用“和事佬”的态度,在不违背合理性或不产生无法承担后果前提下,尽量满足甲方的要求,以便顺利交付。这样往往容易导致项目范围蔓延,如果控制不当,…