UNITY UI简易反向遮罩
附带示例资源文件:https://download.csdn.net/download/qq_55895529/89726994?spm=1001.2014.3001.5503
大致效果:

实现思路:通过ui shader的模板测试功能实现
通过让想要被突出显示的物体优先渲染并写入模板值,而后再让黑色遮罩渲染并判断模板值进行渲染剔除而实现。
所以ui结构如下,DefaultGreen是后面的绿色背景,SphereTargetArea是圆形挖孔,RectangleTargetArea是矩形挖孔,BlackBG是黑色遮罩。

在ui层次上,渲染循序由上到下,所以渲染循序由先到后为:绿色背景-》圆形挖孔-》矩形挖孔-》黑色遮罩。
已知信息:在默认的ui材质中,会写入目标值为0的模板值。且设置为总是通过模板测试,通过后保留原本的模板值。这些信息可以在UI/Default的shader反编译文件中找到,同时选项值的含义可以在unity官方文档Unity - Manual: ShaderLab command: Stencil
中关于Comparison operation values和Stencil operation values的描述中获得解释。



现在就明确了我们的目标,我们接下来所使用的模板值只要都大于0就不会与默认ui产生干扰。
现在我们需要一个无条件写入模板值的shader去写入挖孔处的模板值。
Shader "Custom/GuideMask_Center"
{Properties{_MainTex ("Sprite Texture", 2D) = "white" { }_Color ("Tint", Color) = (1.000000,1.000000,1.000000,1.000000)_StencilRef ("_StencilRef", Float) = 0.000000_StencilComp ("_StencilComp", Float) = 8.000000_StencilPassOp ("_StencilPassOp", Float) = 0.000000_StencilFailOp ("_StencilFailOp", Float) = 0.000000}SubShader{Tags { "QUEUE"="Transparent" "IGNOREPROJECTOR"="true" "RenderType"="Transparent" "CanUseSpriteAtlas"="true" "PreviewType"="Plane" }Blend Zero OneZTest [unity_GUIZTestMode]ZWrite OffCull OffStencil {Ref [_StencilRef]ReadMask 255WriteMask 255Comp [_StencilComp]Pass [_StencilPassOp]Fail [_StencilFailOp]}Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;fixed4 color : COLOR; };struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;fixed4 color : COLOR;};sampler2D _MainTex;float4 _MainTex_ST;float4 _Color;float _Radius;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv * _MainTex_ST.xy + _MainTex_ST.zw;o.color = v.color;return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);col *= _Color;col.a *= i.color.a;if(col.a <= 0){discard; // 丢弃透明部分的像素,也就不会在透明部分写入模板值}clip(col.a); // 不需要有输出,仅仅做模板处理return col;}ENDCG}}
}
注意一些UI上shader的细节,首先在Tags中设置为透明队列,且"IGNOREPROJECTOR"="true"忽略透视,此外在深度测试试用GUI的测试模式ZTest [unity_GUIZTestMode],并关闭深度写入。
现在填写模板的设置,模板值设定为2(别问为什么不用1,这是因为一会儿遮罩会使用1),
比较操作设置为8,也就是总是会通过测试。通过操作设置为2,也就是会用新的值替换旧的值,那么原本在默认ui下都是0的模板值,就被改写成了2。



