当前位置: 首页 > article >正文

Cocos Creator Shader入门实战(八):Shader实现圆形、椭圆、菱形等头像

引擎:3.8.5

您好,我是鹤九日!



回顾


Shader的学习是一条漫长的道路。

理论知识的枯燥无味,让很多人选择了放弃。然而不得不说:任何新知识、新领域的学习,本身面临的都是问题!

互联网和AI给了我们很多的便利性,这里罗列些个人学习使用到资料,希望对您有用。

The Book of shaders 片段着色器的入门指南

Learn OpenGL 中文版 讲解Open GL的学习使用

CocosCreatorShader 木限东的Shader效果实现实例,这里感谢作者的公开分享。

慎入!史上最强 Cocos Shader 学习资源推荐(建议收藏) Cocos官方推荐的学习资源。

注:感谢Cocos官方、感谢热心的大佬的内容整理和分享!



前言


后续的文章将逐步开始汇总一些,自己在学习Shader中编写的一些效果。

当然,这些效果的实现,并非个人创造,可能是一些模仿,然后是模仿中的延伸。

正式开始文章之前,想告诉您两件事:

一、因Shader效果的实现,需要CCEffect属性配置和 CCProgram着色器代码,它们存在相通部分;后续的文章仅会粘贴关键部分,避免篇幅过长。

二、个人编写的Shader效果Demo示例,使用的是Gitee仓库,名为:CocosShaderDemo

内容的主要结构是:

请添加图片描述

  • res/common 放置通用的chunk或者其他相关,顶点着色器部分的chunk,就在此处。

  • res/effect 放置一些.effect/.material的shader文件,除后缀不同外,名字相同。

  • resources/prefab 放置效果实现的预制体页面

  • script/effect 一些effect效果的实现脚本

注:我曾考虑过像**木限东**大佬一样,每个效果对应一个项目工程,这样版本管理控制灵活。

但又考虑到可能查看不便,便采用了此中方式。

页面的配置使用的是LayerConfig.ts,主要配置结构:

请添加图片描述

实现效果页面如下:
请添加图片描述

注:代码仓库CocosShaderDemo,因时间限制,文档的补充并不完善,希望您能谅解!



开始


今天的内容,讲解的主要是: Shader自定义不同形状的头像。

如果不考虑Shader的话,使用Mask遮罩也是可以实现不同形状头像的,只是Mask的使用会影响渲染合批,导致性能不高。

既然学习到Shader,我们便用Shader来实现吧。先看示意图:

请添加图片描述

注:圆形头像的实现,参考的是: 木限东 ,其他是延伸,对应的个人仓库:地址



圆形头像


Shader实现的圆形头像,同Mask实现,其实有相似之处。

Mask的实现是构建一个不同形状的约束框遮罩层,在遮罩层内显示图像,遮罩范围外则裁切,不会进行渲染。

放到Shader当中,Shader处理的是像素,则指定形状内进行绘制,形状以外的裁切,不进行绘制而已。

只是Shader比Mask相比,有着更高的灵活度,比如边缘的模糊度处理、抗锯齿等。


属性配置

实现圆形头像,properties的属性配置如下:

properties:alphaThreshold: { value: 0.5 }wh_ratio: { value: 1, editor: { tooltip: "宽高比"}}blur: { value: 0.01, editor: { tooltip: "光圈模糊程度"}}radius: { value: 0.5, editor: { tooltip: "光圈半径"}}center: { value: [0.5, 0.5], editor: { tooltip: "光圈中心"}}

片段着色器部分的主要逻辑如下:

CCProgram sprite-fs %{// 自定义参数的说明,注意UBO内存对齐规则uniform ARGS{float radius;       // 光圈半径float blur;         // 光圈模糊程度vec2 center;        // 光圈中心点float wh_ratio;     // 宽高比};vec4 frag () {// 初始化颜色值为白色且不透明vec4 o = vec4(1, 1, 1, 1);// 通过CCSampleWithAlphaSeparated函数从纹理中采样颜色,并将其与初始颜色o相乘。o *= CCSampleWithAlphaSeparated(cc_spriteTexture, v_uv0);// 将采样得到的颜色与顶点颜色v_color相乘,得到最终的颜色值o *= v_color;// 执行透明度测试,根据o的透明度值决定是否丢弃当前片段ALPHA_TEST(o);// 计算圆形的半径平方,用于后续的圆形边界判断float circle = radius * radius;// 计算当前片段的纹理坐标与圆形中心点的偏移量,并考虑宽高比wh_ratio对x方向的调整float rx = (v_uv0.x - center.x) * wh_ratio;float ry = v_uv0.y - center.y;// 计算当前片段到圆形中心点的距离平方float dis = rx * rx + ry * ry;// smoothstep函数的作用是在两个边缘值之间平滑过渡,降低锯齿// circle是圆形的边界,circle - blur是模糊的起始边界,dis是当前片段到中心的距离平方o.a = smoothstep(circle, circle - blur, dis) * o.a;return o;}
}

最后添加下Material材质,并设定Effect;然后将材质资源放到对应精灵的customMaterial属性中,即可。

注: 代码中的注释很详细了,我就不再一一赘述了,后面的实现,与之类似。



椭圆头像


椭圆头像同圆形头像类似,只不过使用shader要生成椭圆而已。

属性配置:

radiusX: { value: 0.5, editor: { tooltip: "椭圆的X轴半径"}}
radiusY: { value: 0.3, editor: { tooltip: "椭圆的Y轴半径"}}
blur: { value: 0.1, editor: { tooltip: "椭圆边缘的模糊程度"}}
center: { value: [0.5, 0.5], editor: { tooltip: "光圈中心"}}

关键性片段代码:

uniform ARGS {vec2 center;       // 椭圆中心点float radiusX;     // 椭圆的X轴半径float radiusY;     // 椭圆的Y轴半径float blur;        // 椭圆边缘的模糊程度
};vec4 frag () {// ...// 计算椭圆的边界条件float rx = (v_uv0.x - center.x) / radiusX;float ry = (v_uv0.y - center.y) / radiusY;float dis = rx * rx + ry * ry;// smoothstep函数的作用是在两个边缘值之间平滑过渡,降低锯齿o.a = smoothstep(1.0, 1.0 - blur, dis) * o.a;return o;
}

注: ARGS参数的设定,注意UBO内存规则,否则容易报错。详情:ERROR_EFX2205



四边形头像


属性配置:

size: { value: 0.5, editor: { tooltip: "四边形的大小"}}
angle: { value: 0.26, editor: { tooltip: "倾斜角度"}}
blur: { value: 0.05, editor: { tooltip: "边缘的模糊程度"}}
center: { value: [0.5, 0.5], editor: { tooltip: "中心点"}}

关键代码:

// 计算当前像素相对于中心点的偏移
vec2 offset = v_uv0 - center;// 应用旋转矩阵,将坐标旋转回未倾斜的状态
float cosA = cos(-angle);
float sinA = sin(-angle);
vec2 rotatedOffset = vec2(offset.x * cosA - offset.y * sinA,offset.x * sinA + offset.y * cosA
);// 判断是否在菱形区域内
float diamond = abs(rotatedOffset.x) + abs(rotatedOffset.y);// 使用smoothstep将菱形的边缘虚化,降低锯齿
o.a = smoothstep(size, size - blur, diamond) * o.a;


总结


如上效果,关于属性参数的配置,均可通过材质的属性检查器进行设置。

请添加图片描述

当然,也可以通过代码脚本的setProperty属性进行动态设置,以圆形头像的宽高比为例:

@property(Sprite)
circleSprite!: Sprite;                  // 圆形头像protected start(): void {// 圆形头像设置宽高比let avatarSize = this.circleSprite.getComponent(UITransform).contentSize;let ratio = avatarSize.width / avatarSize.height;const circleMaterial = this.circleSprite.getSharedMaterial(0);circleMaterial.setProperty("wh_ratio", ratio);
}

