cocos2dx学习笔记(着色器水纹效果)
2014-07-18 17:17
429 查看
着色器
转载 http://www.25kx.com/art/2424495
参考:
测试代码:
除此之外,引擎封装了一个特殊段动作类CCActionGrid3D,里面模拟了一些简单的3d特效。
引擎Demo中的EffectsTest演示了这些3D动作类。
引擎中的水纹效果
在场景中加入
转载 http://www.25kx.com/art/2424495
参考:
// ShaderNode.h #include <iostream> #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]; };
// ShaderNode.cpp #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变量 //绑定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) { // 获取shader程序 loadShaderVertex(vert,frag); //aaaa.png为透明图片 m_texture = CCTextureCache::sharedTextureCache()->addImage("aaaa.png")->getName(); setContentSize(CCSizeMake(1024,768)); 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[12] = { 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); }
//shader.fsh //段着色器 varying vec4 v_color; //背景纹理 uniform sampler2D tex0; precision highp float; //时间 uniform float time; //分辨率 uniform vec2 resolution; const float PI = 3.1415926535897932; //速度 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 = 20.0; const float intence = 400.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); } //main函数 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); }
//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 = CC_MVPMatrix * a_position; }
测试代码:
ShaderNode* shader = ShaderNode::shaderNodeWithVertex("shader.vsh","shader.fsh"); shader->setContentSize(getContentSize()); shader->setColor(ccc4f(1,1,1.0,.5)); this->addChild(shader,2);
除此之外,引擎封装了一个特殊段动作类CCActionGrid3D,里面模拟了一些简单的3d特效。
引擎Demo中的EffectsTest演示了这些3D动作类。
引擎中的水纹效果
在场景中加入
// CCWaves3D::create(时间,晃动网格大小,波动速度,振幅); CCGrid3DAction *grid = CCWaves3D::create(50, ccp(10, 10),40 , 10); this->runAction(grid);
相关文章推荐
- cocos2dx学习笔记(着色器水纹效果)
- 孙鑫VC学习笔记:第十讲画图 创建设置画笔的对话框 并且可以预览效果
- C++/GDI+ 学习笔记(五)——应用实例——半透明的阴影效果
- flash学习笔记:模仿QQ振动效果(转载夏天的树)
- learning jQuery 学习笔记八(+jQuery 1.4.1 API)-- 效果-基本的隐藏、显示和效果
- FLEX学习笔记:元件发光效果——Glow的使用
- ArcIMS学习之 HTML Viewer定制笔记 续四(4.动态效果DHTML)
- 学习笔记---Javascript事件Event、IE浏览器下的拖拽效果
- JQuery 学习笔记(一)超链接和图片提示效果
- accp6.0 《使用javascript增强交互效果》学习笔记ch4 DOM高级编程
- CSS学习笔记-附加篇( CSS仿淘宝首页导航条按钮布局效果)
- D3D学习笔记之七---光照效果
- JQuery学习笔记 实现图片翻转效果和TAB标签切换效果第1/2页
- IPhone开发学习笔记:通过UIView实现动画效果
- Sandy引擎学习笔记: 三维效果初试
- ajax学习笔记之五 模拟google动态提示效果
- CSS学习笔记-附加篇( CSS+JS实现的选项卡效果(html组件))
- jQuery 学习笔记之十五 图片切换效果
- accp6.0 《使用javascript增强交互效果》学习笔记ch3 DOM编程
- FLEX拖拽效果中的DragManager等关键词学习笔记