cocos2d shader 暂存

这篇博客探讨了如何在Cocos2d项目中利用Lua脚本进行Shader的配置和管理,详细介绍了fsh(fragment shader)和vsh(vertex shader)的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lua

    local prog = cc.GLProgram:create("test.vsh","test.fsh")
    prog:link()
    prog:updateUniforms()
    local progStat= cc.GLProgramState:create(prog)
 
 
 
    --[[]]
    local sp = cc.Sprite:create("123123.png")
                        :pos(display.cx, display.cy)
                        :addTo(self)
                        :setScale(1)
                        :setAnchorPoint(0.5, 0.5)

    sp:setGLProgram(prog)
    sp:setGLProgramState(progStat)

    self:schedule(function()
        local pSize = sp:getContentSize()
        size.x = 1 / pSize.width
        size.y = 1 / pSize.height

        progStat:setUniformVec2(prog:getUniform("blurSize").location, size);
        prog:updateUniforms()

    end, 1)

fsh

/*
#ifdef GL_ES
precision mediump float;
#endif

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;

uniform vec2 blurSize;

vec4 SingleBlur(vec2 BlurSize)
{
	vec4 sum = vec4(0.0);
	sum += texture2D(CC_Texture0, v_texCoord - 0.0001 * BlurSize) * 0.33;
	sum += texture2D(CC_Texture0, v_texCoord) * 0.33;
	sum += texture2D(CC_Texture0, v_texCoord + 0.0001 * BlurSize) * 0.33;
	return sum;
}

void main() 
{
	vec4 sum = vec4(0.0);
	sum += SingleBlur(vec2(0, blurSize.y)) * 0.11111;
	sum += SingleBlur(vec2(0, -blurSize.y)) * 0.11111;
	sum += SingleBlur(vec2(-blurSize.x, 0)) * 0.11111;
	sum += SingleBlur(vec2(blurSize.x, 0)) * 0.11111;
	sum += SingleBlur(vec2(blurSize.x, blurSize.y)) * 0.11111;
	sum += SingleBlur(vec2(-blurSize.x, blurSize.y)) * 0.11111;
	sum += SingleBlur(vec2(blurSize.x, -blurSize.y)) * 0.11111;
	sum += SingleBlur(vec2(-blurSize.x, -blurSize.y)) * 0.11111;
	sum += SingleBlur(vec2(0, 0)) * 0.11111;

    gl_FragColor = sum * v_fragmentColor;
}
*/

/* 水波效果
    #ifdef GL_ES
    precision mediump float;
    #endif
    
    #define F cos(x-y)*cos(y),sin(x+y)*sin(y)
    uniform vec2 blurSize;
    uniform vec2 resolution;
    varying vec2 v_texCoord;
    vec2 s(vec2 p)
    {
        float d=blurSize.x*0.2,x=8.*(p.x+d),y=8.*(p.y+d);
        return vec2(F);
    }
    void mainImage( out vec4 fragColor, in vec2 fragCoord )
    {
        // 换成resolution
        vec2 rs = resolution.xy;
        // 换成纹理坐标v_texCoord.xy
        vec2 uv = v_texCoord.xy;
        vec2 q = uv+2./resolution.x*(s(uv)-s(uv+rs));
        //反转y
        // q.y=1.-q.y;
        fragColor = texture2D(CC_Texture0,q);
    }
    void main()
    {
        mainImage(gl_FragColor, gl_FragCoord.xy);
    }
*/



/*
#ifdef GL_ES
precision mediump float;
#endif
uniform vec2 blurSize;
varying vec2 v_texCoord;

vec4 draw(vec2 uv) 
{
	return texture2D(CC_Texture0,uv).rgba; 
}

float grid(float var, float size) 
{
	return floor(var*size)/size;
}

float rand(vec2 co)
{
	return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
	float bluramount = blurSize.x;
	vec2 uv = v_texCoord.xy;
	vec4 blurred_image = vec4(0.);
	#define repeats 5.
	for (float i = 0.; i < repeats; i++) 
	{ 
		vec2 q = vec2(cos(degrees((i/repeats)*360.)),sin(degrees((i/repeats)*360.))) * (rand(vec2(i,uv.x+uv.y))+bluramount); 
		vec2 uv2 = uv+(q*bluramount);
		blurred_image += draw(uv2)/2.;
		q = vec2(cos(degrees((i/repeats)*360.)),sin(degrees((i/repeats)*360.))) * (rand(vec2(i+2.,uv.x+uv.y+24.))+bluramount); 
		uv2 = uv+(q*bluramount);
		blurred_image += draw(uv2)/2.;
	}
	blurred_image /= repeats;
	fragColor = vec4(blurred_image);
}
void main()
{
	mainImage(gl_FragColor, gl_FragCoord.xy);
}
*/

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; //CC_PMatrix Max = DisplaySize //CC_MVPMatrix Max = DesignSize
	v_fragmentColor = a_color;
	v_texCoord = a_texCoord;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值