iOS开发OpenGL新手入门

作者: 庞海礁的个人空间 | 来源:发表于2015-11-05 17:22 被阅读4477次

转载请注明出处:http://www.olinone.com/

写在前头,好久没有更新博客,感谢老朋友的再次来访,同时也欢迎新朋友~

说起OpenGL,相信大不多数朋友都不会陌生,或多或少都有接触。本文不属于OpenGL提高篇,主要目的在于帮助新手更快熟悉iOS中如何使用OpenGL,关于这方面的介绍,网上也有很多,本文主要任务在于整理,介绍稍有偏重。这里有比较完整的Demo,可以协助大家更快上手

OpenGL版本

iOS系统默认支持OpenGl ES1.0、ES2.0以及ES3.0 3个版本,三者之间并不是简单的版本升级,设计理念甚至完全不同,在开发OpenGL项目前,需要根据业务需求选择合适的版本。这方面的介绍不少,不再展开。在学习OpenGL代码的时候也需要知道它对应着哪个版本,在ES1中执行ES2代码是看不到任何效果的,你可以在初始化EAGLContext时指定ES版本号

EAGLContext*context=[[EAGLContextalloc]initWithAPI:kEAGLRenderingAPIOpenGLES1];

OpenGL坐标系

OpenGL坐标系不同于UIKit坐标系,其实它是这样的

除了方向,还有一点需要注意,默认情况各个方向坐标值范围为(-1,1),而不是UIKit中的(0,320)。当绘制点(320,0),它并不会出现在屏幕右上角。在ES1中,可以通过以下代码将坐标系转化为熟悉的(320,480)

-(void)glkView:(GLKView*)viewdrawInRect:(CGRect)rect{

glViewport(0,0,rect.size.width*2,rect.size.height*2);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrthof(0,320,0,480,-1024,1024);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

——————————————————olinone出品——————————————————

猥琐的分割线过后,接下来说说iOS中如何使用OpenGL

GLKViewController & GLKView

机智的码农是不是已经发现这两个对象, 为了方便大家更快的开发,系统为OpenGL提供了简单的封装,继承GLKViewController定义自己的ViewController,GLKViewController的view为GLKView类,GLKView的delegate定义了绘制回调函数

-(void)glkView:(GLKView*)viewdrawInRect:(CGRect)rect

GLKViewController定义数据刷新函数,当子类实现-(void)update方法,glkViewControllerUpdate方法将不再被调用

-(void)glkViewControllerUpdate:(GLKViewController*)controller

HJGLKViewControllerDemo模拟了GLKViewController方法实现,有兴趣的童鞋可以查看GLKViewController内部实现机制。需要补充一点,默认情况下,GLKViewController渲染RunLoop并非NSRunLoopCommonModes,而是NSDefaultRunLoopMode,因此在UIKit中使用GLKViewController,当滑动界面时,OpenGL是不会渲染的,为了解决这个问题,可以使用HJGLKViewController替换GLKViewController,HJGLKViewController中默认渲染RunLoop使用NSRunLoopCommonModes模式

EAGLContext

在介绍选择版本时已经提到EAGLContext,与UIKit中CGContextRef相似,EAGLContext相当于OpenGL绘制句柄或者上下文,在绘制试图之前,需要指定使用创建的上下文绘制

[EAGLContextsetCurrentContext:view.context];

当一个APP可能存在多个EAGLContext时,需要处理并存冲突等问题,比如大家所熟知的GPUImage,都会使用到EAGLContext。因此,在使用中要记得及时释放。有兴趣的朋友可以看看这篇文章

Draw

OpenGL绘制本文就不做介绍,HJGLKViewControllerDemo中有大量的示例,顺便推荐几篇相关文章

1、详解第一个OpenGL程序

2、西蒙iPhone-OpenGL ES 中文教程专题

3、Cocos2d源码

小贴士:当App退到后台时, 切记暂停OpenGL绘制,否则可能导致crash


后记:iOS-Developer-Documents-Chinese是国内第一个苹果文档翻译组织,欢迎有志翻译苹果官方文档的朋友加入,QQ群:486111671

相关文章

  • iOS 开发 OpenGL 新手入门

    写在前面 最近发现公司的代码里面含有大量的 OpenGL 代码. 所以想学点关于 OpenGL 的语法, 以便可以...

  • iOS开发OpenGL新手入门

    转载请注明出处:http://www.olinone.com/ 写在前头,好久没有更新博客,感谢老朋友的再次来访,...

  • 初识GLKit

    GLKit 框架是为了简化iOS上OpenGL ES的开发,提供的基于OpenGL ES的iOS框架。 实现思路:...

  • OpenGL_ES GLKit

    1. 简介 基于OpenGL / OpenGL ES进行简化设计的开发框架,使得iOS上使用OpenGL变得容易。...

  • OpenGL ES学习 - 着色器

    iOS开发之OpenGL ES学习01 -- Hello Triangle GLSL前一篇主要是学习OpenGL的...

  • iOS新手入门课外阅读

    ?知识库 iOS新手入门 iOS笔试题 iOS面试题 iOS开发知识整理合集 1年=小学 2年=初中 3年=高中 ...

  • GLKit的API解析

    GLKit框架的设计是为了简化iOS开发者基于OpenGL/OpenGL ES的应用开发,应用该框架提供的功能和类...

  • OpenGL学习--基础学习

    首先知道OpenGL/OpenGL ES/Metal 都是利用GPU芯片高效渲染图形图像,图形API 是iOS开发...

  • 音视频开发:OpenGL + OpenGL ES + Metal

    音视频开发涉及的三种API,OpenGL篇主要是进行基本知识学习,OpenGL ES是当前iOS开发的主流的框架,...

  • OpenGL ES--入门热身

    本身大多内容都来自 《OpenGL ES应用开发实践指南 iOS卷》。使用OpenGL ES大多时候是要用到缓存....

网友评论

  • 红枫叶HM:请问一下,我现在想学习下OpenGL , 我应该学习哪个版本比较合适?ES1,ES2,还是ES3?
  • 静亚:请教个问题,我的父view上有个OpenGL封装的view,用于播放视频,服务器抛给上层的YUV数据,我用非主线程接收,视频播放不出来,用主线程可以,但是特别卡,我的问题是:opgenl用的是gpu渲染,是不是不用在主线程,我有点疑惑,不知道该怎么改。能不能解答下。多谢
  • 7f1247cf4734:请教下,“在UIKit中使用GLKViewController,当滑动界面时,OpenGL是不会渲染的"这句话怎么理解呢?滑动界面是指什么?谢谢~
    VicLeeZhen:@jefby_plus 作者提到runloop的两种模式,NSRunLoopCommonModes和NSDefaultRunLoopMode。在UIScrollView执行拖动操作时,会将Run Loop切换成NSEventTrackingRunLoopMode模式,在这个过程中,默认的NSDefaultRunLoopMode模式中注册的事件是不会被执行的,所以要换成NSRunLoopCommonModes,这个模式不会受滑动影响。

本文标题:iOS开发OpenGL新手入门

本文链接:https://www.haomeiwen.com/subject/rdhchttx.html