博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GPU着色器实现实时滤镜
阅读量:6236 次
发布时间:2019-06-22

本文共 1784 字,大约阅读时间需要 5 分钟。

认识着色器

用过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中取到的图片帧来与我们的着色器结合,从来绘制出高性能的滤镜。

转载地址:http://wrwia.baihongyu.com/

你可能感兴趣的文章
PHP定界符<<<的使用方法
查看>>
LeetCode--176--第二高的薪水
查看>>
如何解决开机出现Missing operating system的故障
查看>>
【C#学习笔记】函数重载
查看>>
解除映射错误
查看>>
TOJ 假题之 Cow Brainiacs
查看>>
命令模式(Command Pattern)
查看>>
升级到Ubuntu 11.10遇到的问题
查看>>
二十年后的回眸(8)——晋级的炒更之旅
查看>>
Oracle dataGuard专题:利用冷备创建standby
查看>>
运维工程师的职责和前景
查看>>
小议安全测试【测试帮日记公开课】
查看>>
Red Hat Enterprise Linux 8 Beta 抢先体验
查看>>
objectC 数据类型转换
查看>>
阿里退市,投资人实在应该鼓掌欢迎
查看>>
zabbix企业应用之从数据库提取centos 6.2系统在线天数
查看>>
大学生抄袭,病根在哪?
查看>>
3.VMware vsphere 5.0新体验-安装VMware Center
查看>>
Windows 7的预备知识系列之二:认识Windows 7中的窗口
查看>>
运用Ntop监控网络流量(视频Demo)
查看>>