【包教包会】Shader实战——挖洞(Demo演示战斗迷雾、放大镜、新手引导、转场动画)

演示demo:https://gitee.com/szrpf/HoleMask


一、效果演示:



以上所有特效,都是通过挖洞组件HoleMask.ts实现的。


二、功能介绍
image
首先打开Demo,找到"聚光灯Demo/黑幕"节点的HoleMask组件

  • 类型:决定了挖洞轮廓形状,可以选矩形、椭圆、纹理图采样(类似Mask)
  • 中心:洞的位置
  • 尺寸:洞的宽高
  • 羽化:给挖洞轮廓添加平滑过渡
  • 反向:反向挖洞,即洞里可见,洞外透明
    勾选反向后,可以设置洞内像素缩放(放大镜效果)

image
可通过代码动态修改以上属性,或者调用方法,具体参考Demo
HoleMask无需import,通过gi.HoleMask全局访问,具体参考Demo


三、如何在自己的项目中使用HoleMask
image
Step 1:复制Demo中这3个文件到自己项目assets目录下,具体层级不限


Step 2:新建一个Sprite节点,HoleMask.mtl拖自定义材质,HoleMask.ts拖组件
image
Step 3:搞定!编辑器修改挖洞参数,也可以在代码中动态修改


四、实现原理
1、挖椭圆


虽然上图看着是个圆,但需求是能实现任意尺寸,也就是椭圆
计算归一化的椭圆距离:length((flipUv * texSize - center) / halfSize)

  • 当点在椭圆上时,length = 1.0
  • 当点在椭圆内时,length < 1.0
  • 当点在椭圆外时,length > 1.0
    边缘距离1.0 - length(...) 计算到椭圆边缘的距离
    椭圆特性 :使用向量长度自然形成椭圆形状,通过halfSize的x,y比例控制椭圆扁率
    效果 :创建一个可羽化的椭圆挖洞区域

2、挖矩形
image

vec2 coord = 1.0 - abs(flipUv * texSize - center) / halfSize;
alpha = min(smoothstep(-fx, fx, coord.x), smoothstep(-fy, fy, coord.y));
  1. 坐标转换flipUv * texSize - center 将UV坐标转换到以挖洞中心为原点的像素坐标系
  2. 归一化abs(...) / halfSize 计算相对于矩形半宽的归一化坐标,范围[0,1]
  3. 边缘距离1.0 - coord 计算到矩形边缘的距离,越靠近中心值越大
  4. 羽化处理smoothstep(-fx, fx, coord.x) 在边缘附近创建平滑过渡
  5. 取最小值min(alpha.x, alpha.y) 确保矩形四个边都正确挖洞

效果 :创建一个可羽化的矩形挖洞区域

3、挖图片轮廓
image

vec2 contourUV = (flipUv * texSize - center + halfSize) / size;
contourUV.y = 1.0 - contourUV.y;
alpha = step(ALPHA_THRESHOLD, getColor(contourTexture, contourUV).a);
  1. UV映射(flipUv * texSize - center + halfSize) / size 将挖洞区域映射到轮廓纹理的[0,1]范围
  2. Y轴翻转contourUV.y = 1.0 - contourUV.y 修正Cocos的纹理坐标系
  3. Alpha阈值step(ALPHA_THRESHOLD, ...) 使用轮廓纹理的alpha通道作为挖洞掩码
  • alpha ≥ ALPHA_THRESHOLD:不透明区域
  • alpha < ALPHA_THRESHOLD:透明区域

效果 :根据轮廓纹理的alpha通道创建任意形状的挖洞

共同特点

  1. 坐标系 :都使用以挖洞中心为原点的局部坐标系
  2. 羽化控制 :通过feather参数控制边缘过渡平滑度
  3. 方向控制 :inverted参数控制挖洞/保留的切换
  4. 性能优化 :使用硬边缘step函数或平滑smoothstep函数

image
恭喜你拿到Shader初中毕业证书,拯救世界的任务就交给你了~~


我的Shader是跟着Vajoy大佬的教程学的:https://store.cocos.com/app/detail/7793
对Shader感兴趣的欢迎下单!

Gitee地址:https://gitee.com/szrpf

EMail地址:27185709@qq.com


推荐链接:
1、【包教包会】CocosShader零基础入门

2、【包教包会】3分钟学会贝塞尔曲线

3、【包教包会】130行代码实现多语言,i18n扔了扔了

4、【包教包会】CocosCreator3.x全局单例最优解

5、【包教包会】节点扩展(支持原生,附引擎源码查询教程、skew翻页教程)

mi

17赞

我记得皮佬也有个类似的 乍一看很像

image Mark!

不错不错,帮顶 :eyes:

大佬 666

哈哈这不商业互吹一波

gameer大佬 :wave: :wave:

是Shader啊 :smiley:点赞:+1:

布道师这么晚还在逛社区啊 :grinning:

屌得飞起666

这是什么功夫

:+1:大佬666