顶点着色器 convolve.vs

#version 150
precision highp float;in vec2 position;out Fragment
{vec2 tex_coord;
} fragment;void main(void)
{gl_Position = vec4(position, 0.5, 1.0);// This produces a texture coordinate that ranges from (0.0, 0.0) to (1.0, 1.0)fragment.tex_coord = position * 0.5 + vec2(0.5, 0.5);
}

高斯模糊着色器 convolve.fs

#version 150
precision highp float;// Input interface block from vertex shader
in Fragment
{vec2 tex_coord;
} fragment;//
uniform sampler2D tex_input_image;uniform samplerBuffer tbo_coefficient;uniform vec2 tc_scale;uniform int kernel_size;out vec4 output_color;void main(void)
{int filter_size = kernel_size; // textureSize(tbo_coefficient);vec4 color = vec4(0.0);vec2 tc_offset;float coefficient;for (int i = 0; i < filter_size; i++) {coefficient = texelFetch(tbo_coefficient, i).r;tc_offset = float(i - filter_size / 2) * tc_scale;color += coefficient * texture(tex_input_image, fragment.tex_coord + tc_offset);}// output_color = texture(tex_input_image, fragment.tex_coord) * texelFetch(tbo_coefficient, 3).r;output_color = color;
}

索贝尔边缘检测片段着色器 absvalue.fs

