使用shader 绘制一个发光圆

611 阅读3分钟

前言

之前,我们使用 uv 坐标完成了一个圆的图像。今天,我们来给我们的圆添加一些特殊的图形效果。

下载.jfif

模糊效果

我们使用smoothstep函数来实现我们的模糊效果。

smoothstep(平滑过渡函数):

  • smoothstep(edge1,edge2,x)
  • 大于 edge2 返回 1,小于 edge1 返回 0,介于之间,返回 0-1 平滑过渡的值。

这里我们将 edge2 设置大一点,那么介于 0-1 之间平滑过渡的值便多一点,我们便可以得到我们的模糊效果了。

void mainImage(out vec4 fragColor,in vec2 fragCoord){
    vec2 uv =fragCoord/iResolution.xy; //坐标除以画布大小得到归一化uv坐标
    // uv 居中
    uv=(uv*2.)-1.0;
    uv.x*=iResolution.x/iResolution.y; // 修正uv坐标未自动适应画布比例的问题
    float d=length(uv)-0.5; // 取一段距离
    float c=0.; //存放值的变量
    //模糊效果
    c=smoothstep(0.,0.2,d ); //利用step函数得到值
    fragColor=vec4(c,c,c,1.); // 输出

}

image.png

发光效果

我们想要得到一个发光圆的效果,首先得得到一个白色的圆。那么我们如何得到一个白色的圆呢? 思路:我们是通过 uv 坐标的 length 去得到一个黑色的圆的。那我们取 length 的倒数,是不是就可以得到一个白色的圆了呢?

void mainImage(out vec4 fragColor,in vec2 fragCoord){
    vec2 uv =fragCoord/iResolution.xy; //坐标除以画布大小得到归一化uv坐标
    // uv 居中
    uv=(uv*2.)-1.0;
    uv.x*=iResolution.x/iResolution.y; // 修正uv坐标未自动适应画布比例的问题
    float d=-1./(length(uv)-0.5); // 取一段距离
    float c=0.; //存放值的变量
    //模糊效果
    c=smoothstep(0.,0.2,d ); //利用step函数得到值
    // 发光效果
    fragColor=vec4(vec3(c),1.); // 输出

}

image.png

我们现在已经得到白色的圆了,现在我们要让它发光。 如何让它发光呢?

思路:“我们让它白色和黑色交界的区间存在一个平滑过渡(即让它的值存在一部分介于 0-1 之间的部分)”,这里我们可以想到一个函数——反比例函数。它的图像为:

image.png

我们可以看到 d=0 时,1/d 很大,变成颜色就是白色,当 d=1 时,1/d=1,d>1 时,1/d 为白色和黑色之间的颜色。

image.png

//发光效果
void mainImage(out vec4 fragColor,in vec2 fragCoord){
    vec2 uv =fragCoord/iResolution.xy; //坐标除以画布大小得到归一化uv坐标
    // uv 居中
    uv=(uv*2.)-1.0;
    uv.x*=iResolution.x/iResolution.y; // 修正uv坐标未自动适应画布比例的问题
    float d=(length(uv)); // 取uv坐标长度(这里不需要减去一段距离,因为减去一段距离之后便存在负数了)
    float c=1./d; //存放值的变量
    // 发光效果
    fragColor=vec4(vec3(c),1.); // 输出

}

为了让我们的发光效果更明显,我们可以乘上一个小数。

//发光效果
void mainImage(out vec4 fragColor,in vec2 fragCoord){
    vec2 uv =fragCoord/iResolution.xy; //坐标除以画布大小得到归一化uv坐标
    // uv 居中
    uv=(uv*2.)-1.0;
    uv.x*=iResolution.x/iResolution.y; // 修正uv坐标未自动适应画布比例的问题
    float d=(length(uv)); // 取uv坐标长度(这里不需要减去一段距离,因为减去一段距离之后便存在负数了)
    float c=0.2/d; //存放值的变量
    // 发光效果
    fragColor=vec4(vec3(c),1.); // 输出

}

image.png

总结

我们今天分享就结束了,如有错误之处,欢迎大家留言之处。谢谢大家了。