着色器Shader及Shader的图像处理,Shader Demo

孟雪风
2023-12-01

  android-gpuimage里给出了很多滤镜效果,本质都是用shader处理图像。
  使用OpenGL做图像处理,最主要的就是FragShader的实现,以下是几种已经实现了的shader。有黑白照处理,Sephia特效,反相,高斯模糊,Median模糊,锐化,腐蚀,膨胀,拉普拉斯边缘检测等。

-- Android平台OpenGL SE Camera滤镜实现Demo- https://github.com/andev009/AndroidShaderDemo
Image processing based on Shader for Android platform
《Android平台OpenGL SE Camera滤镜实现》
《Android基于Shader的图像处理(1)-灰度和卷积》
《Android基于Shader的图像处理(2)-帧缓冲区对象FBO》
《Android基于Shader的图像处理(3)-马赛克》
《Android基于Shader的图像处理(4)-Sobel边缘检测》
《Android基于Shader的图像处理(5)-Canny边缘检测》
《Android基于Shader的图像处理(6)-Camera开发》
《Android基于Shader的图像处理(7)-颜色表LUT》
《Android基于Shader的图像处理(8)-仿抖音缩放特效》
《Android基于Shader的图像处理(9)-仿抖音闪白特效》
《Android基于Shader的图像处理(10)-仿抖音毛刺特效》
《Android基于Shader的图像处理(11)-仿抖音灵魂出窍》
《Android基于Shader的图像处理(12)-仿抖音抖动特效》
《Android基于Shader的图像处理(13)-相机分屏预览》
《Android基于Shader的图像处理(14)-仿抖音分屏预览》
《Android Native层 OpenGL ES开发》
《Android java层封装EGL》

-- 从Cocos2d-x 2.x版本开始,Cocos2d-x底层图形渲染使用OpenGL ES2.x新特性可编程着色器(Shader),
Shader的使用流程:
1、创建着色器对象:glCreateShader
2、着色器对象关联着色器代码:glShaderSource
3、把着色器源代码编译成目标代码:glCompileShader
4、验证着色器是否已经变异通过:glGetShaderiv、glGetShaderInfoLog
5、创建一个着色器程序:glCreatePragram
6、把着色器链接到着色器程序中:glAttachShader
7、链接着色器程序:glLinkProgram
8、验证着色器程序是否链接成功:glGetProgramiv、glGetProgramInfoLog
9、使用着色器程序进行定点或片段处理:glUseProgram

-- 着色器运算(Shader Arithmetic)
• 顶点处理器基于32位浮点值工作:Vertex Shader使用浮点表示整数。为了避免32位值,设置Vertex Shader程序的输出varing的精度为mediump或lowp。
• Fragment Shader使用16位浮点值工作:其构成为:sign;5位指数,以抵消15;10位尾数,用一个隐含的最显著1位

-- Shader优化, Shader代码实现了我们的算法,想要大幅降低Shader的耗时,降低图像质量实现减少计算量是最有效的办法。在尽量可能保证质量的基础上进行优化,一般有这些办法:
(1)避免在Shader中使用循环或分支判断语句
(2)避免依赖纹理读取。即,避免在Fragment Shader计算纹理坐标,将计算提前到Vertex Shader,减少计算次数。
(3)避免交换纹理坐标分量。这会造成依赖纹理读取。
(4)避免在Fragment Shader做pow等数据计算。同样的,尽可能将计算提前到Vertex Shader,减少计算次数
(5)使用更少的颜色分量参与计算。选择影响结果的主要颜色分量参与计算,这也是减少计算量的有效方法。
(6)降低数据精度。比如,从Vertex Shader传递到Fragment Shader的纹理坐标精度从highp改成mediump也会降低一些消耗。

 类似资料: