本文针对Godot 4.0。

我也查到了Godot 3.5如何实现遮罩,见这个链接 https://ask.godotengine.org/3031/how-do-i-mask-a-sprite

由于查到的大部分教程均针对3.5版本,特此提供4.0版本的教程。

CanvasItem的遮罩功能

Godot4.0的遮罩不是一个单独的节点,这个功能被包含在了一个常见的基类CanvasItem内。

若要遮罩一个物体,可以这样做:

  1. 建立精灵(或是其他继承自CanvasItem的节点),贴图为希望作为 "蒙版" 的图。接下来简称这个物体为蒙版
  2. 把你希望被遮罩的物体称作本体,建立它或是拿出来它,把它作为 "蒙版" 的子物体,可以先摆一个你认为方便查看的位置,等一下就要开启遮罩了。
  3. 这一步是重点。在检查器中设置 "蒙版" 的属性。设置CanvasItem->Visibility栏目->ClipChildrenClipOnly

这样就成功实现了遮罩的效果,即,本体显示时,透明度会根据蒙版的透明度进行调整。

因为遮罩功能被内置在CanvasItem内,所以不论是继承自Node2DSprite2D,还是继承自ControlLabel,都可以将自己设置为"蒙版"或是"本体"。

效果如下



我想到的一点窍门

很多时候,我们希望遮罩的运作模式类似于一些游戏中的"拿手电筒照射黑暗区域",场景是固定的,光照区域是运动的。

而为了使用蒙版,不得不把场景设置成光照区域的子物体,这样不就是场景随着光照运动了吗?

我想到了几个解决方案分享一下:

1. 强制跟随

使用RemoteTransform2D节点,将目标设置为"本体",使节点跟随RemoteTransform2D节点而不是"蒙版"节点。

或为本体节点绑定脚本,在_Process()中不断重设自己的GlobalPosition

注:Godot中有多个会不断轮询的函数,如果你的蒙版位移不是在_Process()中处理的,比如是在_Input()函数中处理,那么本体也应该在_Input()中重设位置,若是被物理组件控制,本体应该在_PhysicsProcess()中重设位置。不这样做容易产生明显的画面晃动。

我推测使用上述方法可能会增加无谓的DrawCall,说不定还会引起轻微的画面晃动。

2. 使用shader

如果会简单的shader编程,那么使用shader控制蒙版的形状应该是最恰当的选择。

为了方便操作,可以设置一个充满屏幕的ColorRect作为父节点,设置ClipChildren使其变成蒙版,而后在工具栏中选择"锁定",避免操作子物体时误操作蒙版

然后用shader控制蒙版的透明度以构成希望的形状。简单的圆、矩形是比较容易实现的。

可参考GodotShaders网站中的示例,特别是这一系列:

https://godotshaders.com/snippet/useful-code-snippets/

参考

https://godotforums.org/d/33826-where-is-the-mask-mode-for-light2ds-in-godot-4

