CocosCreator如何实现划过的位置显示纹理


Posted in Javascript onApril 14, 2021

1、项目需求

项目需要有一个功能:是当一个光点走过的路径,这个路径的位置就都亮起来的功能。

2、资料内容

功能类似这位大神的橡皮擦功能:https://forum.cocos.org/t/2-0-8/74246

CocosCreator如何实现划过的位置显示纹理

但是,项目的需求还要经过的路径周围有模糊的外边——也就是从中心到边缘越来越暗。

所以对于借鉴了网上大神的shader例子,类似以下的示例:

CocosCreator如何实现划过的位置显示纹理

在大神的肩膀上做了一些改动,来实现项目的需求。

3、项目示例

以下是我自己的测试项目的示例:

CocosCreator如何实现划过的位置显示纹理

(请忽略这渣渣的画质,懒得装录屏软件了)

4、项目代码

SliderPointLight.ts

const {
	ccclass,
	property
} = cc._decorator;


@ccclass

export default class Follow_spot extends cc.Component {

	@property(cc.Node)

	bg: cc.Node = null;

	material: cc.Material = null;

	center: number[] = [0.5, 0.5];

	testArr: number[] = [];


	onLoad() {

		this.material = this.bg.getComponent(cc.Sprite).getMaterial(0);

		this.material.setProperty('wh_ratio', this.bg.width / this.bg.height);

		this.material.setProperty('center', this.center);


		//js 中最重要是这一句,这里参数是数组长度*数组里向量的维度

		this.material.setProperty('colorArr', new Float32Array(400));

		//这里设置的时候需要把数组里向量的分量展开到一个一维数组

		this.material.setProperty('colorArr', []);


		this.bg.on(cc.Node.EventType.TOUCH_MOVE, this.touchMoveEvent, this);

	}


	touchMoveEvent(evt: cc.Event.EventTouch) {

		this.center[0] = evt.getLocation().x / this.bg.width;

		this.center[1] = 1 - evt.getLocation().y / this.bg.height;

		console.log(this.center);

		this.material.setProperty('center', this.center);

		if (this.testArr.length >= 400) {

			this.testArr.shift();

			this.testArr.shift();

		}

		this.testArr.push(this.center[0]);

		this.testArr.push(this.center[1]);



		//js 中最重要是这一句,这里参数是数组长度*数组里向量的维度

		this.material.setProperty('colorArr', new Float32Array(this.testArr));

		//这里设置的时候需要把数组里向量的分量展开到一个一维数组

		this.material.setProperty('colorArr', this.testArr);

	}

}



SliderPointLight.effect


CCEffect % {

		techniques:

			-passes:

			-vert: vs

		frag: fs

		blendState:

			targets:

			-blend: true

		rasterizerState:

			cullMode: none

		properties:

			texture: {
				value: white
			}

		wh_ratio: {

			value: 1.78,

			editor: {

				tooltip: "宽高比"

			}

		}

		blur: {

			value: 0.35,

			editor: {

				tooltip: "光圈模糊程度"

			}

		}

		radius: {

			value: 0.5,

			editor: {

				tooltip: "光圈半径"

			}

		}

		center: {

			value: [0.5, 0.5],

			editor: {

				tooltip: "光圈起点"

			}

		}

		colorArr: {
			value: [0.5, 0.5, 0.5, 0.5]
		}

	} %



	CCProgram vs % {

		precision highp float;


		#include <cc-global>

		#include <cc-local>


		in vec3 a_position;

		in vec4 a_color;

		out vec4 v_color;


		#if USE_TEXTURE

		in vec2 a_uv0;

		out vec2 v_uv0;

		#endif


		void main() {

			vec4 pos = vec4(a_position, 1);


			#if CC_USE_MODEL

			pos = cc_matViewProj * cc_matWorld * pos;

			#else

			pos = cc_matViewProj * pos;

			#endif


			#if USE_TEXTURE

			v_uv0 = a_uv0;

			#endif


			v_color = a_color;


			gl_Position = pos;

		}

	} %


	CCProgram fs % {


		precision highp float;


		#include <alpha-test>


		in vec4 v_color;


		#if USE_TEXTURE

		in vec2 v_uv0;

		uniform sampler2D texture;

		#endif


		uniform ARGS {

			float radius;

			float blur;

			vec2 center;

			float wh_ratio;

		};


		//effect定义

		uniform Metaball {

			vec4 colorArr[100];

		};


		void main() {

			vec4 o = vec4(1, 1, 1, 0);

			o *= texture(texture, v_uv0);

			o *= v_color;

			float circle = radius * radius;

			for (int i = 0; i < 100; i++) {

				float colorX = colorArr[i].x;

				float colorY = colorArr[i].y;

				float rx = colorX * wh_ratio;

				float ry = colorY;

				float dis = (v_uv0.x * wh_ratio - rx) * (v_uv0.x * wh_ratio - rx) + (v_uv0.y - ry) * (v_uv0.y - ry);


				o.a = smoothstep(circle, circle - blur, dis) + o.a;

			}


			gl_FragColor = o;

		}

	}%

以上就是CocosCreator如何实现划过的位置显示纹理的详细内容,更多关于CocosCreator资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript学习网址备忘
May 29 Javascript
动态调用CSS文件的JS代码
Jul 29 Javascript
探索Emberjs制作一个简单的Todo应用
Nov 07 Javascript
扒一扒JavaScript 预解释
Jan 28 Javascript
解决js图片加载时出现404的问题
Nov 30 Javascript
JS获取复选框的值,并传递到后台的实现方法
May 30 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
Aug 01 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
Mar 15 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
Apr 12 Javascript
深入浅出webpack之externals的使用
Dec 04 Javascript
js tab栏切换代码实例解析
Sep 03 Javascript
js实现div色块拖动录制
Jan 16 Javascript
JS监听Esc 键触发事键
Apr 14 #Javascript
jQuery实现影院选座订座效果
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
JavaScript实现复选框全选功能
js实现上传图片到服务器
Apr 11 #Javascript
Canvas跟随鼠标炫彩小球的实现
Apr 11 #Javascript
uniapp开发小程序的经验总结
You might like
php db类库进行数据库操作
2009/03/19 PHP
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
JavaScript中读取和保存文件实例
2014/05/08 Javascript
Javascript验证上传图片大小[前台处理]
2014/07/18 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
2016/12/18 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
在create-react-app中使用css modules的示例代码
2018/07/31 Javascript
使用elementUI实现将图片上传到本地的示例
2018/09/04 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
python使用PyGame播放Midi和Mp3文件的方法
2015/04/24 Python
python操作mysql数据库
2017/03/05 Python
详解python里使用正则表达式的全匹配功能
2017/10/19 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
《望洞庭》教学反思
2014/02/16 职场文书
交通事故被告答辩状
2015/05/22 职场文书
小兵张嘎观后感
2015/06/03 职场文书
在职证明格式样本
2015/06/15 职场文书
少先队入队仪式主持词
2015/07/04 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
党组织结对共建协议书
2016/03/23 职场文书