Glsl 什么样的模糊可以在像素着色器中实现?

Glsl 什么样的模糊可以在像素着色器中实现?,glsl,shader,gpu,hlsl,pixel-shader,Glsl,Shader,Gpu,Hlsl,Pixel Shader,高斯、长方体、径向、定向、运动模糊、缩放模糊等 我读到高斯模糊可以在像素着色器中实现的过程中分解,但找不到任何样本 假设任何与自身以外的像素相关的效果都不能在像素着色器中实现,这是否正确?只要能够将信息传递给着色器,就可以实现所有功能 在这种情况下,技巧是执行多次渲染。最终着色器将使用一定数量的采样器,即非模糊源,用于计算模糊值 例如,使用多个纹理可以模拟基于累积缓冲区的效果 要实现高斯模糊,请将场景渲染到frambuffer对象上,并在颜色附件上附加纹理。这是第一关 作为第二个过程,渲染带纹

高斯、长方体、径向、定向、运动模糊、缩放模糊等

我读到高斯模糊可以在像素着色器中实现的过程中分解,但找不到任何样本


假设任何与自身以外的像素相关的效果都不能在像素着色器中实现,这是否正确?

只要能够将信息传递给着色器,就可以实现所有功能

在这种情况下,技巧是执行多次渲染。最终着色器将使用一定数量的采样器,即非模糊源,用于计算模糊值

例如,使用多个纹理可以模拟基于累积缓冲区的效果


要实现高斯模糊,请将场景渲染到frambuffer对象上,并在颜色附件上附加纹理。这是第一关


作为第二个过程,渲染带纹理的四边形,其中纹理是第一步中生成的纹理。纹理坐标从顶点阶段传递到片段阶段,并在四边形上插值。实际上,每个片段都有纹理坐标;为每个坐标应用偏移量,以获取底层坐标周围的文本,并执行高斯模糊。

用于后处理效果的常规“管道”

setRenderTarget(myRenderTarget); // or FBO in GL
drawAwsomeScene();

setdefaultRenderTarget();   // draw to screen...

blurShader.use();
// shader needs to know what is the size of one pixel on the screen
blurShader.uniform2f("texelSize", 1/screenW, 1/screenH);

// set the texture with scene rendered...
setRenderTargetTexture();

drawFullScreenQuad();

// other effects...

模糊的有用示例/教程:

我实现了一个通用卷积片段着色器(像素着色器)


实现场景模糊效果的一个常见实现是,通过2次后处理实现。
这是一个近似值,第一次通过时沿X轴模糊,第二次通过时沿Y轴模糊(反之亦然)。这将产生更好的强模糊性能。
“模糊”着色器使用“模糊”选项。对于这两个过程,使用相同的着色器程序,对这两个过程进行单独的方向设置,存储在uniform
vec2 u_dir
中。模糊效果的强度可随[0.0,1.0]范围内的均匀变量
float u_sigma
而变化。
将场景写入帧缓冲区,并将纹理绑定到颜色平面。屏幕空间过程使用纹理作为输入沿X轴模糊输出。X轴模糊过程写入另一个帧缓冲区,并将纹理绑定到其颜色平面。此纹理用作沿Y轴进行最终模糊处理的输入。
有关模糊算法的详细说明,请参见问题的答案或

模糊顶点着色器

#版本330
在vec2inpos中;
输出vec2位;
void main()
{
pos=inPos;
gl_位置=vec4(inPos,0.0,1.0);
}
模糊片段着色器

#版本330
在vec2位置;
均匀的二维u_纹理;
均匀的vec2 u_纹理;
均匀浮动u_σ;
统一向量2 u_dir;
浮点计算器(浮点x,浮点西格玛)
{

如果(sigma)谢谢,我可以为这些模糊传递什么样的输入?我想我只得到一个像素和它的颜色,等等,而不是它的坐标,或者其他任何东西。你知道我如何实现高斯或框模糊作为像素着色器吗?
#version 120

uniform sampler2D texUnit;
uniform float[9] conMatrix;
uniform float conWeight;
uniform vec2 conPixel;

void main(void)
{
    vec4 color = vec4(0.0);
    vec2 texCoord = gl_TexCoord[0].st;
    vec2 offset = conPixel * 1.5;
    vec2 start = texCoord - offset;
    vec2 current = start;

    for (int i = 0; i < 9; i++)
    {
        color += texture2D( texUnit, current ) * conMatrix[i]; 

        current.x += conPixel.x;
        if (i == 2 || i == 5) {
            current.x = start.x;
            current.y += conPixel.y; 
        }
    }

    gl_FragColor = color * conWeight;
}
where conPixel is {1/screen width, 1/screen height}
where conMatrix is {1.0, 1.0, 1.0, 1.0, 1.0, 1.0,  1.0, 1.0, 1.0}
where conWeight is 1.0 / 9.0
where texUnit is 0