认识着色器

用过opengl的同学对着色器应该不会陌生,但对与iOS终端设备的开发者,对于图形图像有着深入了解的人不多,本人也只是个初学者,对于opengl es2.x才引入的着色器也是初步认识,WWDC的专题讲座有一节就是讲opengl es的新特性的 结合AVFoundation那一节我们还是可以学到不少东西的。

opengl es的着色器 有.fsh和.vsh两个文件 这两个文件在被编译和链接后就可以产生可执行程序与GPU交互

.vsh 是顶点shader 用与顶点计算 可以理解控制顶点的位置在这个文件中我们通常会传入当前顶点的位置,和纹理的坐标

例如

attribute  vec4
 
varying  vec2
 
;
 overTurn;
 
void
{
gl_Position = position;
   if (overTurn>0.0){
      textureCoordinate =  vec2(inputTextureCoordinate.x,overTurn-inputTextureCoordinate.y);
  
   else
      textureCoordinate =  vec2(inputTextureCoordinate.x,inputTextureCoordinate.y);
}

attribute 外部传入vsh文件的变量 每帧的渲染的可变参数 变化率高 用于定义每个点

varying 用于 vsh和fsh之间相互传递的参数

precision mediump float 定义中等精度的浮点数

uniform 外部传入vsh文件的变量 变化率较低 对于可能在整个渲染过程没有改变 只是个常量

在main()当overTurn大于0的时候 函数里面做的事情就是将纹理y轴反转

.fsh 是片段shader在这里面我可以对于每一个像素点进行重新计算 从而达到我们滤镜效果

varying  highp  vec2
;
 videoFrame;
 
vec4 memoryRender(vec4color)
{
   float
   gray = color.r*0.3+color.g*0.59+color.b*0.11;
  
  
  
   
   color.r +=color.r*1.5;
   color.g =color.g*2.0;
   
   if(color.r >  255.0)
   color.r =  255.0;
   if(color.g >  255.0)
   color.g =  255.0;
   
   return
}
 
void
{
   vec4
 
  
   
  
}

varyinghighpvec2textureCoordinate就是从vsh中传过来了纹理坐标

uniformsampler2DvideoFrame是我们真正的纹理贴图

texture2D(videoFrame,textureCoordinate) 将纹理中的每个像素点颜色取出到pixelColor

我们可以用memoryRender(pixelColor)将我们取到像素点重新加工

总结:

对于着色器的编程并不是很困难,完全是C的语法但是debug比较麻烦,对于类型的约束也很严格 必须是相同类型的才能进行算术运算。我们理解了这两个文件之后就可以发挥我们的想象对纹理图片做出各种的处理。 了解如何编写着色器之后 我们就要在下篇开始了解如何把AVFoundation中取到的图片帧来与我们的着色器结合,从来绘制出高性能的滤镜。