数学公式在这里暂且就不说明了,有两点考虑:

一、数学公式的繁杂性,如果不懂,会让人产生更多的畏难。

二、学习的兴趣在于好奇,好奇+想象力,会让人发现更多有意思的地方。

综上,内容有些浅显,只是我更希望:作为新人,降低畏难度,增加好奇和兴趣,也很有用。

今天的文章,到这里就结束了;可能理解有误,欢迎您的指出!

如果觉得文章不错,期待您的点赞和留言,感谢!

我是鹤九日,祝您生活愉快!

相关文章:

Cocos Creator Shader入门实战(八):Shader实现圆形、椭圆、菱形等头像

引擎:3.8.5 您好,我是鹤九日! 回顾 Shader的学习是一条漫长的道路。 理论知识的枯燥无味,让很多人选择了放弃。然而不得不说:任何新知识、新领域的学习,本身面临的都是问题! 互联网和AI给了我…...

大模型SFT用chat版还是base版 SFT后灾难性遗忘怎么办

大模型SFT用chat版还是base版 进行 SFT 时,基座模型选用 Chat 还是 Base 模型? 选 Base 还是 Chat 模型,首先先熟悉 Base 和 Chat 是两种不同的大模型,它们在训练数据、应用场景和模型特性上有所区别。 在训练数据方面&#xf…...

【AI论文】VCR-Bench:视频链式思考推理的综合评估框架

摘要:思想链(CoT)推理的进步显著增强了大型语言模型(LLMs)和大型视觉语言模型(LVLMs)的能力。 然而,目前仍然缺乏一个严格的视频CoT推理评估框架。 目前的视频基准测试无法充分评估推…...

数据中台、BI业务访谈(二):组织架构梳理的坑

这是数据中台、BI业务访谈系列的第二篇文章,在上一篇文章中,我重点介绍了在给企业的业务部门、高层管理做业务访谈之前我们要做好行业、业务知识的功课。做好这些功课之后,就到了实际的访谈环节了。 业务访谈关键点 那么在具体业务访谈的时…...

【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例)

【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例) (声明:实际操作请遵守网络安全法,仅在授权环境进行测试,仅供个人研究) 一、DVWA靶场简介 DVWA(Damn Vulnerable Web Application)是专为网络安全学习者设计的漏洞演练平台,包含SQL注入、XSS、文件…...

库学习04——numpy

一、基本属性 二、 创建数组 (一)arange a np.arange(10,20,2) # [10,12,14,16,18] 只有一个参数n的话,默认是从0到n-1的一维数组。 (二)自定义reshape a np.arange(12).reshape((3,4)) [[ 0 1 2 3][ 4 5 …...

Win10系统安装WSL2-Ubuntu, 并使用VScode开始工作

本教程基于博主当前需要使用 WSL2(Windows Subsystem for Linux 2) 而编写,将自己使用的经过分享给大家。有什么意见建议敬请大家批评指正。此过程需要打开 Microsoft Store 话不多说,立即开始~ 文章目录 1. 检查系统版本2. 启动 WSL 功能3. 安装Ubuntu4…...

SLAM(七)-卡尔曼滤波

SLAM(七)-卡尔曼滤波 一、卡尔曼滤波(KF)二、扩展卡尔曼滤波(EKF)三、误差状态卡尔曼滤波(ESKF) 参考《概率机器人》、《Principles of GNSS,lnertial and Multisensor lntegrated Navigation Systems (Second Edition)》 一、卡尔曼滤波(KF)…...

如何解决DDoS攻击问题 ?—专业解决方案深度分析

本文深入解析DDoS攻击面临的挑战与解决策略,提供了一系列防御技术和实践建议,帮助企业加强其网络安全架构,有效防御DDoS攻击。从攻击的识别、防范措施到应急响应,为网络安全工作者提供了详细的操作指引。 DDoS攻击概览&#xff1a…...

解决 Ubuntu 上 Docker 安装与网络问题:从禁用 IPv6 到配置代理

