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背投广告代码的完善
Apr 08 Javascript
Javascript 键盘事件的组合使用实现代码
May 04 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
Dec 18 Javascript
浅析2种JavaScript继承方式
Dec 04 Javascript
深入浅析JavaScript中with语句的理解
May 12 Javascript
微信小程序 地图(map)实例详解
Nov 16 Javascript
Javascript实现基本运算器
Jul 15 Javascript
如何解决webpack-dev-server代理常切换问题
Jan 09 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
Jul 26 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
Mar 07 Javascript
微信小程序间使用navigator跳转传值问题实例分析
Mar 27 Javascript
js实现电灯开关效果
Jan 19 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删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
PHP中if和or运行效率对比
2014/12/12 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
重写javascript中window.confirm的行为
2012/10/21 Javascript
javascript操作css属性
2013/12/30 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
jquery自定义表格样式
2015/11/23 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
AngularJS延迟加载html template
2016/07/27 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
仓管员岗位职责范文
2013/11/08 职场文书
测试工程师岗位职责
2013/11/28 职场文书
局机关干部群众路线个人对照检查材料思想汇报
2014/10/05 职场文书
违纪开除通知书
2015/04/25 职场文书
保护地球的宣传语
2015/07/13 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript
python 多态 协议 鸭子类型详解
2021/11/27 Python
APP界面设计技巧和注意事项
2022/04/29 杂记