Cocos Shader入门学习案例,描边效果

在学习 Shader 的过程中做的小案例,在 Creator v2.4.10 实现2D物体的描边效果。

outline.mtl、outline.effect用于描边效果

创建 SpriteNode 节点, 给其添加上图和outline.mtl材质。

参考自:

参考.png


CCEffect 中添加 propertie:

properties:
        outlineWidth: { value: 0.01, editor: { tooltip: '描边宽度' }}
        outlineColor: { value: [1,1,1,1], editor: { type: color ,tooltip: '描边颜色' }}

修改片段着色器fs:

声明部分:

uniform Outline {
    vec4 outlineColor;
    float outlineWidth;
  };

入口函数:

void main () {
    vec4 o = vec4(1, 1, 1, 1);

    #if USE_TEXTURE
      CCTexture(texture, v_uv0, o);

      // 计算周围像素的 alpha 值
      float alphaLeft = texture2D(texture, v_uv0 + vec2(outlineWidth, 0)).a;
      float alphaRight = texture2D(texture, v_uv0 - vec2(outlineWidth, 0)).a;
      float alphaTop = texture2D(texture, v_uv0 + vec2(0, outlineWidth)).a;
      float alphaBottom = texture2D(texture, v_uv0 - vec2(0, outlineWidth)).a;

      // 计算描边的 alpha 值
      float outlineAlpha = alphaLeft + alphaRight + alphaTop + alphaBottom;

      vec4 finalColor = mix(outlineColor, o.rgba, o.a);

      finalColor.a = outlineAlpha;

      gl_FragColor = finalColor;

    #endif
  }

vec4 finalColor = mix(outlineColor, o.rgba, o.a);

o.a == 1,说明纹理图该位置有颜色,采用纹理图的原色
o.a == 0,说明纹理图该位置没有颜色,采用描边颜色
o.a介于中间,根据纹理图的Alpha值使用混合颜色

float outlineAlpha = alphaLeft + alphaRight + alphaTop + alphaBottom; 记录周围像素的alpha。如果 outlineAlpha == 0,说明附近都是透明的;

finalColor.a = outlineAlpha;,令周围都是透明的地方的保持透明。


最终效果:

01.png

可以发现,图的左上、右上、左下、右下的突出部分会有缺口,主要原因是我们只使用了上下左右的检测,如果需要更完整的轮廓线,可以再加上四个方向的检测。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值