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 相关文章推荐
编写自己的jQuery提示框(Tip)插件
Feb 05 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
Dec 03 Javascript
jquery自定义表单验证插件
Oct 12 Javascript
javascript动画之磁性吸附效果篇
Dec 09 Javascript
jQuery轻松实现无缝轮播效果
Mar 22 jQuery
JavaScript递归算法生成树形菜单
Aug 15 Javascript
微信小程序页面缩放式侧滑效果的实现代码
Nov 15 Javascript
React性能优化系列之减少props改变的实现方法
Jan 17 Javascript
vue项目前端错误收集之sentry教程详解
May 27 Javascript
JavaScript实现随机五位数验证码
Sep 27 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
Nov 05 Javascript
详细谈谈JavaScript中循环之间的差异
Aug 23 Javascript
JS监听Esc 键触发事键
Apr 14 #Javascript
jQuery实现影院选座订座效果
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
JavaScript实现复选框全选功能
js实现上传图片到服务器
Apr 11 #Javascript
Canvas跟随鼠标炫彩小球的实现
Apr 11 #Javascript
uniapp开发小程序的经验总结
You might like
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
解析PHP无限级分类方法及代码
2013/06/21 PHP
PHP 伪静态技术原理以及突破原理实现介绍
2013/07/12 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
PHP实现的日历功能示例
2018/09/01 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
微信小程序 wxapp内容组件 icon详细介绍
2016/10/31 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
Angular.js中ng-if、ng-show和ng-hide的区别介绍
2017/01/20 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
vue实现todolist单页面应用
2017/04/11 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
Python自动调用IE打开某个网站的方法
2015/06/03 Python
Python Property属性的2种用法
2015/06/21 Python
python爬虫中get和post方法介绍以及cookie作用
2018/02/08 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
python字符串格式化方式解析
2019/10/19 Python
深入浅析Python 函数注解与匿名函数
2020/02/24 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
HTML5计时器小例子
2013/10/15 HTML / CSS
一站式跨境收款解决方案:Payoneer(派安盈)
2018/09/06 全球购物
美国运动鞋和服装网上商店:YCMC
2018/09/15 全球购物
软件测试面试题
2015/10/21 面试题
EJB发布WEB服务一般步骤
2012/10/31 面试题
创先争优演讲稿
2014/09/15 职场文书
现场施工员岗位职责
2015/04/11 职场文书
七年级生物教学反思
2016/02/20 职场文书
Go遍历struct,map,slice的实现
2021/06/13 Golang