简介:电脑或者手机上做图像处理有很多方式,但是目前为止最高效的方法是有效地使用图形处理单元,或者叫 GPU。你的手机包含两个不同的处理单元,CPU 和 GPU。CPU 是个多面手,并且不得不处理所有的事情,而 GPU 则可以集中来处理好一件事情,就是并行地做浮点运算。事实上,图像处理和渲染就是在将要渲染到窗口上的像素上做许许多多的浮点运算。
  通过有效的利用 GPU,可以成百倍甚至上千倍地提高手机上的图像渲染能力。如果不是基于 GPU 的处理,手机上实时高清视频滤镜是不现实,甚至不可能的。

EAGLContext:渲染上下文,OpenGL ES 必须有一个可用的上下文才能绘图;

//新建OpenGles上下文self.mContext = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2];GLKView *view = (GLKView *)self.view;//storyboard记得将view对应的类改为GLKViewview.context = self.mContext;view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;//颜色缓冲区格式[EAGLContext setCurrentContext:self.mContext];

创建顶点缓冲对象
第一种方法:未设置索引
顶点数组里包括顶点坐标,OpenGLES的世界坐标系是[-1, 1],故而点(0, 0)是在屏幕的正中间。
纹理坐标系的取值范围是[0, 1],原点是在左下角。故而点(0, 0)在左下角,点(1, 1)在右上角。
OpenGL ES不能绘制多边形,只能绘制点,线,三角形,OpenGL可以绘制多边形,由于我们绘制的图片是一个矩形,又两个三角形构成。

 //顶点数据,前三个是顶点坐标,后面两个是纹理坐标GLfloat vertexArr[] = {-0.74, -0.5, 0,  0.0f, 0.0f, //左下-0.74,  0.5, 0,  0.0f, 1.0f, //左上0.74, -0.5, 0,  1.0f, 0.0f, //右下0.74,  0.5, 0,  1.0f, 1.0f, //右上0.74, -0.5, 0,  1.0f, 0.0f, //右下-0.74,  0.5, 0,  0.0f, 1.0f, //左上};/*glGenBuffers申请一个标识符glBindBuffer把标识符绑定到GL_ARRAY_BUFFER上glBufferData把顶点数据从cpu内存复制到gpu内存glEnableVertexAttribArray 是开启对应的顶点属性glVertexAttribPointer设置合适的格式从buffer里面读取数据*//*创建顶点缓存对象需要3个步骤:1,使用glGenBuffers()生成新缓存对象。2,使用glBindBuffer()绑定缓存对象。3,使用glBufferData()将顶点数据拷贝到缓存对象中。*/GLuint buffer;glGenBuffers(1, &buffer);glBindBuffer(GL_ARRAY_BUFFER, buffer);glBufferData(GL_ARRAY_BUFFER, sizeof(vertexArr), vertexArr, GL_STATIC_DRAW);/*默认情况下,出于性能考虑,所有顶点着色器的属性(Attribute)变量都是关闭的,意味着数据在着色器端是不可见的,哪怕数据已经上传到GPU,由glEnableVertexAttribArray启用指定属性,才可在顶点着色器中访问逐顶点的属性数据。glVertexAttribPointer或VBO只是建立CPU和GPU之间的逻辑连接,从而实现了CPU数据上传至GPU。但是,数据在GPU端是否可见,即,着色器能否读取到数据,由是否启用了对应的属性决定,这就是glEnableVertexAttribArray的功能,允许顶点着色器读取GPU(服务器端)数据。*/glEnableVertexAttribArray(GLKVertexAttribPosition);glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*5, (GLfloat *)NULL + 0);glEnableVertexAttribArray(GLKVertexAttribTexCoord0);glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*5, (GLfloat *)NULL + 3);

第二种方法:设置索引

GLfloat vertexArr[] ={0.74, -0.5, 0.0f,    1.0f, 0.0f, //右下0.74, 0.5,0.0f,    1.0f, 1.0f, //右上-0.74, 0.5, 0.0f,    0.0f, 1.0f, //左上-0.74, -0.5, 0.0f,   0.0f, 0.0f, //左下};GLuint indexVertex[] = {0, 2, 3,0, 1, 2,};self.mCount = sizeof(indexVertex)/sizeof(GLuint);GLuint buffer;glGenBuffers(1, &buffer);glBindBuffer(GL_ARRAY_BUFFER, buffer);glBufferData(GL_ARRAY_BUFFER, sizeof(vertexArr), vertexArr, GL_STATIC_DRAW);GLuint index;glGenBuffers(1, &index);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexVertex), indexVertex, GL_STATIC_DRAW);glEnableVertexAttribArray(GLKVertexAttribPosition);glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*5, (GLfloat *)NULL + 0);glEnableVertexAttribArray(GLKVertexAttribTexCoord0);glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*5, (GLfloat *)NULL + 3);

添加图片及着色器
由于纹理坐标系是跟手机显示的Quartz 2D坐标系的y轴正好相反,纹理坐标系使用左下角为原点,往上为y轴的正值,往右是x轴的正值,所以需要设置一下GLKTextureLoaderOriginBottomLeft。

NSString *filePath = [[NSBundle mainBundle]pathForResource:@"rabbit" ofType:@"png"];NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@(1),GLKTextureLoaderOriginBottomLeft, nil];GLKTextureInfo *textureInfo = [GLKTextureLoadertextureWithContentsOfFile:filePathoptions:optionserror:nil];self.mEffect = [[GLKBaseEffect alloc]init];self.mEffect.texture2d0.enabled = GL_TRUE;self.mEffect.texture2d0.name = textureInfo.name;