#version 150
precision highp float;// Input interface block from vertex shader
in Fragment
{vec2 tex_coord;
} fragment;//
uniform sampler2D tex_input_image;out vec4 output_color;void main(void)
{output_color = abs(texture(tex_input_image, fragment.tex_coord));
}
#include "explode.h"ConvolutionApp::ConvolutionApp(void): screenWidth(1024 + 16), screenHeight(768 + 32)
{}void ConvolutionApp::Initialize(void)
{GLenum err = glewInit();if (GLEW_OK != err){/* Problem: glewInit failed, something is seriously wrong. */fprintf(stderr, "Error: %s\n", glewGetErrorString(err));}instancingProg = gltLoadShaderPair("convolve.vs", "convolve.fs");glBindAttribLocation(instancingProg, 0, "position");glLinkProgram(instancingProg);absValueProg = gltLoadShaderPair("convolve.vs", "absvalue.fs");glBindAttribLocation(instancingProg, 0, "position");glLinkProgram(instancingProg);glUseProgram(instancingProg);GLbyte *pBits;int nWidth, nHeight, nComponents;GLenum eFormat;// Read the texture bitspBits = gltReadTGABits("image.tga", &nWidth, &nHeight, &nComponents, &eFormat);glGenTextures(1, &sourceTexture);glBindTexture(GL_TEXTURE_2D, sourceTexture);glTexImage2D(GL_TEXTURE_2D, 0, nComponents, nWidth, nHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBits);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glGenFramebuffers(1, &intermediateFBO);glBindFramebuffer(GL_FRAMEBUFFER, intermediateFBO);glGenTextures(1, &intermediateTexture);glBindTexture(GL_TEXTURE_2D, intermediateTexture);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, 1027, 768, 0, GL_RGBA, GL_FLOAT, NULL);glBindTexture(GL_TEXTURE_2D, 0);glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, intermediateTexture, 0);glGenFramebuffers(1, &targetFBO);glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);glGenTextures(1, &targetTexture);glBindTexture(GL_TEXTURE_2D, targetTexture);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, 1027, 768, 0, GL_RGBA, GL_FLOAT, NULL);glBindTexture(GL_TEXTURE_2D, 0);glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTexture, 0);/*static const GLfloat kernel[] ={0.015625, 0.09375, 0.234375, 0.3125, 0.234375, 0.09375, 0.015625};*/static const GLfloat gaussian_kernel[] ={0.004f,0.008f,0.014f,0.022f,0.033f,0.046f,0.061f,0.076f,0.089f,0.098f,0.101f,0.098f,0.089f,0.076f,0.061f,0.046f,0.033f,0.022f,0.014f,0.008f,0.004f};/*static const GLfloat gaussian_kernel[] ={0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f};*/// glUniform2f(glGetUniformLocation(instancingProg, "tc_scale"), 1.0f / (float)nWidth, 0.0f); // 1.0f / (float)nHeight);// glUniform2f(glGetUniformLocation(instancingProg, "tc_scale"), 0.0f, 1.0f / (float)nHeight);kernelScale[0] = 1.0f / (float)nWidth;kernelScale[1] = 1.0f / (float)nHeight;glUniform1i(glGetUniformLocation(instancingProg, "tex_input_image"), 0);glUniform1i(glGetUniformLocation(instancingProg, "tbo_coefficient"), 1);glActiveTexture(GL_TEXTURE1);glGenTextures(1, &gaussian_kernelTexture);glBindTexture(GL_TEXTURE_BUFFER, gaussian_kernelTexture);glGenBuffers(1, &gaussian_kernelBuffer);glBindBuffer(GL_TEXTURE_BUFFER, gaussian_kernelBuffer);glBufferData(GL_TEXTURE_BUFFER, sizeof(gaussian_kernel), gaussian_kernel, GL_STATIC_DRAW);glTexBufferARB(GL_TEXTURE_BUFFER, GL_R32F, gaussian_kernelBuffer);static const GLfloat sobel_kernel1[] ={1.0f, 2.0, 1.0f};static const GLfloat sobel_kernel2[] ={1.0f, 0.0f, -1.0f};glGenTextures(1, &sobel_kernelTexture1);glBindTexture(GL_TEXTURE_BUFFER, sobel_kernelTexture1);glGenBuffers(1, &sobel_kernelBuffer1);glBindBuffer(GL_TEXTURE_BUFFER, sobel_kernelBuffer1);glBufferData(GL_TEXTURE_BUFFER, sizeof(sobel_kernel1), sobel_kernel1, GL_STATIC_DRAW);glTexBufferARB(GL_TEXTURE_BUFFER, GL_R32F, sobel_kernelBuffer1);glGenTextures(1, &sobel_kernelTexture2);glBindTexture(GL_TEXTURE_BUFFER, sobel_kernelTexture2);glGenBuffers(1, &sobel_kernelBuffer2);glBindBuffer(GL_TEXTURE_BUFFER, sobel_kernelBuffer2);glBufferData(GL_TEXTURE_BUFFER, sizeof(sobel_kernel2), sobel_kernel2, GL_STATIC_DRAW);glTexBufferARB(GL_TEXTURE_BUFFER, GL_R32F, sobel_kernelBuffer2);static const GLfloat square_vertices[] ={-1.0f, -1.0f,1.0f, -1.0f,-1.0f,  1.0f,1.0f,  1.0f};GLuint offset = 0;glGenVertexArrays(1, &square_vao);glGenBuffers(1, &square_vbo);glBindVertexArray(square_vao);glBindBuffer(GL_ARRAY_BUFFER, square_vbo);glBufferData(GL_ARRAY_BUFFER, sizeof(square_vertices), square_vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(0);
}void ConvolutionApp::Shutdown(void)
{glDeleteBuffers(1, &square_vbo);glDeleteVertexArrays(1, &square_vao);
}void ConvolutionApp::Resize(GLsizei nWidth, GLsizei nHeight)
{screenWidth = nWidth;screenHeight = nHeight;glViewport(0, 0, nWidth, nHeight);
}void ConvolutionApp::Render(void)
{glUseProgram(instancingProg);glBindVertexArray(square_vao);//高斯模糊glActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_BUFFER, gaussian_kernelTexture);glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, sourceTexture);glBindFramebuffer(GL_FRAMEBUFFER, intermediateFBO);glClearColor(0.0f, 0.0f, 0.0f, 0.0f);glClear(GL_COLOR_BUFFER_BIT);glUniform1i(glGetUniformLocation(instancingProg, "kernel_size"), 21);glUniform2f(glGetUniformLocation(instancingProg, "tc_scale"), 0.0f, kernelScale[1]);glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);glBindFramebuffer(GL_FRAMEBUFFER, 0);glBindTexture(GL_TEXTURE_2D, intermediateTexture);glUniform2f(glGetUniformLocation(instancingProg, "tc_scale"), kernelScale[0], 0.0f);glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);/* 索贝边缘检测 代码段 开启它时需注释上面的glActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_BUFFER, sobel_kernelTexture1);glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, sourceTexture);glBindFramebuffer(GL_FRAMEBUFFER, intermediateFBO);glClearColor(0.0f, 0.0f, 0.0f, 0.0f);glClear(GL_COLOR_BUFFER_BIT);glUniform1i(glGetUniformLocation(instancingProg, "kernel_size"), 3);glUniform2f(glGetUniformLocation(instancingProg, "tc_scale"), 0.0f, kernelScale[1]);glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);glBindTexture(GL_TEXTURE_2D, intermediateTexture);glActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_BUFFER, sobel_kernelTexture2);glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);glBindFramebuffer(GL_FRAMEBUFFER, 0);glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, targetTexture);glUseProgram(absValueProg);glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);*/GLenum e = glGetError();
}