解决 Ubuntu 上 Docker 安装与网络问题的实践笔记 在 Ubuntu(Noble 版本)上安装 Docker 时,我遇到了两个常见的网络问题:apt-get update 失败和无法拉取 Docker 镜像。通过逐步排查和配置,最终成功运行 docker run he…...

Windows for Redis 后台服务运行

下载 redis 安装包 地址:https://github.com/tporadowski/redis/releases 解压zip压缩包,执行 redis-server.exe 即可以窗口模式运行(窗口关闭则服务关闭) 运行窗口可以看到,端口是 6379 我这里使用 nvaicat 客服端测…...

AMGCL库的Backends及使用示例

AMGCL库的Backends及使用示例 AMGCL是一个用于解决大型稀疏线性方程组的C库,它提供了多种后端(backends)实现,允许用户根据不同的硬件和性能需求选择合适的计算后端。 AMGCL支持的主要Backends 内置Backends: builtin - 默认的纯C实现block - 支持块状…...

【前端】【css】flex布局详解

Flex 布局(Flexible Box Layout,弹性盒子布局)是 CSS3 中的一种布局模式,用于在容器中更高效地分配空间并对齐内容,即使它们的大小是动态未知的。它非常适用于响应式设计。 一、Flex 布局的基本概念 1. 启用 Flex 布局…...

Java面试黄金宝典43

1. 零拷贝技术 零拷贝(Zero - copy)技术是一种高效的数据传输技术,它旨在减少数据在用户空间和内核空间之间的拷贝次数,以此提升系统的数据传输性能。在传统数据传输过程中,数据往往需要多次在用户空间和内核空间之间拷贝,这会消耗大量的 CPU 资源,而零拷贝技术能避免这…...

C语言超详细指针知识(二)

在上一篇有关指针的博客中,我们介绍了指针的基础知识,如:内存与地址,解引用操作符,野指针等,今天我们将更加深入的学习指针的其他知识。 1.指针的使用和传址调用 1.1strlen的模拟实现 库函数strlen的功能是…...

华为机试—最大最小路

题目 对于给定的无向无根树&#xff0c;第 i 个节点上有一个权值 wi​ 。我们定义一条简单路径是好的&#xff0c;当且仅当&#xff1a;路径上的点的点权最小值小于等于 a &#xff0c;路径上的点的点权最大值大于等于 b 。 保证给定的 a<b&#xff0c;你需要计算有多少条简…...

[Linux]从零开始的ARM Linux交叉编译与.so文件链接教程

一、前言 最近在项目需要将C版本的opencv集成到原本的代码中从而进行一些简单的图像处理。但是在这其中遇到了一些问题&#xff0c;首先就是原本的opencv我们需要在x86的架构上进行编译然后将其集成到我们的项目中&#xff0c;这里我们到底应该将opencv编译为x86架构的还是编译…...

【模板】缩点

洛谷p3387 思路: 算法:tarjan算法 根据题意,我们只要找到一个路径,使得最终权重最大即可,首先,根据题目可知,如果一个点在一个环上,那么我们就将这整个环都选上,题目上允许我们能够重复走,因此,我们可以将环缩成点,将环所称点后,就可以转换成树,从没有父节点的结点开始,我们向…...

Rag实现流程

Rag实现流程 目录 Rag实现流程1. 加载问答链代码解释`chain_type="stuff"` 的含义其他 `chain_type` 参数选项及特点1. `map_reduce`2. `refine`3. `map_rerank`示例代码展示不同 `chain_type` 的使用其他参数类型2. 提出问题3. 检索相关文档代码解释其他参数类型4. …...

计算机网络- 传输层安全性

传输层安全性 7. 传输层安全性7.1 传输层安全基础7.1.1 安全需求机密性&#xff08;Confidentiality&#xff09;完整性&#xff08;Integrity&#xff09;真实性&#xff08;Authenticity&#xff09;不可否认性&#xff08;Non-repudiation&#xff09; 7.1.2 常见安全威胁窃…...

常青藤快速选择系统介绍

