Godot - Shader - 描边

上代码

原理很简单,将图片的透明度数据偏移一周来达到描边度效果,我想,通过mat应该能更快得到描边效果,另外由于此图的图片边缘紧挨靠边界,导致透明度出错,这个可以在前期图片上预留透明空间来避免这个问题,这里我缩小了原图,但效果不太好

shader_type canvas_item;

uniform int SAMPLES = 6;
uniform float WIDTH = 4.0;
uniform vec4 OUTLINE_COLOR = vec4(0.,0.,0.,1.);

uniform vec2 TEXTURE_SCALE = vec2(0.94);

void fragment(){
    vec2 uv_offset = (1.-TEXTURE_SCALE)*.5;
    vec2 uv = UV/TEXTURE_SCALE-uv_offset;
    
    vec4 cc = texture(TEXTURE,uv);
    if(UV.x<uv_offset.x || UV.x>1.-uv_offset.x){
        cc.a = 0.;
    }
    if(UV.y<uv_offset.y || UV.y>1.-uv_offset.y){
        cc.a = 0.;
    }
    //OUTLINE
    float outlineAlpha = 0.0;
    float angle = 0.0;
    float unit_angle = 1.0/float(SAMPLES) * 3.1415*2.0;
    for( int i=0; i<SAMPLES; i++ ){
        angle += unit_angle;
        vec2 testPoint = vec2( (WIDTH*TEXTURE_PIXEL_SIZE.x)*cos(angle), (WIDTH*TEXTURE_PIXEL_SIZE.y)*sin(angle) );
        testPoint = clamp( testPoint+uv, vec2(0.), vec2(1.));
        float sampledAlpha = texture( TEXTURE,  testPoint ).a;
        outlineAlpha = max( outlineAlpha, sampledAlpha );
    }
    COLOR = mix( vec4(0.0), OUTLINE_COLOR, outlineAlpha );
    COLOR = mix( COLOR, cc, cc.a );
}

参考:

单色描边
https://www.shadertoy.com/view/XdV3Dc
发光描边
https://www.shadertoy.com/view/XlsXRB

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图...
    万忍阅读 1,584评论 0 6
  • 自用收藏 原文:http://www.th7.cn/Program/IOS/201606/884245.shtml...
    西瓜皮奥特曼阅读 2,403评论 0 16
  • 生活都是不易 ———— 生活确实苦不堪言,且先不说北上广那些陈芝麻烂谷子的事情,即使你身处一个二线三线城市,每个月...
    醉酒少年阅读 420评论 0 1
  • 今天要写2000字,但是毫无头绪,所以打开了知乎,看看有什么好的话题可以写写,然后看到了一篇帖子“教师的圈子真的如...
    xiaomianger阅读 212评论 0 1
  • 昨晚发生了一些事,怒气难消的我在朋友圈发了条状态:“人生那么长,难免会遇到几个人渣!”因为今天要早起,发完之后我就...
    我是凡不凡啊阅读 415评论 0 2

友情链接更多精彩内容