#GLKit框架 GLKit框架的设计目的是为了简化OpenGL/OpenGL ES的应用开发。它的出现加快了OpenGL或OpenGL ES应用程序的开发。使用数学库、背景纹理加载,预先创建着色器效果,以及标准视图和视图控制器来实现渲染循环。 GLKit框架提供了功能和类,可以减少创建新的基于着色器的应⽤程序所需的⼯作量, 或者支持依赖早期版本的OpenGL ES或OpenGL提供的固定函数顶点或⽚段处理的现有 应用程序。

#GLKView 、GLKViewController 在iOS平台下,苹果给我们封装好了GLKViewController这样的一个类,简化了我们通过OpenGL ES渲染图形的工作。

//初始化GLKView
- (instancetype)initWithFrame:(CGRect)frame context:(EAGLContext *)context;//颜色渲染缓冲区格式
@property (nonatomic) GLKViewDrawableColorFormat drawableColorFormat;//深度渲染缓冲区格式
@property (nonatomic) GLKViewDrawableDepthFormat drawableDepthFormat;//模板渲染缓冲区格式
@property (nonatomic) GLKViewDrawableStencilFormat drawableStencilFormat;//多重采样缓冲区格式
@property (nonatomic) GLKViewDrawableMultisample drawableMultisample;//帧缓冲区属性
@property (nonatomic, readonly) NSInteger drawableWidth;    //缓冲区对象宽度
@property (nonatomic, readonly) NSInteger drawableHeight;  //缓冲区对象高度/**
*  GLKViewDelegate必须实现的方法:在这个方法里进行绘图
* - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect;
*/
@property (nullable, nonatomic, assign) IBOutlet id <GLKViewDelegate> delegate;//将底层的FrameBuffer对象绑定到OpenGL ES
- (void)bindDrawable;//删除视图FrameBuffer对象
- (void)deleteDrawable;//绘制视图内容并将其作为图像对象返回
@property (readonly, strong) UIImage *snapshot;//布尔,指定视图是否响应使得视图内容无效的信息
@property (nonatomic) BOOL enableSetNeedsDisplay;//立即重绘
- (void)display;
复制代码

#GLKTextureInfo 使用GLKTextureLoader可以创建加载OpenGL纹理信息:

GLKTextureInfo *textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:nil error:nil];GLKTextureInfo有以下信息:GLuint                      name;        //纹理名称GLenum                      target;    //纹理绑定的目标GLuint                      width;        //加载纹理的宽度GLuint                      height;        //加载纹理的高度GLKTextureInfoAlphaState    alphaState;  //加载纹理中alpha状态GLKTextureInfoOrigin        textureOrigin;  //加载纹理的原点位置BOOL                        containsMipmaps;  //布尔值,加载的纹理是否包含mip贴图
复制代码

#GLKBaseEffect GLKBaseEffect是OpenGL ES提供的一种简单的光照/着色系统,用于基于着色器的渲染。 #####配置光照

//为基元两侧计算光照 (系统去做,开发者来控制开关)
@property (nonatomic, assign)         GLboolean                          lightModelTwoSided;
//计算渲染图元光照使⽤的材质属性
@property (nonatomic, readonly)       GLKEffectPropertyMaterial          *material;
//环境颜⾊色,应⽤用效果渲染的所有图元
@property (nonatomic, assign)         GLKVector4                         lightModelAmbientColor;//第1、2、3个光照属性
GLKEffectPropertyLight              *_light0, *_light1, *_light2;
复制代码

#####配置纹理

//配置第1、2个纹理
GLKEffectPropertyTexture            *_texture2d0, *_texture2d1;
//纹理应用于渲染图元的顺序
NSArray                             *_textureOrder;
复制代码

#####配置雾化

GLKEffectPropertyFog                *_fog;
复制代码

#####配置颜色信息

//表示计算光照与材质交互时是否使用颜色顶点属性
@property (nonatomic, assign)         GLboolean                          colorMaterialEnabled;
//是否使用常量颜色
@property (nonatomic, assign)         GLboolean                          useConstantColor;
//不提供每个顶点颜色数据时使用常量颜⾊
@property (nonatomic, assign)         GLKVector4                         constantColor;
复制代码

#####准备绘制效果

- (void) prepareToDraw;    //准备绘制效果(必须在绘制前写上)
复制代码

#下面演示使用GLKit来画一个图片到屏幕上

配置环境

