【问题标题】:Add blurriness to drawn elements and frag color of fragment shader为绘制的元素和片段着色器的片段颜色添加模糊度
【发布时间】:2021-09-17 23:10:54
【问题描述】:

我目前正在尝试通过将 3 个 blob 相互融合来实现一种动画渐变,其中每个 blob 都是单独动画的。您可以在最后找到所需结果的图像。

我已经能够使用以下片段着色器创建和动画 3 个斑点/圆圈:

uniform vec2 resolution;
uniform vec3 blobs[3];
uniform vec3 colors[3];

vec3 draw_circle(vec2 position, vec3 color, float size) {
    float circle = sqrt(pow(position.x, 2.0) + pow(position.y, 2.0));
    circle = smoothstep(size, size + 0.003, 1.0 - circle);

    return color * circle;
}

void main() {
    vec2 coord = gl_FragCoord.xy / resolution;
    vec3 canvas = vec3(0);

    for (int i = 0; i < 3; i++) {
        vec3 circle = draw_circle(coord - blobs[i].xy / resolution, colors[i], blobs[i].z);
        canvas += circle;
    }

    gl_FragColor = vec4(canvas, 1.0);
}

如何调整我的着色器和相应的圆圈以实现您在上一张图像中看到的这种模糊度?我需要不同的方法吗?

我有什么

我想要什么

【问题讨论】:

    标签: javascript three.js glsl webgl fragment-shader


    【解决方案1】:

    使用smoothstep将圆从中心向外模糊:

    vec3 draw_circle(vec2 position, vec3 color, float size) {
        float circle = length(position.xy);
        
        //circle = smoothstep(size, size + 0.003, 1.0-circle);
        circle = 1.0-smoothstep(0.0, size, circle);
    
        return color * circle;
    }
    

    【讨论】:

    • 谢谢!使用长度和更改平滑步长使我的圆圈消失,你使用什么值?
    • @Tim length(v.xy)sqrt(pow(v.x, 2.0) + pow(v.y, 2.0)) 相同
    • 是的,我的错,使用 circle = 1.0 - smoothstep(0, size, 1.0 - circle) 而不是 circle = smoothstep(size, size + 0.003, 1.0 - circle) 让我的圈子消失了
    • 我是 glsl 的新手——除了着色器之外还有什么会影响结果的吗? F.e.大小的值?
    • @Tim 对不起,我的错。 0 -> 0.0。 (circle = 1.0-smoothstep(0.0, size, circle);)
    猜你喜欢
    • 2020-11-20
    • 2021-01-02
    • 2018-07-15
    • 2021-04-21
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    相关资源
    最近更新 更多