高斯模糊相关说明:其中sourceImage是原图纹理,作为第一个纹理目标传入,第二个纹理目标是以纹理缓冲区形式传入convolve.fs即tbo_coefficient变量,它是高斯模糊一维纹理数据,关于纹理缓冲区数据是samplerBuffer类型的,它的获取是直接根据整数纹理来拿到对应的数据,最终我们在convolve.fs得到一个经过高斯模糊的颜色值进行输出。

索贝尔边缘检测相关说明:它总共经过3次glDrawArrays进行渲染屏幕四边形。

第一次是使用sourceTexture纹理作为第一纹理和sobel_kernelTexture1作为第二纹理,去使用instancingProg着色器生成intermediateFBO捆绑的intermediateTexture;

第二次使用intermediateTexture作为第一纹理和sobel_kernelTexture2作为第二纹理,使用instancingProg着色器生成targetFBO捆绑的targetTexture;

第三次使用targetTexture纹理作为第一纹理,使用absValueProg着色器渲染,将结果输出到帧缓冲区(屏幕上)

【OpenGL】高级片段着色器——高斯模糊和索贝尔边缘检测相关推荐

  1. 【OpenGL】高级片段着色器——在片段着色器中生成图像数据茹利亚集Julia set

    茹利亚集:z(n) = z(n-1)^2 + c , z是顶点纹理坐标,c是统一值,片段着色器会迭代最大max_iterations次,其中若z值大于阈值threshold_squared则跳出,其迭 ...

  2. 初识OpenGL (3)片段着色器(Fragment Shader)

    step1. 片段着色器 计算像素最后的颜色输出. 片段着色器只需要一个输出变量,这个变量是一个4分量向量,它表示的是最终的输出颜色,我们应该自己将其计算出来. #version 330 core o ...

  3. opengl之高级GLSL(1)-顶点着色器变量与片段着色器变量

    官方教程位置 openglCN GLSL的内建变量: 我们已经学会使用顶点属性.uniform和采样器来完成这一任务了.然而,除此之外,GLSL还定义了另外几个以gl_为前缀的变量,它们能提供给我们更 ...

  4. 第二十二章 opengl之高级OpenGL(几何着色器)

    OpenGL 使用几何着色器 用点造物体 爆破物体 法向量可视化 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader), 几何着色器的输入是一个图元(如点或三角形)的一组顶点 ...

  5. Learn OpenGL(四)——片段着色器(Fragment Shader)

    片段着色器(Fragment Shader) 片段着色器是第二个也是最终我们打算创建的用于渲染三角形的着色器. 片段着色器的全部, 都是用来计算你的像素的最后颜色输出. 为了让事情比较简单, 我们的片 ...

  6. OpenGL蓝宝书第九章学习笔记:片段着色器和帧缓存

    前言 本篇在讲什么 OpenGL蓝宝书第九章学习笔记之片段着色器和帧缓存 本篇适合什么 适合初学OpenGL的小白 本篇需要什么 对C++语法有简单认知 对OpenGL有简单认知 最好是有OpenGL ...

  7. Learn OpenGL(七)——OpenGL中使用着色器的基本步骤及GLSL渲染简单示例

    OpenGL着色语言(OpenGL Shading Language,GLSL)是用来在OpenGL中着色编程的语言,是一种具有C/C++风格的高级过程语言,同样也以main函数开始,只不过执行过程是 ...

  8. Opengl ES之着色器

    前言 在前面我们介绍了 OpenglEs之EGL环境搭建 ,在后面的例子中,我们将无可避免地需要使用到着色器.而着色器才是Opengl的灵魂所在,有了着色器才有了Opengl天马行空的世界. 图形渲染 ...

  9. c语言opengles程序,OpenGL ES _ 着色器_程序

    演示图 你不知道这个东西,请不要看了,请看我的其他文章先了解一下O! 学习目标 掌握着色器程序的执行过程 简单的例子 `` uniform float t; // 时间 uniform mat4 gl ...

  10. 【OpenGL ES】着色器Shader与程序Program

    在OpenGL ES 3程序中,Shader和Program是两个重要的概念,至少需要创建一个顶点Shader对象.一个片段Shader对象和一个Program对象,才能用着色器进行渲染,理解Shad ...

