[OpenGL ES 01]OpenGL ES之初体验

[OpenGL ES 01]OpenGL ES之初体验

罗朝辉 ()

本文遵循“署名-非商业用途-保持一致”创作公用协议

一,什么是 OpenGL ES?

OpenGL ES 是专门为手持设备制定的 3D 规范,它是 OpenGL 的简化版,该规范由khronos.org制定,目前最新规范版本为3.0。OpenGL ES 可以在不同手机系统上实现,也可以在浏览器上实现(Web GL)。目前较新的 iOS 支持OpenGL ES 2.0,在这里,我将介绍如何在 iOS 上使用 OpenGL ES 2.0。

二,在iOS上如何使用OpenGL ES?1,准备工作

1),打开XCode(我使用的是4.2),创建一个 Empty Application。

2),命名为 Tutorial01,选择Device Family为iPhone,保持默认选中的use Automatic Reference Counting来使用自动引用计数。

3),添加需要用到的库,在iOS平台上进行OpenGL ES 开发,OpenGLES.framework和QuartzCore.framework这两个库是必须的,,选中Target:Tutorial01,在Build phase->Link Binary With Libraries中点击 + 号来添加这两个库:

添加完毕,工程结构如下图,你可以把这两个 framework 拖到 Frameworks 文件夹中,谁也不想工程结构乱七八糟的吧?

4),至此,编译运行,模拟器是一片空白的!因为Empty Application模版就是Empty,里面甚至连一个Window都木有。因此,我们需要添加一个 Window。右击 Supporting Files文件夹,选择 New File->User Interface->Window:

输入名称:MainWindow

5),为了让 AppDelegate 与 Window 关联起来,我们还需要在MainWindow.xib中创建一个Object对象。选中MainWindow.xib,向其中拖入一个 Object 对象:

添加完毕,效果如下:

6),然后我们修改该 Object 的Custom Class为 AppDelegate,这样它在 xib 中代表代码中的 AppDelegate了。

7),为了将 Window与App Delegate 关联起来,我们需要在 AppDelegate.h中的代码 window 属性前添加 IBOutlet 修饰符:

@property (strong, nonatomic) IBOutlet UIWindow *window;

8),选中MainWindow.xib,右击 AppDelegate,将Outlet window拖拽到其上方的 Window上,这样AppDelegate中的window就与真实的 Window 关联起来。

9),同样,我们还需要修改File’s Owner的 Custom Class 为UIApplication,使用与8)中同样的拖拽技巧,将 File’s Owner的 delegate 与 App Delegate 关联起来。

10),至此准备工作完毕,不妨编译运行一下,模拟器依然一片空白,那是因为我们还没有在 Window 上添加 view,下面我们将来添加一个 view。

2,设置 OpenGL ES 运行环境

1),虽然 iOS 5在 GLKit 中提供了方便使用 OpenGL ES 的辅助 GLKView,但在这里,我们还是从零开始手工打造我们自己 GL ES view,从而更进一步了解在 iOS 上 OpenGL ES 是使用的。在Tutorial01目录中 New File,选择 User Interface->View作为模版,命名为 OpenGLView:

2),修改 OpenGLView.h为:

#import <UIKit/UIKit.h>#import <QuartzCore/QuartzCore.h>#include <OpenGLES/ES2/gl.h>#include <OpenGLES/ES2/glext.h>@interface OpenGLView : UIView {CAEAGLLayer* _eaglLayer;EAGLContext* _context;GLuint _colorRenderBuffer;GLuint _frameBuffer;}@end

这些变量在后面会有介绍。

3),在 OpenGLView.m 中添加如下函数:

+ (Class)layerClass {[CAEAGLLayer class];}

4),默认的 CALayer 是透明的,我们需要将它设置为 opaque 才能看到在它上面描绘的东西。为此,我们使用匿名 category 技巧,在 OpenGLView.m的开头(在@implementationOpenGLView 的上面)添加匿名 category,并声明私有函数 setupLayer:

OpenGLView()-(void)setupLayer;@end

接着,在 @implementation 与 @end 之间,添加 setupLayer 的实现:

– (void)setupLayer{_eaglLayer = (CAEAGLLayer*) self.layer;// CALayer 默认是透明的,必须将它设为不透明才能让其可见_eaglLayer.opaque = YES;// 设置描绘属性,在这里设置不维持渲染内容以及颜色格式为 RGBA8_eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];}

人生没有彩排,只有现场直播,所以每一件事都要努力做得最好

[OpenGL ES 01]OpenGL ES之初体验

相关文章:

你感兴趣的文章:

标签云: