cocos2d-js的test里面实现了很多shader了,但是想要高斯模糊,也就是blur的。c++里面已经是实现,不知道如何在js里面也同时实现。。。查了好多源码,没弄出来,求助各位大神
我也有同样问题,同问
blurSprite:function(sprite,_blurSize)
{
if(sprite)
{
var shader = new cc.GLProgram(“res/blur.vsh”, “res/blur.fsh”);
shader.retain();
shader.addAttribute(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION);
shader.addAttribute(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR);
shader.addAttribute(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS);
shader.link();
shader.updateUniforms();
}
//为节点与子节点添加滤镜
this.blurAllChild(sprite, shader);
//本例中无需设置的参数
// var substract = shader.getUniformLocationForName(“substract”);
// gl.uniform4f( substract, 0,0,0,0);
shader.use();
shader.setUniformsForBuiltins();
var blurSize = shader.getUniformLocationForName("blurSize");
//这个函数由于jsb实现有问题,原本只能实现整数传递,现在在fsh中加入0.0001的参数调整,范围为0-10000
gl.uniform2f(blurSize, _blurSize,_blurSize);
},
blurAllChild:function(sprite,shader){
sprite.shaderProgram = shader;
for(var i=0;i<sprite.getChildrenCount();i++)
{
this.blurAllChild(sprite.children*,shader);
}
}
这个是我整理了很多个问题后整合的,希望对你也有帮助。VSH用其他test的某个例子的,FSH就用它test里面的Blur_example,不过有个问题是每个渲染的对象都是单独的,所以在边缘叠加时会有明显的边界。如果还有其他问题可以再回复我,我尽量帮忙,因为之前也在这问题栽了很久*
适合整个场景么?
你的是哪个版本的呀? gl.uniform2f(blurSize, _blurSize,_blurSize); 我的3.3没有这个函数uniform2f
我当时应该用的是3.2的,那个函数记得应该不是引擎里的,是opengl的内容
“res/blur.vsh”, “res/blur.fsh” 这两个文件能共享下吗?
MARK一下 下次再来
mark
fsh文件
#ifdef GL_ES
precision mediump float;
#endif
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
uniform vec2 blurSize;
void main() {
vec4 sum = vec4(0.0);
sum += texture2D(CC_Texture0, v_texCoord - 0.0004 * blurSize) * 0.05;
sum += texture2D(CC_Texture0, v_texCoord - 0.0003 * blurSize) * 0.09;
sum += texture2D(CC_Texture0, v_texCoord - 0.0002 * blurSize) * 0.12;
sum += texture2D(CC_Texture0, v_texCoord - 0.0001 * blurSize) * 0.15;
sum += texture2D(CC_Texture0, v_texCoord ) * 0.16;
sum += texture2D(CC_Texture0, v_texCoord + 0.0001 * blurSize) * 0.15;
sum += texture2D(CC_Texture0, v_texCoord + 0.0002 * blurSize) * 0.12;
sum += texture2D(CC_Texture0, v_texCoord + 0.0003 * blurSize) * 0.09;
sum += texture2D(CC_Texture0, v_texCoord + 0.0004 * blurSize) * 0.05;
gl_FragColor = sum * v_fragmentColor;
}
vsh文件
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
void main()
{
gl_Position = CC_PMatrix * a_position;
v_fragmentColor = a_color;
v_texCoord = a_texCoord;
}
是不适合整个场景的,我的做法是做了个截屏,然后针对截屏做模糊效果…效率方面会有点问题
马克西 罗德里格斯
mark一个,谢谢iam_ai
做完效果差点感觉