您的位置:首页 > 移动开发 > Cocos引擎

【Cocos Shader】2D灯光及遮罩效果

2015-10-27 08:33 821 查看


Shader实现:

vs: light2d.vert

attribute vec4 a_position;
attribute vec2 a_texCoord;

#ifdef GL_ES
varying mediump vec2 v_texCoord;
varying mediump vec2 v_position;//将顶点的位置传给ps,用于计算该顶点与灯的距离
#else
varying vec2 v_texCoord;
varying vec2 v_position;
#endif

void main()
{
v_position = a_position.xy;
gl_Position = CC_PMatrix * a_position;
v_texCoord = a_texCoord;
}


ps: light2d.frag

#ifdef GL_ES
varying lowp vec2 v_texCoord;
varying mediump vec2 v_position;
#else
varying vec2 v_texCoord;
varying vec2 v_position;
#endif

uniform vec2 u_lightPosition;
uniform vec4 u_lightColor;
uniform float u_lightRange;
vec4 getRenderColor(vec2 texPos, vec2 lightPos, float lightRange)
{
vec2 pos = texPos - lightPos;
float d = length(pos);//顶点与灯的距离
float rgb;//相当于光强度
if(d>30.0)//距离大于30,在lightRange范围内,灯光离灯心越远颜色越亮的遮罩效果,下面需要对颜色进行反转以实现灯光变亮
rgb = (d-30)/(lightRange);
else//距离小于30灯光最强,为白色
rgb = 0.0;
rgb = 1.0 - clamp(rgb, 0.0, 1.0);//clamp意义为 min(max(a, b), c);将a的大小限制在b,c之间, 1-rgb是将颜色反转
return vec4(rgb, rgb, rgb, 1.0);
}
void main()
{
vec4 color = u_lightColor * getRenderColor(v_position, u_lightPosition, u_lightRange);//灯光颜色与灯光强度混合
color = clamp(color, 0.0, 1.0);
gl_FragColor = texture2D(CC_Texture0, v_texCoord) * color ;//纹理与灯光混合
}


应用Shader:

将需要传入Shader的变量赋值。

programState->setUniformVec2("u_lightPosition", Vec2(winSize/2));
programState->setUniformVec4("u_lightColor", Vec4(1.0, 1.0, 1.0, 1.0));
programState->setUniformFloat("u_lightRange", 100.0f);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: