gpt4 book ai didi

java - 使用纯 GLSL 的 2D 运动模糊和高斯模糊

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:30:18 29 4
gpt4 key购买 nike

我希望使用纯 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 创建模糊是个好主意吗?有没有人知道如何去做?
我可能会回答我自己的问题,因为我有一些想法。

最佳答案

我要回答我自己的问题。

最终,我只更改了片段着色器:

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。您可以随时根据自己的喜好调整变量。

关于java - 使用纯 GLSL 的 2D 运动模糊和高斯模糊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21180691/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com