我不太懂shader和glsl,下面代码是我参考网上然后写出来的,线上项目使用中,大家可以直接cpoy拿去用,其中最关键的代码是:texCoord = floor(texCoord * u_count) / u_count; 这行。感谢各路大神的无私奉献。
-------------------------------------------------------------------------------------------------------
--
-- 马赛克效果
--
local EffectMosaic = class("mosaic")
function EffectMosaic:ctor()
wwlog("EffectMosaic:ctor()")
end
--[[
param = {
["attachToSprite"] = sprite, -- 效果要附着的图片
["mosiacCount"] = mosiacCount, -- 图片里每行的马赛克方块个数,浮点数,值越大,颗粒越小
}
--]]
function EffectMosaic:attachToSprite(param)
-- 顶点着色器
local vert = [[
// 这三个是cocos内置的变量
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;
// 自己定义的用于交换的变量,传入值给片段着色器使用
varying lowp vec4 v_fragmentColor;
varying highp vec2 v_texCoord;
void main(void)
{
gl_Position = CC_PMatrix * a_position;
// 将值通过 varying 变量传给片段着色器使用
v_fragmentColor = a_color;
v_texCoord = a_texCoord;
}
]]
-- 片段着色器
local frag = [[
// 自己定义的用于程序传入shader中的变量
uniform float u_count;
// 自己定义的用于交换的变量,接收顶点着色器传过来的值
varying lowp vec4 v_fragmentColor;
varying highp vec2 v_texCoord;
void main(void)
{
// 因为不能对 varying 变量进行直接操作,这里重新定义一个局部变量用于操作
vec2 texCoord = v_texCoord;
texCoord = floor(texCoord * u_count) / u_count;
gl_FragColor = texture2D(CC_Texture0, texCoord) * v_fragmentColor;
}
]]
-- 1.创建glProgram
local glProgram = cc.GLProgram:createWithByteArrays(vert, frag)
-- 注意下面的2和3这两步,如果不需要外部设置值给shader,那么可以不用
-- 2.获取glProgramState
local glProgramState = cc.GLProgramState:getOrCreateWithGLProgram(glProgram)
-- 3.设置属性值
glProgramState:setUniformFloat("u_count", param.mosiacCount or 10)
-- 4,最终设置
local sprite = param.attachToSprite
if (nil ~= sprite) then
sprite:setGLProgram(glProgram)
end
end
return EffectMosaic
-------------------------------------------------------------------------------------------------------