如何实现关卡切换黑屏遮罩

news/2024/11/17 2:35:39/

如何实现关卡切换黑色遮罩效果

1. shader需求分析

昨日看到一个效果,就是关卡结束可以有一个logo遮住关卡的效果,如下:

GIF来源:Fululu627的视频
为了仿制了一个,我尝试了使用UI中的Mask组件,然后动画调控scale,最后发现锯齿太多。由于最近在学shader,于是想shader能不能做这件事情?

所以让我们来分析,这里提出了三个需求:

  1. 我们需要让纹理一部分透过遮罩看到场景
  2. 我们需要一个纹理在中心点放大缩小的效果
  3. 我们需要让放大缩小受到脚本控制,可以录制动画

2. 实现需求

2.1 素材准备

  • 利用ps制作了一个黑色遮罩效果,透明部分为纯白色

2.2 白色部分片元裁切

由于是平面的图片,且放到Canvas下,所以不可能在顶点着色器中修改什么,只需要修改片元着色器即可。

  1. 创建一个unlit的shader
  2. 将Queue和RenderType改到Transparent
  3. 然后在片元着色器中clip(0.1 - col.r);这个函数代表如果此时传入的值为负就将其裁切。

2.3 在中心点放缩

在实现放缩之前,首先思考,由于uv的范围是(0,0)->(1,1),所以贸然放缩,肯定是围绕(0,0)去放缩,可现在明显中点在(0.5,0.5)。

我们想到一句话:如果要进行放缩旋转操作,先要将该片元平移到原点,然后旋转放缩,结束后再平移回去。(如果不知道,详情可以看Learn Unity Shader from Scratch系列的3-15.2)

按照这个原理,我们构造了一个放缩函数。

//pos是传入的uv,center是绕哪个点放缩,num是放缩系数
float2 uvValue(float2 pos,float2 center,float num)
{float2 destPos = pos - center;destPos = destPos * num;return destPos + center;
}

于是,只要在片元着色器中调用这个函数就好啦。

2.4 利用脚本实现放缩效果

在脚本中获得Image组件,从Image中点出Material设置_Num。然后利用Animator制作一个控制 _Num的动画。

效果如下:

虽然仍然有锯齿,但这多半是准备素材质量不高的导致的,并且锯齿不像放缩scale那么难看,只要提高导入MainTexture质量就行。

3. 大功告成

这里贴出实现的shader。完成撒花!

Shader "TWShaders/MaskBlack"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Num("Num",Float) = 1}SubShader{Tags { "RenderType"="Transparent"  "Queue" = "Transparent"}LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 position : SV_POSITION;float4 worldPos : TEXCOORD1;};sampler2D _MainTex;float4 _MainTex_ST;float _Num;//放大倍数v2f vert (appdata v){v2f o;o.position = UnityObjectToClipPos(v.vertex);o.worldPos = mul(unity_ObjectToWorld,v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}//自制放缩函数float2 uvValue(float2 pos,float2 center,float num){float2 destPos = pos - center;destPos = destPos * num;return destPos + center;}fixed4 frag (v2f i) : SV_Target{// sample the texturefloat2 uv = uvValue(i.uv,float2(0.5,0.5),_Num);//调用函数fixed4 col = tex2D(_MainTex, uv);clip(0.1 - col.r);//裁剪return col;}ENDCG}}
}

http://www.ppmy.cn/news/734887.html

相关文章

Ubuntu20.04进入图形界面黑屏,可切换命令行

在/boot/grub/grub.cfg中添加nomodeset,操作如下: vim /etc/grub/grub.cfg 保存后推出 vim /etc/default/grub 保存后退出 重启即可

iOS 16适配屏幕旋转强制转屏切换大总结

问题原因: 苹果又给我们挖坑了,iOS 16屏幕旋转报错:[Orientation] BUG IN CLIENT OF UIKIT: Setting UIDevice.orientation is not supported. Please use UIWindowScene.requestGeometryUpdate(_:) 坑:听说xcode 14 和 xcode 1…

快捷键实现MAC或者WINDOWS下快速切换显示器输入源

目录 通过键盘实现mac或者Windows显示器输入信号源快捷键切换(电脑怎么切换屏幕的信号输入) 前言一、通过显示器菜单按钮控制二、通过快捷键设置1.window系统对ControlMyMonitor做一点补充(不想对软件有详细了解的可直接跳过,不…

【专升本-英语单词】500-1000需复习词汇

单词翻译affection forphr. - 对…的感情。ahead of timephr. - 提前,提早。neglectv. - 忽视。objectiven. - 目标,目的;adj. - 客观的。all butphr. - 除…以外的所有。all overphr. - 到处,普及。requirev. - 规定。previousad…

漏洞复现 || 畅捷通T+ net反序列化

免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此…

忍者的时代用计算机怎么弹,火影忍者百豪纲手怎么玩 上墙 弹墙 三连摔操作方法...

火影忍者2020年5月限定忍者百豪纲手已经正式上线,这是当前版本中首位可以上墙的角色,即使没有进行攻击也可以跳到空中躲技能或者攻击,同时还有特殊的三连摔机制,不过很多玩家还不清楚百豪纲手该怎么玩,下面趣趣手游网小…

GENMARK控制器维修S08S4P.D工业电脑维修

机器人GENMARK SYSTEM CONTROLLER系统控制器维修S08S4P.D工业电脑;晶圆转移机器人SΛΛALL CONTROLLER; SΛΛC1100 半导体设备机械臂GENMARK控制器等 GenMark的两大构架:eSensor(电子传感)和Elecitrowetting&#xf…

【运维】迁移Git项目到新的地址

【运维】迁移Git项目到新的地址 包含所有分支 及其提交记录等 迁移项目 1 创建新的空项目 newProject https://127.0.0.1/new/newProject.git 2 克隆老项目 git clone --mirror https://127.0.0.2/old/oldProject.git 进入老项目目录 cd oldProject 3将老项目更改远程地址…