位置: 编程技术 - 正文

在cocos2dx中实现水波滤镜(cocos2dx schedule)

编辑:rootadmin

推荐整理分享在cocos2dx中实现水波滤镜(cocos2dx schedule),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:cocos2dx schedule,cocos2dx运行原理,cocos2djs,cocos2djs,cocos2d schedule,cocos2dx schedule,cocos2dx schedule,cocos2dx怎么用,内容如对您有帮助,希望把文章链接给更多的朋友!

因为工作原因,开始转向cocos2d-x开发方向了。自然的,凭着之前引擎的经验偏向底层渲染研究。

在此期间看了两本书《cocos2d-x 权威指南》《cocos2d-x 高级开发教程》不得不说,第一本书完全是API介绍,也许适合新手入门,但是于我,只是烂书一本。第二本书还是不错的,最后的项目有全套源码,教程的风&#;也很有我的风&#;,哈哈,就是文章中不一定贴全代码,只贴核心,后期还要自己领会补全。

言归正传,在 《高级开发教程》 中有一篇是实现海底水纹效果的文章,里面代码不全,且代码和Shader并没有对应起来,于是我决定按照自己思路来将其补全,并贴上完整源码。

先上效果图:动态GIF图地址:

首先创建一个 ShaderNode.h 类并继承CCNode

#ifndef __FishingJoy_ShaderNode__#define __FishingJoy_ShaderNode__#include "cocos2d.h"USING_NS_CC;class ShaderNode : public CCNode{public: ShaderNode(); bool initWithVertex(const char *vert, const char *frag); void loadShaderVertex(const char *vert, const char *frag); virtual void update(float delta); virtual void setContentSize(const CCSize& var); virtual void setColor(ccColor4F newColor); virtual void draw(); static ShaderNode* shaderNodeWithVertex(const char *vert, const char *frag);private: GLuint m_uniformResolution, m_uniformTime, m_uniformTex0; GLuint m_attributeColor, m_attributePosition; float m_time; ccVertex2F m_resolution,m_center; GLuint m_texture; GLfloat color[4];};#endif

之后创建ShaderNode.cpp 并实现 ShaderNode.h 中的各方法

#include "ShaderNode.h"ShaderNode::ShaderNode(){}ShaderNode* ShaderNode::shaderNodeWithVertex(const char *vert, const char *frag){ ShaderNode* shader = new ShaderNode(); if(shader && shader->initWithVertex(vert,frag)) { shader->autorelease(); return shader; } CC_SAFE_DELETE(shader); return NULL;}void ShaderNode::loadShaderVertex(const char *vert, const char *frag){ CCGLProgram* shader = new CCGLProgram(); shader->initWithVertexShaderFilename(vert, frag); //载入着色器程序 //绑定attribute变量 shader->addAttribute("a_position", 0); shader->addAttribute("a_color", 1); shader->link(); //获取attribute变量标识 m_attributeColor = glGetAttribLocation(shader->getProgram(), "a_color"); m_attributePosition = glGetAttribLocation( shader->getProgram(), "a_position"); shader->updateUniforms(); //获取uniform变量标识 m_uniformResolution = glGetUniformLocation(shader->getProgram(), "resolution"); m_uniformTime = glGetUniformLocation(shader->getProgram(), "time"); m_uniformTex0 = glGetUniformLocation(shader->getProgram(), "tex0"); //使用着色器程序 this->setShaderProgram(shader); shader->release(); }void ShaderNode::setColor(ccColor4F newColor){ color[0] = newColor.r; color[1] = newColor.g; color[2] = newColor.b; color[3] = newColor.a;}bool ShaderNode::initWithVertex(const char *vert, const char *frag){ loadShaderVertex(vert,frag); m_texture = CCTextureCache::sharedTextureCache()->addImage("HelloWorld.png")->getName(); setContentSize(CCSizeMake(,)); setColor(ccc4f(0.5,0.5,1,1)); m_time = 0; scheduleUpdate(); return true;}void ShaderNode::update(float dt){ m_time &#;= dt;}void ShaderNode::setContentSize(const CCSize& var){ CCNode::setContentSize(var); m_resolution = vertex2(getContentSize().width,getContentSize().height); m_center.x = m_resolution.x/2; m_center.y = m_resolution.y/2;}void ShaderNode::draw(){ CC_NODE_DRAW_SETUP(); //传递uniform变量 CCGLProgram* shader = getShaderProgram(); shader->setUniformLocationWith2f(m_uniformResolution, m_resolution.x, m_resolution.y); shader->setUniformLocationWith1i(m_uniformTex0, 0); glUniform1f(m_uniformTime, m_time); //获取attribute变量 CCSize size = this->getContentSize(); float w = size.width; float h = size.height; ccGLBindTexture2D(m_texture); //绑定纹理到槽位 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, w, h, 0); //截取屏幕数据到纹理 glEnableVertexAttribArray(m_attributePosition); glDisableVertexAttribArray(m_attributeColor); //传递attribute变量 GLfloat vertices[] = { 0, 0, //左下0 w, 0, //右下1 w, h, //右上2 0, 0, //左下0 0, h, //左上3 w, h, //右上2 }; glVertexAttribPointer(m_attributePosition, 2, GL_FLOAT, GL_FALSE, 0, vertices); glVertexAttrib4fv(m_attributeColor, color); //绘制 glDrawArrays(GL_TRIANGLES, 0, 6); }在cocos2dx中实现水波滤镜(cocos2dx schedule)

之后在场景类中添加ShaderNode 即可

ShaderNode* shader = ShaderNode::shaderNodeWithVertex("shader.vsh","shader.fsh"); shader->setContentSize(getContentSize()); shader->setColor(ccc4f(1,1,1.0,.5)); this->addChild(shader,2);

shader.vsh 和 shader.fsh 可以从网络中得到,就是glsl文件shader.vsh 的内容为

attribute vec4 a_color; attribute vec4 a_position; varying vec4 v_color; uniform mat4 u_MVPMatrix; void main() { v_color = a_color; gl_Position = u_MVPMatrix * a_position; }

shader.fsh 的内容为

5varying vec4 v_color; uniform sampler2D tex0; precision highp float; uniform float time; uniform vec2 resolution; const float PI = 3.; const float speed = 0.2; const float speed_x = 0.3; const float speed_y = 0.3; const float intensity = 3.0; const int steps = 8; const float frequency = 4.0; const int angle = 7; const float delta = .0; const float intence = .0; const float emboss = 0.3; float col(vec2 coord) { float delta_theta = 2.0 * PI / float(angle); float col = 0.0; float theta = 0.0; for (int i = 0; i < steps; i&#;&#;) { vec2 adjc = coord; theta = delta_theta * float(i); adjc.x &#;= cos(theta)*time*speed &#; time * speed_x; adjc.y -= sin(theta)*time*speed - time * speed_y; col = col &#; cos((adjc.x*cos(theta) - adjc.y*sin(theta)) *frequency)*intensity; } return cos(col);} void main(void) { vec2 p = (gl_FragCoord.xy) / resolution.xy, c1 = p, c2 = p; float cc1 = col(c1); c2.x &#;= resolution.x/delta; float dx = emboss*(cc1-col(c2))/delta; c2.x = p.x; c2.y &#;= resolution.y/delta; float dy = emboss*(cc1-col(c2))/delta; c1.x &#;= dx; c1.y &#;= dy; float alpha = 1.&#;dot(dx,dy)*intence; gl_FragColor = texture2D(tex0,c1)*(alpha) *v_color*(alpha); }

github地址为: u_MVPMatrix我们在cocos2d-x中使用它的时候,需要把 CC_MVPMatrix 赋&#;给 u_MVPMatrix或者直接把 u_MVPMatrix 删除,替换成 CC_MVPMatrixlike this

attribute vec4 a_color; attribute vec4 a_position; varying vec4 v_color; void main() { v_color = a_color; gl_Position = CC_MVPMatrix * a_position; }

cocos2d-x 在创建 GLProgram 的时候,会自动在 GLSL的文件之前加上 cocos2d-x 自身需要的参数

const GLchar *sources[] = {#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN && CC_TARGET_PLATFORM != CC_PLATFORM_LINUX && CC_TARGET_PLATFORM != CC_PLATFORM_MAC) (type == GL_VERTEX_SHADER ? "precision highp float;n" : "precision mediump float;n"),#endif "uniform mat4 CC_PMatrix;n" "uniform mat4 CC_MVMatrix;n" "uniform mat4 CC_MVPMatrix;n" "uniform vec4 CC_Time;n" "uniform vec4 CC_SinTime;n" "uniform vec4 CC_CosTime;n" "uniform vec4 CC_Random;n" "//CC INCLUDES ENDnn", source, };

that’s all.本文对于原书教程补充的地方如下修改 shader.vsh 替换 u_MVPMatrix 为 CC_MVPMatrix删除 ShaderNode.cpp 中全部的 m_uniformCenter 的相关代码, m_uniformCenter 在Shader中并没有该字段,没有补完的意义添加 ShaderNode.cpp 构造函数及SetColor方法修改 ShaderNode.h 中 update 的参数

上文来自:

cocos2dx3.6 弹出对话框的实现 头文件:////PopAlertDialog.h//macstudycocos2dx////CreatedbyWangWeion/6/8.////#ifndef__macstudycocos2dx__PopAlertDialog__#define__macstudycocos2dx__PopAlertDialog__#pragmaonce#includecocos2d.h#in

设置glblendfunc出现黑框 发现用粒子编辑器设置粒子效果的混合模式,放到程序里会出现偏差,比如黑框等。搜了下,发现原因是:DestBlendFunc只接受以下8个参数:GL_ZEROGL_ONEGL_SR

cocos2dx多个精灵调用runAction()方法执行组合动作,只有最后一个精灵有效的问题 问题代码如下//将MoveTo和RotateTo两个动作转换成FiniteTimeAction类型FiniteTimeAction*MVto=(FiniteTimeAction*)(MoveTo::create(2.0,Vec2(,)));FiniteTimeAction*ROto=(FiniteTimeAction*

标签: cocos2dx schedule

本文链接地址:https://www.jiuchutong.com/biancheng/368365.html 转载请保留说明!

上一篇:Cocos2d-3.x_在Lua中使用cjson库解析json(cocoscreator lua)

下一篇:cocos2dx3.6 弹出对话框的实现(cocos2djs)

  • 一般纳税人优惠政策最新2022标准
  • 抄税是什么意思谁做的事情
  • 电子税务局如何删除办税人员
  • 公账转法人私账的注意事项
  • 固定资产税前一次性扣除
  • 外购无形资产的摊销额计入什么费用
  • 公司替个人交的水电费计入哪里了
  • 营业外支出影响利润
  • 个人挂靠利润如何提取
  • 息税折旧摊销前利润是什么意思
  • 外购低值易耗品支付价款16万元
  • 汇款手续费的会计科目
  • 财务报表分析方法有
  • 工会经费如何做会计分录科目
  • 应交税费减免税款
  • 在建工程完工验收报告
  • 中国增值税发展史
  • 管理费用属于什么现金流量项目
  • 公允价值变动增加在借方还是贷方
  • 怎样处理教育费附加会计分录?
  • 企业购入交易性金融资产支付的交易费用
  • 企业实缴出资额怎么查
  • 小规模纳税人减按1%如何填报申报表
  • 派遣公司乱扣钱没人管吗?
  • 临时使用自建商品房是否需要缴纳房产税?
  • 补领以前月份的工资如何计算个人所得税?
  • 无偿捐赠增值税计算公式
  • 关于积分的三种账务处理方法
  • 其它权益工具投资处置时其他综合收益转那
  • 华为应用市场被锁了,怎么解除密码
  • 在win7中如何设置屏幕保护程序
  • php 字符串函数
  • PHP:Memcached::getAllKeys()的用法_Memcached类
  • 招待费的范畴
  • 转让股权企业所得税怎么计算
  • 公司为实习生买保险列支什么科目?
  • 计提本月固定资产折旧会计科目
  • 投影仪哪种光源亮度高
  • 加工取得的存货和委托加工的区别
  • php exit绕过
  • 企业所得税申报表在哪里打印
  • 费用报销单怎样粘贴
  • roc曲线绘制r语言
  • c++图像二值化
  • 现金银行本票的签发人是谁
  • 其他收益算营业收入吗
  • 融资租赁各方
  • 如何恢复sql数据库
  • 年金保险是指什么保险
  • 什么是全面一次性奖金
  • 个人所得税申请退税多久能到账
  • 未分配利润可以挂多久
  • 带薪休假工资怎么扣税的
  • 福利费为什么不可以抵扣进项税
  • 收购股权如何做分录
  • 签合同的名称和内容
  • 实缴制下未到位资金
  • 软件折旧从什么时候算
  • 资产减值损失会计处理
  • 债务现金流量是正还是负
  • 购买商品发生的费用计入
  • 企业利润怎么算出来的
  • sqlserver多表查询 索引
  • 电脑怎么安装安全控件
  • window装机必备应用
  • Win7 64位旗舰版系统打开应用程序提示“发生未知的软件异常0xc06d007e”的解决方法
  • ubuntu系统管理
  • ubuntu安装visual studio2019
  • linux awk -v
  • linux添加新硬盘后网卡无法启动
  • 苹果Mac OS X通知中心提示音怎么修改 OS X通知中心提示音更换方法图解
  • fdisk硬盘分区工具
  • 文件夹windows
  • 程序员用linux可以干什么
  • 简单射击原理
  • unity 子弹效果 粒子
  • 客户端名称 android-
  • python3连接pg执行命令
  • 四川省税务局发票
  • 无经营公司
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设