基于Qt的OpenGL可编程管线学习(11)- 高斯模糊

下图是使用高斯模糊和未使用高斯模糊的效果图对比

正常图片

高斯模糊后

1、标准高斯模糊

原理:

每个像素周围对应的像素乘以对应的算子,然后除以算子的综合

算子为

1 2 1
2 4 2
1 2 1

fragment shader

varying vec2 M_coord;
varying vec3 M_normal;
varying vec3 M_WordPos;

uniform sampler2D U_MainTexture;
uniform sampler2D U_SubTexture;

void main()
{
    // 1 2 1
    // 2 4 2
    // 1 2 1
    int coreSize=3;
    int halfCoreSize=coreSize/2;
    float texelOffset=1/100.0;
    vec4 color = vec4(1.0);
    float nGaussionCore[9] = float[](1.0, 2.0, 1.0, 2.0, 4.0, 2.0, 6.0, 2.0, 1.0);

    int index = 0;
    for(int y=0;y<coreSize;y++)
    {
        for(int x=0;x<coreSize;x++)
        {
             vec4 currentColor=texture2D(U_MainTexture,
                                         M_coord+vec2((-halfCoreSize+x)*texelOffset,
                                                      (-halfCoreSize+y)*texelOffset));
             color += currentColor * nGaussionCore[index++];
         }
     }
     color /= 16.0;
     gl_FragColor=color ;
}

2、横向模糊

与高斯模糊类似 不过只是模糊横向分量

// 水平高斯模糊
varying vec2 M_coord;
varying vec3 M_normal;
varying vec3 M_WordPos;

uniform sampler2D U_MainTexture;
uniform sampler2D U_SubTexture;

void main()
{
    int coreSize=3;
    int halfCoreSize=coreSize/2;
    float texelOffset=1/100.0;
    vec4 color = vec4(0.0);
    float nGaussionCore[5] = float[](0.22, 0.19, 0.12, 0.08, 0.01);

    color = texture2D(U_MainTexture, M_coord) * nGaussionCore[0];
    for (int i=1; i<5; ++i)
    {
        color += texture2D(U_MainTexture, vec2(M_coord.x + i * texelOffset, M_coord.y))
                 * nGaussionCore[i];
        color += texture2D(U_MainTexture, vec2(M_coord.x + i * texelOffset, M_coord.y))
                 * nGaussionCore[i];
    }

    gl_FragColor=color ;
}

3、纵向模糊

与高斯模糊类似 不过只是模糊纵向分量

varying vec2 M_coord;
varying vec3 M_normal;
varying vec3 M_WordPos;

uniform sampler2D U_MainTexture;
uniform sampler2D U_SubTexture;

void main()
{
    int coreSize=3;
    int halfCoreSize=coreSize/2;
    float texelOffset=1/100.0;
    vec4 color = vec4(0.0);
    float nGaussionCore[5] = float[](0.22, 0.19, 0.12, 0.08, 0.01);

    color = texture2D(U_MainTexture, M_coord) * nGaussionCore[0];
    for (int i=1; i<5; ++i)
    {
        color += texture2D(U_MainTexture, vec2(M_coord.x, i * texelOffset + M_coord.y))
                 * nGaussionCore[i];
        color += texture2D(U_MainTexture, vec2(M_coord.x, i * texelOffset + M_coord.y))
                 * nGaussionCore[i];
    }

    gl_FragColor=color ;
}
时间: 2024-10-29 19:06:35

基于Qt的OpenGL可编程管线学习(11)- 高斯模糊的相关文章

基于Qt的OpenGL可编程管线学习(1)- 绘制一个三角形

0.写在前面的话 这里只是学习的时候做的笔记记录方便日后的查看,如果有大神看到觉得有问题的地方希望能给予指出,方便日后的学习,谢谢! 我是用的Qt版本为Qt5.6,开发环境为Qt Creator 1.QOpenGLWidget 在Qt开发环境下,使用OpenGL的可编程管线绘制一个三角形 效果如下图所示: 这里使用QOpenGLWidget进行绘制的,在QOpenGLWidget中需要重写 void initializeGL(void); void resizeGL(int w, int h);

