【问题标题】:2D motion blur and gaussian blur using purely GLSL使用纯 GLSL 的 2D 运动模糊和高斯模糊
【发布时间】:2014-01-17 07:59:28
【问题描述】:

我希望使用纯粹的 GLSL 来实现运动模糊或高斯模糊。
我已经创建了一些基本的着色器,并且已经有了一些想法。

我的着色器:

顶点着色器:

attribute vec4 a_color;
attribute vec2 a_position;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;

varying vec4 v_color;
varying vec2 v_texCoord0;

void main() {
    v_color = a_color;
    v_texCoord0 = a_texCoord0;
    gl_Position =  u_projTrans * vec4(a_position, 0.0f, 1.0f);  
}

片段着色器:

varying vec4 v_color;
varying vec2 v_texCoord0;

uniform vec2 screenSize;

uniform sampler2D u_texture;
uniform vec4 v_time;

const float RADIUS = 0.75;

const float SOFTNESS = 0.6;

void main() {
    vec4 texColor = texture2D(u_texture, v_texCoord0);
    vec4 timedColor = (v_color + v_time);

    vec2 position = (gl_FragCoord.xy / screenSize.xy) - vec2(0.5);
    float len = length(position);

    float vignette = smoothstep(RADIUS, RADIUS-SOFTNESS, len);

    texColor.rgb = mix(texColor.rgb, texColor.rgb * vignette, 0.5);

    gl_FragColor = vec4(texColor.rgb * timedColor.rgb, texColor.a);
}

纯粹使用 GLSL 创建模糊是个好主意吗?有没有人对如何做到这一点有任何想法?
我也可以回答我自己的问题,因为我有一些想法。

【问题讨论】:

    标签: java glsl libgdx shader


    【解决方案1】:

    我将回答我自己的问题。

    最后,我只改变了片段着色器:

    varying vec4 vColor;
    varying vec2 vTexCoord;
    
    uniform vec2 screenSize;
    
    uniform sampler2D u_texture;
    uniform vec4 v_time;
    
    const float RADIUS = 0.75;
    
    const float SOFTNESS = 0.6;
    
    const float blurSize = 1.0/1000.0;
    
    void main() {
    
        vec4 texColor = vec4(0.0); // texture2D(u_texture, vTexCoord)
        texColor += texture2D(u_texture, vTexCoord - 4.0*blurSize) * 0.05;
        texColor += texture2D(u_texture, vTexCoord - 3.0*blurSize) * 0.09;
        texColor += texture2D(u_texture, vTexCoord - 2.0*blurSize) * 0.12;
        texColor += texture2D(u_texture, vTexCoord - blurSize) * 0.15;
        texColor += texture2D(u_texture, vTexCoord) * 0.16;
        texColor += texture2D(u_texture, vTexCoord + blurSize) * 0.15;
        texColor += texture2D(u_texture, vTexCoord + 2.0*blurSize) * 0.12;
        texColor += texture2D(u_texture, vTexCoord + 3.0*blurSize) * 0.09;
        texColor += texture2D(u_texture, vTexCoord + 4.0*blurSize) * 0.05;
    
        vec4 timedColor = (vColor + v_time);
    
        vec2 position = (gl_FragCoord.xy / screenSize.xy) - vec2(0.5);
        float len = length(position);
    
        float vignette = smoothstep(RADIUS, RADIUS-SOFTNESS, len);
    
        texColor.rgb = mix(texColor.rgb, texColor.rgb * vignette, 0.5);
    
        gl_FragColor = vec4(texColor.rgb * timedColor.rgb, texColor.a);
    }
    

    实际的模糊效果写在这里:

        vec4 texColor = vec4(0.0); // texture2D(u_texture, vTexCoord)
        texColor += texture2D(u_texture, vTexCoord - 4.0*blurSize) * 0.05;
        texColor += texture2D(u_texture, vTexCoord - 3.0*blurSize) * 0.09;
        texColor += texture2D(u_texture, vTexCoord - 2.0*blurSize) * 0.12;
        texColor += texture2D(u_texture, vTexCoord - blurSize) * 0.15;
        texColor += texture2D(u_texture, vTexCoord) * 0.16;
        texColor += texture2D(u_texture, vTexCoord + blurSize) * 0.15;
        texColor += texture2D(u_texture, vTexCoord + 2.0*blurSize) * 0.12;
        texColor += texture2D(u_texture, vTexCoord + 3.0*blurSize) * 0.09;
        texColor += texture2D(u_texture, vTexCoord + 4.0*blurSize) * 0.05;
    

    纯粹使用 GLSL,效果会产生高斯模糊。 您可以随时根据自己的喜好调整变量。

    【讨论】:

    • @Mikhail 我需要等待 8 小时:D
    • @IsraelG。这是像 tinyurl.com/ojjwv67 这样的运动模糊吗?还是只是简单的模糊?
    • @SteveL 如您所见,它更像是一种高斯模糊,但借助 GLSL 知识,您可以轻松对其进行编辑以使其用作运动模糊。
    猜你喜欢
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2011-12-24
    • 2014-06-22
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多