CocosCreator1.x实现水流动的效果

CocosCreator1.x实现水流动的效果

Cocos Creator版本:1.10.2

运行结果:(H5和原生都支持)
在这里插入图片描述

场景:
在这里插入图片描述

脚本:
HelloWorld.js:

let shader = require(`shader`);cc.Class({extends: cc.Component,properties: {water: cc.Node,waterNormalMap: cc.SpriteFrame,},onLoad() {// 加载所有着色器程序shader.loadShaderPrograms();// 初始化水的着色器程序this._time = 0;this._waterSpeed = 0.1;shader.setGLProgramForNode(`water`, this.water);shader.use(`water`);shader.setUniformTexture(`water`, `normalMap`, this.waterNormalMap.getTexture());shader.setUniformFloat(`water`, `v_offset`, 0);},update(dt) {// 更新水的着色器程序this._time += dt;shader.use(`water`);shader.setUniformFloat(`water`, `v_offset`, (this._time * this._waterSpeed) % 1);},
});

shader.js

let WaterShader = require(`WaterShader`);module.exports = {// 加载所有的着色器程序loadShaderPrograms() {this.createGLProgram(`water`, WaterShader.vert, WaterShader.frag);},///// 存放所有着色器程序gLProgramDict: {},// 创建一个着色器程序createGLProgram(glProgramName, vertStr, fragStr) {let glProgram = this.gLProgramDict[glProgramName];if (glProgram) {cc.error(`${glProgramName}这个glProgram已经注册过了!!!`);return;}glProgram = new cc.GLProgram();if (cc.sys.isNative) {glProgram.initWithString(vertStr, fragStr);} else {glProgram.initWithVertexShaderByteArray(vertStr, fragStr);glProgram.addAttribute(cc.macro.ATTRIBUTE_NAME_POSITION, cc.macro.VERTEX_ATTRIB_POSITION);glProgram.addAttribute(cc.macro.ATTRIBUTE_NAME_COLOR, cc.macro.VERTEX_ATTRIB_COLOR);glProgram.addAttribute(cc.macro.ATTRIBUTE_NAME_TEX_COORD, cc.macro.VERTEX_ATTRIB_TEX_COORDS);}glProgram.link();glProgram.updateUniforms();glProgram.use();this.gLProgramDict[glProgramName] = glProgram;},// 设置指定的着色器程序于指定node上setGLProgramForNode(glProgramName, node) {let glProgram = this.gLProgramDict[glProgramName];if (!glProgram) {cc.error(`${glProgramName}这个glProgram未注册!!!`);return;}let sprite = node.getComponent(cc.Sprite);if (!sprite) {cc.error(`这个node没有Sprite组件啊!!!`);return;}let sgNode = sprite._sgNode;if (cc.sys.isNative) {let glProgramState = cc.GLProgramState.getOrCreateWithGLProgram(glProgram);sgNode.setGLProgramState(glProgramState);} else {sgNode.setShaderProgram(glProgram);}},// 应用指定着色器程序use(glProgramName) {let glProgram = this.gLProgramDict[glProgramName];if (!glProgram) {cc.error(`${glProgramName}这个glProgram未注册!!!`);return;}glProgram.use();},// 为指定着色器程序设置uniform值setUniformFloat(glProgramName, uniformName, uniformValue) {if (typeof uniformValue !== `number`) {cc.error(`setUniformTexture 输入的值不是数字类型 @`, glProgramName, uniformName);return;}this.setUniformCommon(glProgramName, uniformName, uniformValue, `setUniformFloat`, `setUniformLocationWith1f`);},setUniformTexture(glProgramName, uniformName, uniformValue) {if (!(uniformValue instanceof cc.Texture2D)) {cc.error(`setUniformTexture 输入的值不是纹理类型 @`, glProgramName, uniformName);return;}if (cc.sys.isNative) {this.setUniformCommon(glProgramName, uniformName, uniformValue, `setUniformTexture`, `setUniformLocationWith1f`);} else {let glProgram = this.gLProgramDict[glProgramName];if (!glProgram) {cc.error(`${glProgramName}这个glProgram未注册!!!`);return;}let uniformLocation = glProgram.getUniformLocationForName(uniformName);glProgram.setUniformLocationWith1i(uniformLocation, 1);cc.gl.bindTexture2DN(1, uniformValue);}},setUniformCommon(glProgramName, uniformName, uniformValue, jsbFnName, h5fnName) {let glProgram = this.gLProgramDict[glProgramName];if (!glProgram) {cc.error(`${glProgramName}这个glProgram未注册!!!`);return;}if (cc.sys.isNative) {let glProgramState = cc.GLProgramState.getOrCreateWithGLProgram(glProgram);glProgramState[jsbFnName](uniformName, uniformValue);} else {let uniformLocation = glProgram.getUniformLocationForName(uniformName);glProgram[h5fnName](uniformLocation, uniformValue);}}
};

WaterShader.js

module.exports = {vert: `attribute vec4 a_position;attribute vec2 a_texCoord;attribute vec4 a_color;varying vec2 v_texCoord;void main(){gl_Position = CC_PMatrix * a_position;v_texCoord = a_texCoord;}      `,frag: `varying vec2 v_texCoord;uniform sampler2D normalMap;      // 法线贴图uniform float v_offset;           // 法线贴图v坐标偏移// 纠正纹理坐标 (当采样坐标超出范围时,从另一边出来,比如 1.1纠正为0.1,-0.1纠正为0.9 等)vec2 get_fixuv_by_uv(vec2 uv) {if (uv.x > 1.0) {uv.x -= 1.0;}if (uv.x < 0.0) {uv.x += 1.0;}if (uv.y > 1.0) {uv.y -= 1.0;}if (uv.y < 0.0) {uv.y += 1.0;}return uv;}// 获取法向vec3 get_normal() {vec2 uv = v_texCoord + vec2(0, v_offset);uv = get_fixuv_by_uv(uv);return normalize(texture2D(normalMap, uv).xyz * 2.0 - 1.0);  }// 根据 折射方向 获取新的纹理坐标vec2 get_uv_by_refract(vec3 refractVec) {vec2 uv = v_texCoord + vec2(refractVec) * 0.5;return uv;}void main() {// 视点位置vec3 eyePos = vec3(0.5, 0.5, 10.0);                                     // 入射方向vec3 inVec = normalize(vec3(v_texCoord, 0.0) - eyePos);                          // 获取法线vec3 normal = get_normal();                  // 根据 入射方向,法线,折射率 获取折射方向vec3 refractVec = refract(inVec, normal, 0.7);                          // 根据 折射方向 获取新的纹理坐标vec2 v_texCoord2 = get_uv_by_refract(refractVec);  // 最终颜色gl_FragColor = texture2D(CC_Texture0, v_texCoord2);                     }`,
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫xpath教程_使用 Xpath 进行爬虫开发

使用 Xpath 进行爬虫开发 Xpath( XML Path Language, XML路径语言)&#xff0c;是一种在 XML 数据中查找信息的语言&#xff0c;现在&#xff0c;我们也可以使用它在 HTML 中查找需要的信息。 既然谈到 Xpath 是一门语言&#xff0c;当然它就会有自己的一些特定的语法。我们这里…

java使用泛型后消除泛型_如何以及何时使用泛型

java使用泛型后消除泛型本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的旅程&#xff01; 在这里查看 &a…

用C语言写烟花,给心中的那个人看!

点击蓝字关注我们前言程序员不懂浪漫? 大错特错&#xff01;今天就让你们看看什么是程序员的浪漫&#xff01;你向窗外看烟花&#xff0c;我在窗边看你&#xff0c;这时&#xff0c;你比烟花好看的多&#xff0c;你的眼眸倒映满天的烟火&#xff0c;我的瞳孔倒映你温柔的脸庞…

js实现阶乘算法的三种方法

js实现阶乘算法的三种方法// 非递归写法 function f(n) {if (0 n) {return 1;}let res 1;for (let i 1; i < n; i) {res * i;}return res; }// 递归写法 function g(n) {if (0 n) {return 1;}return n*g(n-1); }// 动态规划写法 let dp []; function h(n) {if (n < …

手把手教你做一个线程池--C语言版

点击蓝字关注我们1、线程池原理我们使用线程的时候就去创建一个线程&#xff0c;这样实现起来非常简便&#xff0c;但是就会有一个问题&#xff1a;如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&#xff0c;这样频繁创建线程就会大大降低…

oracle 48小时内_缺血性脑梗死后48小时内使用阿替普酶能够降低脑损伤程度

一项刊登在影响因子7.6杂志Neurology上题为“Effect of IV alteplase on the ischemic brain lesion at 24–48 hours after ischemic stroke”的研究报告中&#xff0c;来自爱丁堡大学的科学家们发现&#xff0c;alteplase与病变可视性的短期进展降低相关。在荟萃分析中&#…

基于按位与的 就散策略_比较散列策略

基于按位与的 就散策略总览 编年史有很多用于哈希的实现&#xff0c;包括City和Murmur。 它也有自己的香草哈希&#xff0c;但是如何测试呢&#xff1f; 什么是香草哈希&#xff1f; Vanilla Hash设计得尽可能简单&#xff0c;并且针对Orthogonal Bits测试进行了优化&#xff…

js实现数组降维算法[不准用Array.prototype.flat的api]

js实现数组降维算法[不准用Array.prototype.flat的api]// target要降维的元素&#xff0c;n降维阶数&#xff0c;newArr存储结果的新数组 function f(target, n 1, newArr []) {if (n < 0) {newArr.push(target);return;}if (!Array.isArray(target)) {newArr.push(target…

python编程能力等级测试_青少年编程能力等级测评-Python编程二级试卷

青少年编程能力等级测评 Python 编程二级试卷 一、单项选择题&#xff08;共 20 题&#xff0c;每题分&#xff0c;共 50 分&#xff09; 1. 运行下方代码段&#xff0c;输出的结果是&#xff08; &#xff09; 。 a() print(type(a)) A &#xff0e;&#xff1b; B &#xff0…

MySQL夺命16问,你能坚持到第几问?

点击蓝字关注我们1、数据库三大范式是什么&#xff1f;第一范式&#xff1a;每个列都不可以再拆分。第二范式&#xff1a;在第一范式的基础上&#xff0c;非主键列完全依赖于主键&#xff0c;而不能是依赖于主键的一部分。第三范式&#xff1a;在第二范式的基础上&#xff0c;非…

美图手机投射功能在哪_在Java 8中进行投射(还有其他功能?)

美图手机投射功能在哪将实例转换为设计不良的类型。 尽管如此&#xff0c;在某些情况下没有其他选择。 从第一天开始&#xff0c;执行此功能就已成为Java的一部分。 我认为Java 8提出了对这种古老技术稍加改进的需求。 静态铸造 Java中最常见的转换方法如下&#xff1a; 静态…

js箭头函数和普通函数区别

js箭头函数和普通函数区别实验环境&#xff1a;nodejs v12.16.1 箭头函数不能作为构造函数&#xff0c;而普通函数可以 箭头函数没有原型&#xff0c;而普通函数有 箭头函数return可以省略语句块。(如果>右边不是语句块&#xff0c;则代表return右边的表达式或对象) 箭…

git 更新_[技术分享T.191212]GitLab使用方法及git命令常见问题(不断更新)

该文章用于记录一些GitLab的使用指南&#xff0c;以及在实际版本控制过程中遇到的问题及解决方法&#xff0c;会尽量及时的更新~GitLab简介&#xff1a;GitLab和GitHub很相似都属于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来…

记一次开发实战-对提供接口的C/C++进行二次开发

点击蓝字关注我们一、需求描述我有一个USB5538的库和头文件&#xff0c;并通过头文件提供了接口&#xff0c;我想把它更改一下&#xff0c;编译成python可调用的模块。二、创建工程及其目录1、创建空项目2、创建目录三、创建文件1、复制文件并添加2、添加新文件并写入四、环境配…

C++是如何实现多态的

C是如何实现多态的结论&#xff1a;C通过虚函数来实现多态的&#xff0c;根本原因是派生类和基类的虚函数表的不同。 构成多态的必要条件有如下3点&#xff1a; 存在继承关系基类存在虚函数&#xff0c;且派生类有相同原型的函数遮蔽它存在基类类型的指针指向派生类对象&…

python回声程序 一行代码_python实现的比较完成的带声音的摩斯码翻译程序的代码...

将写代码过程较好的一些代码段做个珍藏&#xff0c;如下代码段是关于python实现的比较完成的带声音的摩斯码翻译程序的代码&#xff0c;希望能对各朋友有所用处。 import pygame import time import sys CODE {A: .-, B: -..., C: -.-., D: -.., E: ., F: ..-., G…

jooq 生成数据库_jOOQ类型安全数据库查询教程

jooq 生成数据库课程大纲 SQL是用于关系数据库查询的功能强大且表达能力强的语言。 SQL已建立&#xff0c;标准化并且几乎不受其他查询语言的挑战。 但是&#xff0c;在Java生态系统中&#xff0c;自JDBC以来&#xff0c;几乎没有采取任何相关措施来更好地将SQL集成到Java中。 …

C语言实现通讯录附详细代码(动态+静态)

点击蓝字关注我们一、通讯录简介实现一个通讯录&#xff1b;通讯录可以用来存储1000个人的信息&#xff0c;每个人的信息包括&#xff1a;姓名、性别、年龄、电话、住址提供方法&#xff1a;添加联系人信息删除指定联系人信息查找指定联系人信息修改指定联系人信息显示所有联系…

Lua协程Coroutine是什么

Lua协程Coroutine是什么协程和线程不同&#xff1a; 同一时刻&#xff0c;一个多线程程序可以用多个线程同时执行&#xff1b;而协程只能有一个在执行多线程是抢占式的&#xff1b;而协程是非抢占式的&#xff0c;只有协程显示被挂起&#xff0c;才会被挂起 协程和线程的相同…

请使用复选框选择_使用可选是可选的

请使用复选框选择在上周“收藏中的可选内容”的文章发表之后&#xff0c;我不禁要多讲一些关于同一只野兽的事情。 更多细节。 最初由Google Guava引入并后来包含在Java 8软件包中的Optionial类只是包装可选对象的包装器。 从包装对象存在或包装中没有对象的意义上讲&#xff…