功能特点 支持多种属性和特性&#xff1a;可依据实体属性&#xff08;如实体类型、图层、颜色、线宽等&#xff09;以及实体特性&#xff08;如直线长度、圆面积、文字内容等&#xff09;进行筛选。多过滤条件与运算符号&#xff1a;支持多个过滤条件组合&#xff0c;基本涵盖实…...

【c语言】指针习题

练习一&#xff1a;使用指针打印数组内容 #include <stdio.h> void print(int* p, int sz) {int i 0;for (i 0; i < sz; i) {printf("%d ", *p);//printf("%d ", *(p i));} } int main() {int arr[] { 1,2,3,4,5,6,7,8,9,10 };int sz sizeof…...

KWDB创作者计划—KWDB认知引擎:数据流动架构与时空感知计算的范式突破

引言&#xff1a;数据智能的第三范式 在数字化转型进入深水区的2025年&#xff0c;企业数据系统正面临三重悖论&#xff1a;数据规模指数级增长与实时决策需求之间的矛盾、多模态数据孤岛与业务连续性要求之间的冲突、静态存储范式与动态场景适配之间的鸿沟。KWDB&#xff08;K…...

Sqoop常用指令

Sqoop&#xff08;SQL-to-Hadoop&#xff09;是一个开源工具&#xff0c;旨在将关系型数据库中的数据导入到Hadoop的HDFS中&#xff0c;或者从HDFS导出到关系型数据库中。以下是一些常用的Sqoop命令&#xff1a; 导入数据到HDFS 1. 基本导入 sqoop import \ --connect jdbc:mys…...

银行业务知识序言

银行业务知识体系全景解析 第一章 金融创新浪潮下的银行业务知识革命 1.1 数字化转型驱动金融业态重构 在区块链、人工智能、物联网等技术的叠加作用下&#xff0c;全球银行业正经历着"服务无形化、流程智能化、风控穿透化"的深刻变革。根据麦肯锡《2023全球银行业…...

智慧水务项目(八)基于Django 5.1 版本PyScada详细安装实战

一、说明 PyScada&#xff0c;一个基于Python和Django框架的开源SCADA&#xff08;数据采集与监视控制系统&#xff09;系统&#xff0c;采用HTML5技术打造人机界面&#xff08;HMI&#xff09;。它兼容多种工业协议&#xff0c;如Modbus TCP/IP、RTU、ASCII等&#xff0c;并具…...

畅游Diffusion数字人(23):字节最新表情+动作模仿视频生成DreamActor-M1

畅游Diffusion数字人(0):专栏文章导航 前言:之前有很多动作模仿或者表情模仿的工作,但是如果要在实际使用中进行电影级的复刻工作,仅仅表情或动作模仿还不够,需要表情和动作一起模仿。最近字节跳动提出了一个表情+动作模仿视频生成DreamActor-M1。 目录 贡献概述 核心动…...

【Unity网络编程知识】C#的 Http相关类学习

1、搭建HTTP服务器 使用别人做好的HTTP服务器软件&#xff0c;一般作为资源服务器时使用该方式&#xff08;学习阶段建议使用&#xff09;自己编写HTTP服务器应用程序&#xff0c;一般作为Web服务器或者短连接游戏服务器时使用该方式&#xff08;工作后由后端程序员来做&#…...

Python operator 模块介绍

operator 模块是 Python 标准库中的一个模块,它提供了一系列与 Python 内置运算符对应的函数。这些函数可以用于替代一些常见的运算符操作,在某些场景下能让代码更加简洁、高效,还能方便地用于函数式编程。以下是对 operator 模块的详细介绍: 1. 导入模块 使用 operator …...

SpringBoot企业级开发之【用户模块-更新用户头像】

功能如下所示&#xff1a; 我们先看一下接口文档&#xff1a; 为什么头像是一串字符串呢&#xff1f;因为我们是将头像图片放到第三方去存储&#xff0c;比如&#xff1a;阿里云等 开发思路&#xff1a; 实操&#xff1a; 1.controller 注意!这里使用【PatchMapping】注解…...