这个设置对于矩形挖孔也是一样的,只是换了一张图片。
现在值为2的模板值已经写好了,对于遮罩,仅需要使用模板去对比从而判断是否通过测试即可。
所以shader处理相对更简单
Shader "Custom/GuideMask_Broader"
{Properties{_MainTex ("Sprite Texture", 2D) = "white" { }_Color ("Tint", Color) = (1.000000,1.000000,1.000000,1.000000)_StencilRef ("_StencilRef", Float) = 0.000000_StencilComp ("_StencilComp", Float) = 8.000000_StencilPassOp ("_StencilPassOp", Float) = 0.000000_StencilFailOp ("_StencilFailOp", Float) = 0.000000}SubShader{Tags { "QUEUE"="Transparent" "IGNOREPROJECTOR"="true" "RenderType"="Transparent" "CanUseSpriteAtlas"="true" "PreviewType"="Plane" }Blend SrcAlpha OneMinusSrcAlphaZTest [unity_GUIZTestMode]ZWrite OffCull OffStencil {Ref [_StencilRef]ReadMask 255WriteMask 255Comp [_StencilComp]Pass [_StencilPassOp]Fail [_StencilFailOp]}Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;fixed4 color : COLOR; };struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;fixed4 color : COLOR;};sampler2D _MainTex;float4 _MainTex_ST;float4 _Color;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv * _MainTex_ST.xy + _MainTex_ST.zw;o.color = v.color;return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);col *= _Color;col.a *= i.color.a;return col;}ENDCG}}
}
对于模板的设置,模板值设置为1,对比操作设置为7,也就是大于等于时通过。那么对于挖空区域在模板缓存中的值为2,自然就无法通过,但对于默认的ui在模板缓存中的值为0,自然可以通过,这样就实现了反选遮罩。