图片渲染

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect{glClearColor(0.0f, 0.0f, 1.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);[self.mEffect prepareToDraw];glDrawElements(GL_TRIANGLES, self.mCount, GL_UNSIGNED_INT,0);//glDrawArrays(GL_TRIANGLES, 0, 6);
}

OpenGLES学习(一)图片显示相关推荐

  1. ckfinder 图片预览 有的显示有的不显示_Python学习之图片显示

    利用OpenCV读取并显示一张图片 # This is a sample OpenCV script. 遇到的小坑: 1.报错: ImportError: No module named cv2 第一 ...

  2. 基于arduino的ESP32 学习笔记(六)LVGL文件系统移植,中文字库和图片显示

    前言 本文的目的是为了给将要制作的ESP32手环做技术储备 记录移植LVGL文件系统,制作LVGL中文字库,将图片和字库放在SD卡里,通过移植好的LVGL文件系统,读取SD卡中的中文字库和图片,并显示 ...

  3. 解决mintUI的swipe组件图片显示不了并延伸学习到了学习ui框架的方法

    最近想写一个移动端的前端vue项目,mint-UI是比较符合的前端框,我本来准备用它的轮播图组件swiper,但是觉得官网上描述的太模糊的,然后搜搜搜,看了一个视频,上面说可以去github官网上搜索 ...

  4. 学习QT之显示SVG格式图片

    SVG的英文全称是Scalable Vector Graphics,即可缩放的矢量图形.它是有万维网联盟在2000年8月制定的一种新的二维矢量图形格式,也是规范中的网格矢量图形标准,是一个开发的图形标 ...

  5. 深度学习中图片数据增强方法

    简 介: 在深度学习中需要对图像进行不同的处理.本文对比了基于Numpy以及Paddle.vision.transforms函数中对于图片处理的效果. 关键词: 图像预处理,cv2,paddle #m ...

  6. 如何在python中显示电脑中的图片-python如何实现多个图片显示在屏幕上?

    pygame的三个方法(屏幕上显示需要的图片) yuhu102319582018-12-16 python将多幅图片显示在一张图片上 wugui1111116282018-06-15 iOS 图片显示 ...

  7. 服务器上有图片但是app不显示不出来,网络app图片显示不出来的

    网络app图片显示不出来的 内容精选 换一换 接入CDN加速后,用户访问网站或者APP资源依然很慢.域名是否接入CDN加速是否命中CDN缓存是否跨运营商和跨省缓存规则设置是否合理加速资源是否预热是否客 ...

  8. C#(WinForm)上传图片保存到数据库和从数据库读取图片显示到窗体

    1 //浏览图片 2 3 private void btnUp_Click(object sender, EventArgs e) 4 5 { 6 7 OpenFileDialog ofd = new ...

  9. html图片在wps中不显示文字大小,WPS文字插入图片显示不全怎么办 WPS文字插入图片显示不完整的解决方法...

    在wps文字编辑文档时,如果我们在使用时插入图片显示不全,这种情况我们该怎么解决呢?想必有不少的用户遇到过这种问题,下面教程之家网为大家带来WPS文字插入图片显示不完整的解决方法,不知道怎么解决的朋友 ...

  10. word文档里插入图片显示不完整,只显示一半,怎么处理?

    word文档里插入图片显示不完整,只显示一半,怎么处理? 目录 word文档里插入图片显示不完整,只显示一半,怎么处理? 1.把鼠标光标放置图片的末尾,然后点击鼠标右键,选择[段落]选项 2.在[缩进 ...

最新文章

  1. MySQL-锁表处理
  2. iOS开发 开发者证书申请及上架流程
  3. TabHost的使用(一)
  4. 【新年快乐】网易云信春节期间服务公告
  5. hdu 1241 Oil Deposits 解题报告
  6. Small Multiple(AtCoder-3621)
  7. 第一个云原生步骤:自动化构建、测试和部署(二)
  8. 算法32---图片平滑器
  9. 成为一名优秀架构师有标准吗?这12点或许能带给你一些启发
  10. 通过Keepalived实现Redis Failover自动故障切换功能[实践分享]
  11. java poi excel模板变量_Java Web之POI操作Excel2016模板
  12. 专业PDF转换Word/PPT/Excel工具:AnyBizSoft PDF Converter绿色便携版
  13. PHP接入萤石云开放平台直播功能
  14. elasticsearch 学习之 搭建简单的elasticsearch多节点服务器
  15. 矩阵理论第一章—线性空间与子空间,空间分解与维数定理
  16. 3D建模,打印正当时
  17. R 填充数据集中的缺失值
  18. 最新Thinkphp仿素材火整站源码修复版 带很多文章
  19. 手工彻底清除各种顽固性 Trojan Horse ***的方法
  20. data whale_data_analysis_task2_数据可视化

热门文章

  1. 编写函数 int fac(int x)计算 x!的值。在主函数中输入 n 和 m 的值,通过调用函数 fac 计算m Cn 的值(要求分别用递归和非递归的方法编写函数 fac)
  2. 人工智能入门:第一章 人工智能课程介绍及环境配置
  3. 电脑操作系统(Androidx86、Windows、Linux)说明
  4. mysql biginteger java_java.math.BigInteger cannot be cast to java.lang.Integer以及mysql升级的问题...
  5. arm linux 关闭防火墙,linux的防火墙及arm与虚拟机共享
  6. 罗杨美慧 20190919-3 效能分析
  7. 5G对广播电视的影响以及应用-论文
  8. 支付宝SDK集成服务端(java)
  9. 数学建模算法与应用:预测模型(3)案例: SARS 疫情对经济指标影响
  10. 什么是5G消息?有什么应用价值?如何开通服务?