基于Qt的OpenGL可编程管线学习(5)- FBO的使用

FBO: Frame Buffer Object,默认绘制在1号FBO中,自定义的FBO是可以做读写操作的. 绘制到自定义的FBO,然后显示出来,如下图所示: Qt中有关于FBO的类,QOpenGLFrameBufferObject FBO的创建 m_FrameBufferObj = new QOpenGLFramebufferObject(w, h, QOpenGLFramebufferObject::Depth); FBO的使用 bool result = m_FrameBufferObj-

基于Qt的OpenGL可编程管线学习(3)- 使用Instanced方式绘制

绘制多个重复的模型时,使用Instanced方式绘制可以大大加快显然速度. 绘制效果如下图所示: 1.Vertex Shader中定义如下: attribute vec3 pos; attribute vec2 coord; attribute vec3 normal; attribute vec3 offset; uniform mat4 M; uniform mat4 V; uniform mat4 P; uniform mat4 NM; varying vec2 M_coord; vary

基于Qt的OpenGL可编程管线学习(10)- 膨胀与腐蚀

膨胀:取一个像素周围的点,取最亮的点为当前的点颜色,为膨胀效果 腐蚀:取一个像素周围的点,取最暗的点为当前的点颜色,为腐蚀效果 膨胀Fragment Shader varying vec2 M_coord; varying vec3 M_normal; varying vec3 M_WordPos; uniform sampler2D U_MainTexture; uniform sampler2D U_SubTexture; void main() {     vec4 maxValue=ve

基于Qt的OpenGL可编程管线学习(15)- 颜色加深、颜色减淡、想家相减

1.颜色加深 shader //颜色加深 uniform sampler2D U_MainTexture; uniform sampler2D U_SubTexture; varying vec2 M_coord; void main() {         vec4 blendColor = texture2D(U_SubTexture, M_coord);         vec4 baseColor = texture2D(U_MainTexture, M_coord);         

基于Qt的OpenGL可编程管线学习(14)- 正片叠底、逆正片叠底

1.正片叠底 shader // 正片叠底 uniform sampler2D U_MainTexture; uniform sampler2D U_SubTexture; varying vec2 M_coord; void main() {         vec4 blendColor = texture2D(U_SubTexture, M_coord);         vec4 baseColor = texture2D(U_MainTexture, M_coord);        

基于Qt的OpenGL可编程管线学习(18)- 平滑、锐化、边缘检测

1.平滑 shader // 平滑 uniform sampler2D U_MainTexture; uniform sampler2D U_SubTexture; varying vec2 M_coord; void main() {         vec4 color = vec4(0.0);         int coreSize = 3;         float texelOffset = 1 / 300.0;         float kernel[9];         k

基于Qt的OpenGL可编程管线学习(8)- 探照灯

关于探照灯的效果如下图所示: 探照灯需要传入光源的位置,光源的方向以及夹角的大小(夹角为光源覆盖的夹角的一半) 计算思路: 用光源到点的距离与光源的方向的单位向量做点乘,得到夹角的cos,用计算的夹角cos与 传入的角度的cos做比较,确定光线照射的范围.边缘不部分计算的cos做基底,然后给定一个幂, 就可以做到渐变的效果:探照灯的计算时也要算上衰减 Shader中的相关代码如下: vec3 light = M_LightPos.xyz; float distanceLight = 0.0;  

基于Qt的OpenGL可编程管线学习(13)- 变亮变暗

图片混合变亮与变暗的效果,如下图所示 变暗效果 变亮效果 变亮shader uniform sampler2D U_MainTexture; uniform sampler2D U_SubTexture; varying vec2 M_coord; void main() {         vec4 blendColor = texture2D(U_SubTexture, M_coord);         vec4 baseColor = texture2D(U_MainTexture, M