ShaderToy(二)画笑脸

4 篇文章 0 订阅

通过上一节的知识,我们可以自建circle函数来作圆形:

float Circle(vec2 uv, vec2 p, float r, float blur)
{
float d = length(uv – p);
float c = smoothstep(r, r-blur, d);

return c;
}

其中p为圆形坐标,uv-p将原点移动到了p位置,r为半径,blur为边界模糊长度。由此,我们可以画第一个圆:

float c = Circle(uv, vec2(0.2, -0.1), 0.4, 0.05);

 画第二个圆只需将其与第一个圆做相加即可:

c += Circle(uv, vec2(-0.5, -0.2), 0.1, 0.01);

 圆之间也可以做减法运算:(有一部分可能是-1,将其c赋值为0)

c += (Circle(uv, vec2(-0.5, -0.2), 0.1, 0.01) == 1.0)? 1.0: 0.0;

 

由此我们可以绘制出笑脸的眼睛:

float c = Circle(uv, vec2(0.0), 0.4, 0.05);
c -= Circle(uv, vec2(-0.13, 0.2), 0.07, 0.01);
c -= Circle(uv, vec2(0.13, 0.2), 0.07, 0.01);

 我们可以通过添加新的颜色数组来改变整体颜色:

vec3 col = vec3(0.0);
col = vec3(1.0, 1.0, 0.0) * c; // yellow

最后我们绘制嘴巴:使用两个相同大小的圆形相减得到月牙形嘴巴:

float mouth = Circle(uv, vec2(0.0, 0.0), 0.3, 0.02);
mouth -= Circle(uv, vec2(0.0, 0.1), 0.3, 0.02);
mouth = (mouth == 1.0)? 1.0 : 0.0;

 

 然后将嘴巴添加到我们的笑脸中:

c -= mouth;

完整代码如下:

float Circle(vec2 uv, vec2 p, float r, float blur)
{
    float d = length(uv - p);
    float c = smoothstep(r, r-blur, d);
    
    return c;
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;
     
    uv -= 0.5;
    uv.x *= iResolution.x / iResolution.y;

    //float c = Circle(uv, vec2(0.2, -0.1), 0.4, 0.05);
    
    //c += Circle(uv, vec2(-0.5, -0.2), 0.1, 0.01);
    //c -=  Circle(uv, vec2(0.1, 0.2), 0.1, 0.01);
    float c = Circle(uv, vec2(0.0), 0.4, 0.05);

    c -= Circle(uv, vec2(-0.13, 0.2), 0.07, 0.01);
    c -= Circle(uv, vec2(0.13, 0.2), 0.07, 0.01);
    
    float mouth = Circle(uv, vec2(0.0, 0.0), 0.3, 0.02);
    mouth -= Circle(uv, vec2(0.0, 0.1), 0.3, 0.02);
    mouth = (mouth == 1.0)? 1.0 : 0.0;
    
    c -= mouth;
    vec3 col = vec3(0.0);
    col = vec3(1.0, 1.0, 0.0) * c; // yellow

    // Output to screen
    fragColor = vec4(col,1.0);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值