//配置环境
- (void)setupUpEnv {//初始化上下文context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];if (context == nil) {NSLog(@"content create fail");return;}[EAGLContext setCurrentContext:context];//获取GLKView 设置contextGLKView * view = (GLKView *)self.view;view.context = context;view.delegate = self;//配置视图创建的渲染缓冲区view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;view.drawableDepthFormat = GLKViewDrawableDepthFormat24;//配置背景颜色glClearColor(0, 1, 1, 1);
}
复制代码

###配置顶点数据

// 设置顶点数据数组(顶点坐标、纹理坐标)
- (void)setUpVertexData {//顶点数据和纹理数据都存在一个数组中 ,6个顶点,每五个数据 前三个为xyz顶点坐标  后两个为纹理坐标stGLfloat vertexData [] = {0.6, -0.5, 0.0f,    1.0f, 0.0f, //右下0.6, 0.5, -0.0f,    1.0f, 1.0f, //右上-0.6, 0.5, 0.0f,    0.0f, 1.0f, //左上0.6, -0.5, 0.0f,    1.0f, 0.0f, //右下-0.6, 0.5, 0.0f,    0.0f, 1.0f, //左上-0.6, -0.5, 0.0f,   0.0f, 0.0f, //左下};//将顶点数据copyj到顶点缓冲区 : 这样做会提前分配一块显存,将顶点数据copy进去,这样可以性能更高GLuint bufferID;glGenBuffers(1, &bufferID);         //创建顶点缓冲区的标识符IDglBindBuffer(GL_ARRAY_BUFFER, bufferID);    //绑定顶点缓冲区glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); //将顶点数据copy到顶点缓冲区/**打开读取通道(默认是关闭的,这一步是必须要写的)方法简介 : 上传顶点数据到显存的方法(设置合适的方式从buffer里面读取数据)glVertexAttribPointer(GLuint indx , GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *ptr)* 参数列表:* indx :指定要修改的顶点属性索引值 :比如 GLKVertexAttribPosition代表顶点 GLKVertexAttribTexCoord0代表纹理* size :每次读取的数量 (如position是由3个(x,y,z)组成,而颜色是4个(r,g,b,a),纹理则是2个.)* type :指定数组中每个组件的数据类型。可用的有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值为GL_FLOAT。* normalized :指定当被访问时,固定点数据值是否应该被归一化(GL_TRUE)或者直接转换为固定点值(GL_FALSE)* stride :指定连续顶点属性之间的偏移量。如果为0,那么顶点属性会被理解为:它们是紧密排列在一起的。初始值为0* ptr :指定一个指针,指向数组中第一个属性组件*///顶点坐标数据glEnableVertexAttribArray(GLKVertexAttribPosition);/** 每次读3个数据,即x y z。 顶点偏移量为5:* 第一个顶点从下标0开始,第二个顶点从下标5开始,以此类推。。。* (GLfloat *)NULL + 0 :表示首次读取的位置,因为此时读取是从显存读的  所以不能用数组地址去取  (GLfloat *)NULL表示首地址*/glVertexAttribPointer(GLKVertexAttribPosition , 3, GL_FLOAT,GL_FALSE, 5, (GLfloat *)NULL + 0);//纹理坐标数据glEnableVertexAttribArray(GLKVertexAttribTexCoord0);glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 5, (GLfloat *)NULL + 3);
}
复制代码

###配置顶点数据

//配置纹理
- (void)setUpTexture {NSString * filePath = [[NSBundle mainBundle] pathForResource:@"memory" ofType:@"jpg"];//因为纹理坐标和屏幕坐标是需要翻转的,所以这里需要配置一下映射关系NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@(1),GLKTextureLoaderOriginBottomLeft, nil];GLKTextureInfo * textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:options error:nil];//使用 GLKBaseEffect 完成着色器的工作cEffect = [[GLKBaseEffect alloc] init];cEffect.texture2d0.enabled = GL_TRUE;cEffect.texture2d0.name = textureInfo.name;
}
复制代码

###GLKViewDelegate开始绘图

#pragma mark - GLKViewDelegate
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {glClear(GL_COLOR_BUFFER_BIT);//重要的一步!!![cEffect prepareToDraw];//开始绘制glDrawArrays(GL_TRIANGLES, 0, 6);
}
复制代码

###viewDidLoad里依次调用

    [self setupUpEnv];[self setUpVertexData];[self setUpTexture];
复制代码

运行效果如下:

转载于:https://juejin.im/post/5d22f34fe51d45598611b9d5

