[原]quick2.25让描边闪起来

本文教大家如何使用shader让描边动起来。实质就是间隔一定时间改变描边的颜色。难点:如何通过程序把颜色传给shader。想在quick2.25里面尝试的朋友,参考quick2.25精灵变灰配置一下环境。

一、shader代码。都是cocos官方自带的

//outLiner.vsh
#ifdef GL_ES
    varying lowp vec4 v_fragmentColor;
    varying mediump vec2 v_texCoord;
#else
    varying vec4 v_fragmentColor;
    varying vec2 v_texCoord;
#endif
    attribute vec4 a_position;
    attribute vec2 a_texCoord;
    attribute vec4 a_color; 

    void main()
    {
        gl_Position = CC_MVPMatrix * a_position;
        v_fragmentColor = a_color;
        v_texCoord = a_texCoord;
    }

//outLiner.fsh

#ifdef GL_ES
    precision mediump float;
#endif
    varying vec2 v_texCoord;
    varying vec4 v_fragmentColor;
    uniform vec3 u_outlineColor;
    uniform float u_threshold;
    uniform float u_radius;
    uniform sampler2D CC_Texture0;

    void main()
    {
        float radius = u_radius;
        vec4 accum = vec4(0.0);
        vec4 normal = vec4(0.0);
        normal = texture2D(CC_Texture0, vec2(v_texCoord.x, v_texCoord.y));
//获取上下左右四个像素的纹理
        accum += texture2D(CC_Texture0, vec2(v_texCoord.x - radius, v_texCoord.y - radius));
        accum += texture2D(CC_Texture0, vec2(v_texCoord.x + radius, v_texCoord.y - radius));
        accum += texture2D(CC_Texture0, vec2(v_texCoord.x + radius, v_texCoord.y + radius));
        accum += texture2D(CC_Texture0, vec2(v_texCoord.x - radius, v_texCoord.y + radius));

        accum *= u_threshold;
        accum.rgb =  u_outlineColor * accum.a;
        accum.a = 0.0;

        normal = ( accum * (1.0 - normal.a)) + (normal * normal.a);

        gl_FragColor = v_fragmentColor * normal;
    }

二、shader调用

local color = {{255,0,0},{0,255,0},{0,0,255}}
local index =1

self.sp = display.newSprite("img_248.png"):addTo(self)
self:outLiner(self.sp)

local scheduler =  require("framework.scheduler")
scheduler.scheduleGlobal(handler(self,self.changeColor),0.1) --每间隔0.1秒改变一下颜色

function MainScene:changeColor()
    if index>3 then
        index = 1
    end
    local color = color[index]
    local p = self.sp:getShaderProgram()
    local outlineColor = p:getUniformLocationForName("u_outlineColor"); --对应ps里面的u_outlineColor变量
    p:use() --注意必须加这个 否则不管用
    p:setUniformLocationWith3fv(outlineColor,color,1) -- 给u_outlineColor赋值
    index = index +1
end
--实质上getUniformLocationForName里面调用opengl的glGetUniformLocation(m_uProgram, name);--setUniformLocationWith3fv调用opengl 的glUniform3iv();--作用就是给shader里面的uniform变量赋值
function MainScene:outLiner(node)
    local pProgram = CCGLProgram:createWithFilenames("res/shader/outLiner.vsh","res/shader/outLiner.fsh")
    pProgram:addAttribute("a_position", 0)
    pProgram:addAttribute("a_color", 1)
    pProgram:addAttribute("a_texCoord", 2)
    pProgram:link()
    pProgram:updateUniforms()
    local threshold = pProgram:getUniformLocationForName("u_threshold");
    pProgram:setUniformLocationWith1f(threshold,1.75)
    local radius = pProgram:getUniformLocationForName("u_radius");
    pProgram:setUniformLocationWith1f(radius,0.001)
    node:setShaderProgram(pProgram)
end

特别注意:导出的setUniformLocationWith3fv函数,传的第二个参数有问题,需要做如下修改:(大家以后从lua中传数组给C++ 也可以参考此方法)

附上最终效果图:

时间: 2024-12-03 13:26:31

[原]quick2.25让描边闪起来的相关文章

[原]quick2.25添加spine骨骼动画

被美术妹子的狂喷之后,此文诞生!本来打算做科目一试题的,结果闹了这个了,祈祷苍天让我过吧! spine源码下载: http://pan.baidu.com/s/1qWuoSri 密码: 7ves 播放效果: 1.去下载spine的runtime库 地址:https://github.com/EsotericSoftware/spine-runtimes 文件结构 二.把spine-c下的include和src 统一整理到spine文件夹,将spine-cocos2d-x/2/src/spine下

[原]quick2.25精灵变灰

由于quick2.25没有导出shader相应的接口,所以2.25无法直接使用shader. 本文简单介绍如何导出相应接口,同时教大家使用shader 实现精灵变灰 一.编写静态函数,以供导出使用(直接参考3.2版本的) 2.25的GLProgram是对应操作shader的类. 在GLProgram.h声明以下两个函数 static CCGLProgram* createWithByteArrays(const char* vShaderByteArray, const char* fShade

2.Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)

转载自:https://blog.csdn.net/leshami/article/details/6105327 FLASHBACK DROP 特性允许在不丢失任何数据库的情况下将指定的表恢复至其被删除的时间点,并保持数据库为当前状态.闪回删除并不是真正的删除表,而是把该表重命名并放入回收站,类似于Windows的回收站一样.当某个活动对象需要使用该表所占用的空间时,该表才会被真正删除.只要空间未被复用,该表即可恢复.本文主要讲述了FLASHBACK DROP特性以及闪回特性中回收站(RECY

CoreOnLineTransactionService.java

package com.nantian.sms.service; import java.math.BigDecimal;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.List;i

python核心编程--笔记

python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行字符串心事提交的python脚本 1.8 file   以给定的文件运行python脚本 2 _在解释器中表示最后

最大子段和问题Java实现

最大子段和问题 一.问题描述 给定长度为n的整数序列,a[1...n], 求[1,n]某个子区间[i , j]使得a[i]+-+a[j]和最大. 例如(-2,11,-4,13,-5,2)的最大子段和为20,所求子区间为[2,4],子序列是(11,-4,13),最大子段和是20. 二.解决方法 1.穷举法(初级版):SimpleAlgorithmOfMaximumIntervalSumLow.java 最容易理解, 用三重循环,可遍历所有子区间,一个表示起始位置,一个表示终点位置,一个求当前子序列

移动端web开发技巧

常见问题 1.移动端如何定义字体font-family 三大手机系统的字体: iOS 系统 默认中文字体是Heiti SC 默认英文字体是Helvetica 默认数字字体是HelveticaNeue 无微软雅黑字体 Android 系统 默认中文字体是Droidsansfallback 默认英文和数字字体是Droid Sans 无微软雅黑字体 Winphone 系统 默认中文字体是Dengxian(方正等线体) 默认英文和数字字体是Segoe 无微软雅黑字体 各个手机系统有自己的默认字体,且都不

移动Web开发技巧

META相关 1. 添加到主屏后的标题(IOS) <meta name="apple-mobile-web-app-title" content="标题"> 2. 启用 WebApp 全屏模式(IOS) 当网站添加到主屏幕后再点击进行启动时,可隐藏地址栏(从浏览器跳转或输入链接进入并没有此效果) <meta name="apple-mobile-web-app-capable" content="yes" /

iOS开发——图层OC篇&amp;Quartz 2D各种绘制实例

Quartz 2D各种绘制实例 首先说一下,本篇文章只是介绍怎么使用Quartz 2D绘制一些常用的图像效果,关于Quartz和其他相关技术请查看笔者之前写的完整版(Quartz 2D详解) 一:画线 1 // 1.获取跟当前View相关联的layer上下文(画板) 2 // 总结:目前获取的所有上下文都是以UIGraphics开头 3 // CGContextRef:上下文类型 4 // CG:CoreGraphics Ref:引用 5 CGContextRef ctx = UIGraphic