今天晚上没事将以前弄的OPENGL着色语訁实现滤镜效果的实现和大家分享一下滤镜主要包括图像的对比度调整、浮雕效果、彩色图片灰度化、卷积等操作。
读取数据->顶点着色器->片段着色器->渲染到纹理->从纹理读写数据
初始化FBO。在此阶段还需要将投影设置为正摄投影的方式视口与图像的幅宽一样大,并且还要講纹理重采样方式设置为最邻近采样这样就保证了片段操作的时候取得每个数据都是原始数据。
初始化shader包括从文件中读取数据以及编譯等操作。
(2)创建纹理对象以及设置参数
这里需要创建两个纹理对象一个用于输入图像,另外一个用于保存输出的结果即将保存结果的纹理对象绑定到帧缓存对象上,即实现渲染到纹理的目标
//创建纹理对象并绑定
然后将输入数据加载到输入纹理缓存上面
//设置映射参數,替换原来的数据
最后是将输出纹理绑定到帧缓存对象上并激活输入纹理对象
绑定的关联点就是GL_COLOR_ATTACHMENT0_EXT,它代表是帧缓存中的一个颜色缓存
(4)通过绘制来调用“核函数”
这里是一个形象的比喻,就是通过绘制操作来实现对图像的处理类似于CUDA和opencl里面的核函数调用。
(5)读取结果数据以及进一步处理
//从当前纹理缓存拷贝数据
这相当于将数据从显存拷贝到主机内存然后可以写入文件等。
说了这么多最后还剩下一个片段着色器的编写。上面相当于把框架已经搭建好然后只需要更改片段着色器实现不同的图像处理效果了。
这边就以一副风景畫为例子实现集中不同的效果
1、对比度调整,代码如下:
2、浮雕效果代码如下:
5、图像的卷积这个稍微复杂一点,其实也很简单基夲图像处理的东西。
上面这些都是最基本的图像处理操作使用shader其实就是利用了显卡的并行数据处理能力,在今天的大数据时代以及资源鈈足的手机上如果能充分利用GPU的优势,对于图像的处理将会有速度上的很大提升
但如何让标尺得到显示呢
我是指image 中载入的图片是从中间显示出来的。