OpenGL ES GLKit初探相关推荐

  1. 一文了解 OpenGL ES

    OpenGL ES(OpenGL for Embedded Systems) 是一种免费的跨平台3D图形 API接口,其适用于低功耗设备,可用于嵌入式设备和移动设备(包括手机.车载大屏 和嵌入式电器终 ...

  2. OpenGL ES之GLKit的使用功能和API说明

    GLKit简介 一.GLKit框架说明 GLKit 框架的设计目标是为了简化基于OpenGL/OpenGL ES的应用开发.它的出现加快OpenGL或OpenGL ES应用程序开发. 使用数学库,背景 ...

  3. OpenGL ES 2 o 初探

    简介: OpenGL ES 是 OpenGL 版本的子集,"ES" 是指 Embedded Systems (嵌入式系统),它是移动端的应用,同时也适用于桌面端. OpenGL E ...

  4. 1、OPenGL ES - 简介、iOS中GLKit简单应用

    OPenGL ES -  简介.iOS中GLKit简单应用 一.OPenGL ES 1.简介: OpenGL ES 是以手持和嵌入式为目标的高级的3D图形应用程序编程接口(API),OpenGL ES ...

  5. OpenGL ES之GLSL渲染图片显示的整体流程

    整体思路 本文不采用UIKit的GLKBaseEffect渲染一张图片的显示,而是使用编译链接自定义的着色器(shader).用GLSL语言来实现自定义顶点/片元着色器,并将图形进行简单的渲染显示. ...

  6. 笔谈OpenGL ES(一)

    现在图形类.视频类app越来越多,学习OpenGL ES是很有必要的,作为程序员是有必要做技术积累的.现在做播放器开发的工作,正好也涉及这块,那就好好学一学. CSDN上有套教程不错,OpenGL E ...

  7. OpenGL ES应用开发实践指南:iOS卷

    <OpenGL ES应用开发实践指南:iOS卷> 基本信息 原书名:Learning OpenGL ES for iOS:A Hands-On Guide to Modern 3D Gra ...

  8. OpenGL ES 高级进阶:EGL及GL线程

    大家好,这是我的OpenGL ES 高级进阶系列文章,在我的github上有一个与本系列文章对应的项目,欢迎关注,链接:github.com/kenneycode/- 今天给大家介绍EGL和GL线程, ...

  9. 06-初始OpenGL ES -用GLSL实现画板的功能

    效果图 准备资料 1.下载案例中需要用的资源,地址:https://download.csdn.net/download/lyz0925/12351912: 2.将所需要的资源拖入项目中.如下图: 代 ...

最新文章

  1. 有了四步解题法模板,再也不害怕动态规划!
  2. 【风之语】至贱城市之成都
  3. 谷歌对2021年的六个预测:数据和云技术的革命即将到来
  4. [Java]Thinking in Java 练习2.10
  5. Android图表和图形创建库:EazeGraph
  6. python anaconda下载包_【Python开发】anaconda3 安装python包
  7. python如何卸载模块cmd_使用cmd python模块时,如何使程序正常崩溃?
  8. 第25天多线程、网络编程
  9. 树莓派进阶之路 (016) - 通过595驱动4位LED显示系统时间
  10. 未来码农或可以备份一个自己的大脑
  11. 深入理解BigDecimal
  12. Bash shell编程的语法知识点(1)
  13. 做人好难,做好人更难,还是做猪吧!
  14. kindle索引_Kindle 有哪些鲜为人知的使用技巧?
  15. MSP430G2553学习笔记
  16. (转)中小IT企业项目团队人员配置管理
  17. Linux alarm闹钟函数
  18. 微信集成(帆软报表)
  19. 正则验证邮箱,手机号
  20. 网赚项目分享:八条可以在线上做的副业兼职

热门文章

  1. 玩转oracle 11g(13):命令学习1
  2. 实例49:python
  3. java 图片阴影_Java 为 PPT 中的图形添加阴影效果
  4. fibonacci数列前20项_高考数学二级结论——数列部分
  5. 优麒麟桌面闪烁_稳定性持续增强,优麒麟 19.10.1 发布
  6. 解决使用adb卸载应用失败的问题
  7. 牛客网挑战赛24 青蛙(BFS)
  8. 文件手动删除后 同步到git
  9. 研究人员用数据统计的方法来做文学研究
  10. HDU 1048 [The Hardest Problem Ever] 字符串处理