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 利用StringBuffer类提升+=拼接字符串效率
Nov 24 Javascript
JavaScript?Apple设备检测示例代码
Nov 15 Javascript
jquery中map函数与each函数的区别实例介绍
Jun 23 Javascript
一个JavaScript处理textarea中的字符成每一行实例
Sep 22 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
Aug 13 Javascript
jQuery实现的调整表格行tr上下顺序
Jan 10 Javascript
谈谈第三方App接入微信登录 解读
Dec 27 Javascript
详解Vue-cli webpack移动端自动化构建rem问题
Apr 07 Javascript
layui中使用jquery控制radio选中事件的示例代码
Aug 15 jQuery
vue单文件组件lint error自动fix与styleLint报错自动fix详解
Jan 08 Javascript
详解基于Vue/React项目的移动端适配方案
Aug 23 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
Sep 18 Javascript
JS监听Esc 键触发事键
Apr 14 #Javascript
jQuery实现影院选座订座效果
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
JavaScript实现复选框全选功能
js实现上传图片到服务器
Apr 11 #Javascript
Canvas跟随鼠标炫彩小球的实现
Apr 11 #Javascript
uniapp开发小程序的经验总结
You might like
通过5个php实例细致说明传值与传引用的区别
2012/08/08 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
php类自动加载器实现方法
2015/07/28 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
JavaScript判断按钮被点击的方法
2015/12/13 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
[38:39]完美世界DOTA2联赛循环赛 IO vs GXR BO2第二场 11.04
2020/11/05 DOTA
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
python中如何写类
2020/06/29 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
毕业生文员求职信
2013/11/03 职场文书
计算机网络工程专业职业生涯规划书
2014/03/10 职场文书
学校运动会广播稿
2014/10/11 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
催款律师函范文
2015/05/27 职场文书
预备党员考察意见范文
2015/06/01 职场文书
如何利用python实现Simhash算法
2022/06/28 Python