Godot根据遮罩图移动粒子

news/2024/11/27 19:30:28/

前言

目前UI粒子特效unity引擎比较多,也好找资料,但是一般都是利用模型,使用3D粒子伪装2D效果。

Godot中也可以做到这一点,并且Godot有专门的2D粒子系统,可以通过一张遮罩图对粒子的位置进行设置。

godot粒子教程

准备阶段

1、使用ps新建256*256的工程。

2、将左下角两个颜色变成纯黑和纯白

3、使用钢笔工具勾勒出路径,并在打开路径面板

 

4、修改画笔设置,勾选颜色动态,控制改为渐隐,后面的值需要手动不停调,有可能不会出效果是因为值不对。

5、点击路径面板下面的第二个按钮 ,用画笔描边路径

 就可以得到这样一张遮罩图了。由黑变白

参考链接

 原理讲解

godot的粒子shader,可以设置粒子的位置,如果每帧每个粒子读取这张图,使用texelFetch每个像素判断颜色是否等于n,如果等于,则将获取到的位置赋予粒子。

texelFetch函数有三个参数,纹理图,位置,不知道是啥(填0即可)

返回的是指定位置像素颜色vec4。

实际操作

新建2D gpu粒子,创建粒子材质,加载发射遮罩。

这时把上面两张图保存,并记住12571,是此图的尺寸。

加载发射遮罩教程

 然后你就得到了两张图

一张是存的图片位置,一张是存的图片颜色。

这时我们新建一个粒子shader并填入以下代码

shader_type particles;uniform sampler2D img;uniform int emission_texture_point_count;
uniform sampler2D emission_texture_color : hint_white;
uniform sampler2D emission_texture_points : hint_black;uniform int point : hint_range(0,12571) = 0;
uniform float offset : hint_range(0.0,1.0) = 1.0;void vertex(){CUSTOM.y += DELTA / LIFETIME;//int point = min(emission_texture_point_count - 1, int(1.0 * float(emission_texture_point_count)));ivec2 emission_tex_size = textureSize(emission_texture_points, 0);//2048ivec2 emission_tex_ofs = ivec2(point % emission_tex_size.x, point / emission_tex_size.x);//0~2048 0123ivec2 pos = ivec2(0,0);while(true){pos.x = pos.x + 1;if(pos.x > 2048){pos.x = 0;pos.y = pos.y + 1;if(pos.y >3){pos.x = 0;pos.y = 0;pos = ivec2(0,0);break;}}vec4 p = texelFetch(emission_texture_color, pos, 0);if(abs(p.r - offset) < 0.03){break;}}//texelFetch使用整数坐标获取单个纹素TRANSFORM[3].xyz = texelFetch(emission_texture_points, pos, 0).xyz;//float size = (1.-CUSTOM.y) * 0.5;//TRANSFORM[0].x = size;//TRANSFORM[1].y = size;//COLOR = texelFetch(emission_texture_color, pos, 0);
}

 

 注意上面那个while循环,改的话小心,容易把电脑弄崩。

如果要自动根据粒子寿命播放,修改if(abs(p.r - offset) < 0.03){这一句里面的offset为CUSTOM.y即可。

待优化

这里只是记录以下想法,实际操作下来感觉不是很好用,另一种方案是脚本代码读样条线,把数值传递给粒子系统。

这采样次数有点多,感觉可以按3d vat的思路,贴图的每个像素点直接记录一个分段点的vec2局部位置,这样一根64分段的曲线只需要64*1的贴图,然后偏移粒子的uv去采样位置就行,还能利用自带的线性过滤插值。

有感兴趣的大佬如果做到更好的,可以b站联系我“岩岩bi”


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

相关文章

深度学习网络---YOLO系列

深度学习网络—YOLO yolov1&#xff08;仅适用一个卷积神经网络端到端地实现检测物体的目的&#xff09; 首先将输入图片resize到448448&#xff0c;然后送入CNN网络&#xff0c;最后处理预测的结果得到检测的目标&#xff1b;yolov1的具体思想是将全图划分为SS的格子&#xf…

第五十三章 使用 ^SystemPerformance 监视性能 - InterSystems IRIS Linux 平台性能数据报告

文章目录第五十三章 使用 ^SystemPerformance 监视性能 - InterSystems IRIS Linux 平台性能数据报告第五十三章 使用 ^SystemPerformance 监视性能 - InterSystems IRIS Linux 平台性能数据报告 %SS - 使用 ALL^%SS 命令在运行过程中采集了四个样本。 Configuration * - 来自…

CSDN原创图片链接失效分析

过年花了5个小时&#xff0c;把我的所有BLOG&#xff08;200多篇&#xff09;检查了一遍&#xff0c;更正了几十处图片链接失效。 1. 现象 几个月来&#xff0c;由于在写书&#xff0c;不停地回翻自己以前的文章。结果&#xff0c;不断发现大量辛辛苦苦绘制的图片打不开了&am…

C语言之程序设计概述

1.1.1 程序的概念 程序&#xff1a;算法 数据结构 程序设计方法 语言工具和环境数据结构&#xff1a;数据的类型和数据的组织方式算法&#xff1a;对数据操作的方法和步骤 1.1.2 程序设计语言的种类 第一代语言&#xff08;机器语言&#xff09;&#xff1a;执行效率高、…

C++:类的构造函数与析构函数

目录 一.前言 二.类的构造函数 1.构造函数基本概念与语法细则 2.编译器默认生成的无参构造函数和自定义构造函数 3.构造函数的特性(可重载) 4.关于构造函数的注意事项 5.构造函数的应用示例&#xff1a; 三.类的拷贝构造函数 1.拷贝构造函数基本概念 2.编译器默认生成…

7.Java判断和循环+面试相关力扣算法题详解

提示&#xff1a; 文章目录前言一、顺序结构二、分支语句(1)if语句(2)switch语句*default的位置和省略:*case穿透*switch新特性*switch和if的第三种格式各自的使用场景三、循环结构1.分类2.for循环3.while循环4.for和while的对比:5.for和while循环的区别:6.练习:四、面试时的两…

深入浅出PyTorch_【01】pytorch基础

#深入浅出PyTorch_【01】pytorch基础 2023.01.23 主要内容就是张量 自动求导 pytorch pytorch为深度学习框架&#xff0c;与Tensorflow为最火的两个框架。开始我们的学习 2.1 张量 张量的英文是Tensor&#xff0c;它是PyTorch里面基础的运算单位&#xff0c;与Numpy的ndarra…

数据结构 最短路径课设(源码+实验报告+视频讲解)(不要钱、用了自取)

XIAN TECHNOLOGICAL UNIVERSITY 课程设计报告 实验课程名称 算法与数据结构 专 业&#xff1a; 班 级&#xff1a; 姓 名&#xff1a; 学 号&#xff1a; 实验学时&#xff1a; 指导…