OpenGL ES GLSL图片加载及纹理翻转
2020-08-01 本文已影响0人
吕建雄
OpenGL ES加载图片流程:
![](https://img.haomeiwen.com/i10517766/11e637e6ffdaa4d1.png)
1、创建图层
创建特殊图层:CAEAGLLayer
注意:需要重写View的layerClass方法,将其返回的图层从CALayer替换成CAEAGLLayer;
![](https://img.haomeiwen.com/i10517766/6b4720f9353c39db.png)
![](https://img.haomeiwen.com/i10517766/8e228a4738dd91ae.png)
2、创建上下文
![](https://img.haomeiwen.com/i10517766/5a768ad8aede40cf.png)
3、清空缓存区
![](https://img.haomeiwen.com/i10517766/12bd5e23a5cda1d7.png)
4、设置RenderBuffer(渲染缓存区)
![](https://img.haomeiwen.com/i10517766/db4cc3a8d355624b.png)
5、设置FrameBuffer(帧缓存区)
![](https://img.haomeiwen.com/i10517766/5e56c708df1ff089.png)
6、渲染
![](https://img.haomeiwen.com/i10517766/222ea22a2772fba5.png)
![](https://img.haomeiwen.com/i10517766/f9c3fec92d6659c9.png)
![](https://img.haomeiwen.com/i10517766/d01d51da380d765e.png)
具体第6步渲染代码,可以进入OpenGL ES加载图片源码下载代码,查看draw方法中的实现细节;
关于纹理解压缩,纹理解压缩使用的是CoreGraphic,因为纹理解压缩比较耗时,所以一般都是在异步线程对其进行解压缩,图片解压缩原理是:对图片进行重新绘制,得到一张新的解压缩后的位图。其中,用到的核心函数是:CGBitmapContextCreate
![](https://img.haomeiwen.com/i10517766/2618a4a91581ce4f.png)
![](https://img.haomeiwen.com/i10517766/2eb459066ef63d4c.png)
![](https://img.haomeiwen.com/i10517766/9e14ad039876aae8.png)
鉴于画布坐标起点为左下,而UIView坐标体系起点为作上,所以绘制出图片后,图片是倒置的,那么如何解决图片倒置呢?
答案是:最常用的方法是,解压缩图片是,将图片源文件翻转
![](https://img.haomeiwen.com/i10517766/33033a2cca7daeeb.png)
CGContextTranslateCTM(spriteContext, rect.origin.x, rect.origin.y);
![](https://img.haomeiwen.com/i10517766/f7c450315d6258f9.png)
CGContextTranslateCTM(spriteContext,0, rect.size.height);
![](https://img.haomeiwen.com/i10517766/7d78b4d1a8f609ee.png)
CGContextScaleCTM(spriteContext,1.0, -1.0);
![](https://img.haomeiwen.com/i10517766/874d591360d04406.png)
CGContextTranslateCTM(spriteContext, -rect.origin.x, -rect.origin.y);
CGContextDrawImage(spriteContext, rect, spriteImage);
![](https://img.haomeiwen.com/i10517766/739986f6217e526e.png)
![](https://img.haomeiwen.com/i10517766/15f191cb9fde16c7.png)