Godot 4.0 遮罩一个2D物体,使其部分显示的更多相关文章

  1. 使用PathfindingProject Pro 4.0.10实现2D自动寻路

    昨天由于策划的要求,要在项目的最后加个自动寻路的功能,跑去研究了下自动寻路的插件.不多说,上操作 首先在寻路的游戏物体上加上seeker.AI Lerp这两个脚本,注意要给target赋值. 之后给目 ...

  2. 如何用WebGPU流畅渲染百万级2D物体?

    大家好~本文使用WebGPU和光线追踪算法,从0开始实现和逐步优化Demo,展示了从渲染500个2D物体都吃力到流畅渲染4百万个2D物体的优化过程和思路 目录 需求 成果 1.选择渲染的算法 2.实现 ...

  3. 如何用WebGPU流畅渲染千万级2D物体:基于光追管线

    大家好~我们已经实现了百万级2D物体的流畅渲染,不过是基于计算管线实现的.本文在它的基础上,改为基于光追管线实现,主要进行了CPU和GPU端内存的优化,成功地将渲染的2D物体数量由4百万提高到了2千万 ...

  4. GODOT 3.0 开发进度汇报 #6

    经过了又一个月的开发工作,在此作进度报告.本月的工作可以划分为:完成Web导出工具开发.GDNative.以及新的粒子系统. Web Export Godot 现在有了一款实验性的导出工具,导出目标为 ...

  5. 【跟我一起学Unity3D】做一个2D的90坦克大战之AI系统

    对于AI,我的初始想法非常easy,首先他要能动,而且是在地图里面动. 懂得撞墙后转弯,然后懂得射击,其它的没有了,基于这个想法,我首先创建了一个MyTank类,用于管理玩家的坦克的活动,然后创建AI ...

  6. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

  7. 平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。

    题目:平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小. 源码如下: #include <iostream> #include <string.h> #incl ...

  8. 为什么js中0.1+0.2不等于0.3,怎样处理使之相等?(转载)

    为什么js中0.1+0.2不等于0.3,怎样处理使之相等? console.log(0.1+0.2===0.3)// true or false?? 在正常的数学逻辑思维中,0.1+0.2=0.3这个 ...

  9. 设置一个div网页滚动时,使其固定在头部,当页面滚动到距离头部300px时,隐藏该div,另一个div在底部,此时显示;当页面滚动到起始位置时,头部div出现,底部div隐藏

    设置一个div网页滚动时,使其固定在头部,当页面滚动到距离头部300px时,隐藏该div,另一个div在底部,此时显示: 当页面滚动到起始位置时,头部div出现,底部div隐藏 前端代码: <! ...

  10. GODOT 3.0 开发快照版本 ALPHA1 释出

    经过将近一年的开发后,master 分支(即未来的Godot 3.0)所有功能特性接近完成,可以在Godot社区里进行更广泛的测试了.因此我们释出了第一个Alpha快照版本,供老用户体验.报告Bug. ...

随机推荐

  1. C++内存重叠

    内存重叠是指在内存中存在两个或多个区域,它们的地址范围有交叉部分.在 C++ 中,内存重叠可能会导致程序出现不可预期的行为,因此我们需要了解它的原因和如何避免. 内存重叠的原因 内存重叠的主要原因是指 ...

  2. 30张图说清楚 TCP 协议

    大家好,我是风筝 前两天分享了 20张图说清楚 IP 协议 今天,继续来网管的自我修养之TCP协议,这可是除 IP 协议外另一个核心协议了. TCP 协议是网络传输中至关重要的一个协议,它位于传输层. ...

  3. CISCN2021-第十四届全国大学生信息安全竞赛-WriteUp

    WriteUp - Maple_root -CISCN2021 总结 总得分:3400 总排名:203 赛区排名:21 第一次认真参加正式的CTF,24+3小时的脑血栓比赛时长,收获还是很多的. 开卷 ...

  4. 垃圾回收之CMS、G1、ZGC对比

    ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延迟垃圾回收器,它的设计目标包括: 停顿时间不超过10ms: 停顿时间不会随着堆的大小,或者活跃对象的大小而增加: ...

  5. 【ACM算法竞赛日常训练】DAY10题解与分析【月月给华华出题】【华华给月月出题】| 筛法 | 欧拉函数 | 数论

    DAY10共2题: 月月给华华出题 华华给月月出题 难度较大. 作者:Eriktse 简介:211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法!️欢迎关注我,一起交流C++/Python ...

  6. odbe简介

    Odbc简介 今天工作中遇到一个问题,缺少某个数据库驱动程序,百度半天才发现原来室odbc原因,所以,就捎带学习了一下odbc, ODBC数据源中文名称:开放数据库互联英文名称:Open Databa ...

  7. Luogu P4114 Qtree1

    树剖一好题.我心水了ww 题目描述 给定一棵n个节点的树,有两个操作: CHANGE i ti 把第i条边的边权变成ti QUERY a b 输出从a到b的路径中最大的边权,当a=b的时候,输出0 输 ...

  8. Redis读书笔记(一)

    Redis数据结构 1 简单动态字符串 Simple dynamic string 的实现 // sds.h/sdshdr struct sdshdr { int len; //记录buf数组中已使用 ...

  9. 创建SVN和设置密码以及SVN自动更新

    重新创建版本库:    svnadmin create /usr/local/svn/month_exam //创建一个svn版本仓库month_exam(month_exam可以随便起名字) cd ...

  10. 一文吃透Elasticsearch

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...