iOS编程高性能之路-GPU着色器实现实时滤镜(2)

iOS编程高性能之路-GPU着色器实现实时滤镜(2)

  (2012-09-10 00:51:10)
标签: 

vsh

 

fsh

 

滤镜

 

着色器

 

ios

 

it

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

opengl es的着色器 有.fsh和.vsh两个文件 这两个文件在被编译和链接后就可以产生可执行程序 与GPU交互
.vsh 是顶点shader 用与顶点计算 可以理解控制顶点的位置 在这个文件中我们通常会传入当前顶点的位置,和纹理的坐标

例如

attribute vec4 position; 

attribute vec4 inputTextureCoordinate;


varying vec2 textureCoordinate;


precision mediump float;

uniform float overTurn;


void main()

{

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 textureCoordinate;

precision mediump float;

uniform sampler2D videoFrame;


vec4 memoryRender(vec4 color)

{

    float gray;

    gray = color.r*0.3+color.g*0.59+color.b*0.11;

    color.r = gray;

    color.g = gray;

    color.b = gray;

    

    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 color;

}


void main()

{

    vec4 pixelColor;


    pixelColor = texture2D(videoFrame, textureCoordinate);

    

    gl_FragColor = memoryRender(pixelColor);

}


varying highp vec2 textureCoordinate 就是从vsh中传过来了纹理坐标

uniform sampler2D videoFrame 是我们真正的纹理贴图

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

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



总结:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值