最新文章

  1. 浅析企业网站应该如何选择适合自己的服务器?
  2. 和我一起作Tess的windbg lab - Lab3, Memory
  3. HarmonyOS之常用组件ScrollView的功能和使用
  4. 外星人台式电脑_执掌游戏世界 外星人ALIENWARE m15丨17.9mm机身轻悍降临【电脑组装】公众号分享台式机笔记本电脑 京东商城特惠通道...
  5. (137)FPGA面试题-Verilog HDL中function和task的区别(一)
  6. python检测屏幕亮点_Python+OpenCV检测灯光亮点的实现方法
  7. 妙趣横生的英语单词 看见英语单词头不大(zt)
  8. 2016计算机技术操作考试题,2016年计算机二级《VB》上机操作题(1)
  9. Excel如何将一列数据转为一行
  10. python-skimage.io,filters,transform
  11. c语言程序设计超市会员卡管理系统,C语言程序设计课程设计报告超市水果信息管理系统...
  12. 部署企业级项目管理系统(禅道)
  13. DigiCert和GlobalSign单域名OV SSL证书对比评测
  14. 【MATLAB】MATLAB 可视化之极坐标图
  15. 网页不显示验证码的原因与处理方法
  16. 3D dungeon(BFS)
  17. 问题事件名称: APPCRASH 应用程序名: xxx.EXE 应用程序版本:
  18. 用Python解决数据结构与算法问题(一):Python基础
  19. 【设计模式实战】简单工厂、工厂方法、抽象工厂:原理篇
  20. 基于QT的客户管理系统CRM

热门文章

  1. r语言平均值显著性检验_R语言标记显著性标记
  2. 实验三 交换机的配置
  3. 高三数学微课堂【教学视频】
  4. python实现pearson相关性检验
  5. [史]《全球通史》上册——摘记
  6. java 获取field类型_获取Java类中所有Field
  7. Docker服务,堆栈和分布式应用程序捆绑
  8. VM12虚拟机安装xp系统教程
  9. java导出dbf文件_Java 导出dbf文件
  10. 笔记本摄像头计算机,如何解决笔记本电脑摄像头异常问题