相关文章:
UNITY UI简易反向遮罩
附带示例资源文件:https://download.csdn.net/download/qq_55895529/89726994?spm1001.2014.3001.5503 大致效果: 实现思路:通过ui shader的模板测试功能实现 通过让想要被突出显示的物体优先渲染并写入模板值,而后再让黑色遮罩渲染并判断模板值进行渲…...
牛客周赛59(A,B,C,D,E二维循环移位,F范德蒙德卷积)
比赛链接 官方讲解 很幸运参加了内测,不过牛客这消息推送天天发广告搞得我差点错过内测消息,差点进小黑屋,好在开赛前一天看到了。 这场不难,ABC都很签到,D是个大讨论,纯屎,E是需要对循环移位…...
C语言中的隐型计算
隐型计算(Implicit Computation)是C语言中一个不易察觉的特性,它发生在类型转换和操作顺序不明确的场合。隐型计算可能导致数据溢出、精度丢失或者不正确的结果。 例如,当你在一个int类型和unsigned类型混合的表达式中使用时&…...
ffmpeg面向对象-待定
1.常用对象 rtsp拉流第一步都是avformat_open_input,其入参可以看下怎么用: AVFormatContext *fmt_ctx NULL; result avformat_open_input(&fmt_ctx, input_filename, NULL, NULL);其中fmt_ctx 如何分配内存的?如下 int avformat_ope…...
大厂嵌入式数字信号处理器(DSP)面试题及参考答案
什么是模拟信号处理和数字信号处理(DSP)在嵌入式系统中的应用? 模拟信号处理是对连续变化的模拟信号进行操作和处理。在嵌入式系统中,模拟信号处理的应用包括传感器信号的调理,例如温度传感器、压力传感器等输出的模拟信号通常比较微弱且可能受到噪声干扰,需要通过放大器…...
GC-分代收集器
GC收集器介绍 十款GC收集器 上图中共有十款GC收集器,它们可以根据回收时的属性分为分代和分区两种类型: 分代收集器:Serial、ParNew、Parallel Scavenge、CMS、Serial Old(MSC)、Parallel Old 分区收集器ÿ…...
C++从入门到起飞之——priority_queue(优先级队列) 全方位剖析!
🌈个人主页:秋风起,再归来~🔥系列专栏:C从入门到起飞 🔖克心守己,律己则安 目录 1、priority_queue的介绍 2、priority_queue的使用 3、priority_queue的模拟实现 3.1、仿函数的介…...
[数据集][目标检测]西红柿缺陷检测数据集VOC+YOLO格式17318张3类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):17318 标注数量(xml文件个数):17318 标注数量(txt文件个数):17318 标…...
【小沐学OpenGL】Ubuntu环境下glut的安装和使用
文章目录 1、简介1.1 OpenGL简介1.2 glut简介1.3 freeglut 2、glut安装2.1 命令安装glut2.2 源码安装glut 3、glut测试3.1 测试1,版本打印3.2 测试2,绘制三角形3.3 测试3,VBO绘制三角形 结语 1、简介 1.1 OpenGL简介 OpenGL作为图形界的工业…...
ROS 发行版 jazzy 加载urdf 渲染到 RVIZ2
新版启动urdf需要两个包分别为urdf_tutorial、urdf_launch 配置package.xml <exec_depend>rviz_common</exec_depend> <exec_depend>rviz_default_plugins</exec_depend> <exec_depend>rviz2</exec_depend> <exec_depend>robot…...
SpringBoot中利用EasyExcel+aop实现一个通用Excel导出功能
一、结果展示 主要功能:可以根据前端传递的参数,导出指定列、指定行 1.1 案例一 前端页面 传递参数 {"excelName": "导出用户信息1725738666946","sheetName": "导出用户信息","fieldList": [{&q…...
排序链表(归并排序)
148. 排序链表 - 力扣(LeetCode) 以O(nlogn)时间复杂度, O(1)空间复杂度 排序链表 涉及知识点: 找到链表的中间节点 2095. 删除链表的中间节点 - 力扣(LeetCode)合并有序链表 21. 合并两个有序链…...
Adobe After Effects的插件--------CC Particle World
CC Particle World是一个粒子效果器,用于在三维空间中生成和模拟各种粒子系统,包括火焰、雨、雪、爆炸、烟雾等等。它会自动随时间变化发射粒子。 本文部分参照 https://www.163.com/dy/article/IEJVDN760536FE6V.html 使用条件 使用该插件的图层需是2D图层。 我们新建一个…...
电脑硬盘数据丢失了怎么恢复?简单实用的硬盘数据找回的方法
我们的电脑使用硬盘作为存储设备来保存数据,硬盘里的数据是存储在扇区上,这些存储数据的单元则位于表面有磁性材料的旋转的盘片上。硬盘内部的磁头悬浮于高速旋转的盘片上,用于读写和检索数据。 假如我们使用电脑时不小心删除了某个文件&…...
k8s调度(pod亲和、反亲和、污点、容忍度)
pod亲和性 针对对象为Pod,目的是实现,新建Pod和目标Pod调度到一起,在同一个Node上。 示例: apiVersion: v1 kind: Pod metadata:name: testpod01labels:app: myapp01env: test1 spec:containers:- name: testpod01image: nginx:…...
智能制造核心领域:自动化、物联网、大数据分析、人工智能在现代制造业中的应用与融合
一、智能制造系统及领域 智能制造系统是一套集成的解决方案,它利用物联网(IoT)、大数据分析、人工智能(AI)、机器学习和云计算等技术,实现工厂和生产线的自动化、数据驱动和智能化。这些系统能够监控和控制…...
Android Studio 2024最新版Hello World
Android Studio 2024最新版Hello World 1. Android Studio 2024安装视频2. 创建项目Read Timed out 问题Android Studio Build Output 控制台中文乱码问题 3. 驱动管理 本文章介绍如何通过Android Studio 2024最新版创建项目, 并成功输出Hello World。 本次教程版本…...
请解释Java中的CountDownLatch和CyclicBarrier的区别和使用场景。什么是Java中的Semaphore?它如何控制并发访问?
请解释Java中的CountDownLatch和CyclicBarrier的区别和使用场景。 CountDownLatch 和 CyclicBarrier 是 Java 并发包(java.util.concurrent)中提供的两个非常有用的同步工具,它们都用于控制多个线程之间的同步,但它们的目的和使用…...
Django+Vue3前后端分离学习(五)(前端登录页面搭建)
1、如果需要使用组合式API,需要安装插件: npm install vite-plugin-vue-setup-extend --save-dev 在vite.config.js里配置: 首先导入: import VueSetupExtend from vite-plugin-vue-setup-extend 添加: 2、创建login.vue 然…...
虚拟机安装macos系统
虚拟机安装macOS系统是一个相对复杂但可行的过程,主要涉及前期准备、虚拟机软件安装、macOS镜像准备、虚拟机配置、系统安装及后续设置等多个步骤。以下是一个详细的教程,帮助您在虚拟机中成功安装macOS系统。 一、前期准备 1. 硬件要求 确保您的计算…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
