OpenGL在普通PC机编程中是非常有用且通用的一种库.而对于嵌入式设备则需要使用其精简库,称之OpenGL ES.当然在这里要写这篇文章不是因为自己已经懂它的使用.而是自己正在了解一些关于它的基本使用.
现在开始我们的基本处理了...
我们只需要在上图选择View-Based Application来创建一个基于iphone的工程就可以了.没有必要一需要提供的框架.好了,继续创建好我们的工程吧..
好了,赶紧添加如图的两个框架吧.接下来我们要开始我们的代码工作了...
先创建一个基于UIView的类吧.并把他加载到创建工程的ViewController上去吧.这样我们就可只在我们自定义的View上进行操作了(比如我的就创建了一个glView类).快点噢...有些操作我们这里就省了(比如头文件的包含)...
接下来,开始我们真正的OpenGL ES工作了.
在glView.h文件中定义个几个成员变量,具体如下图:
然后,进入glView.m文件中去吧.
这里我们首先重载一个类
+(Class)layerClass {
return [CAEAGLLayer class];
}
接下来,我们进入初始化函数中去吧:
+(Class)layerClass {
return [CAEAGLLayer class];
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
// displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkView)];
// [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
CAEAGLLayer *eagllayer = (CAEAGLLayer *)self.layer;
eagllayer.opaque = YES;
eagllayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGB565, kEAGLDrawablePropertyColorFormat, nil];
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer]) {
[self release];
return nil;
}
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFamebuffer);
glViewport(0.0, 0.0, backingWidth, backingHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0.0, self.frame.size.width, 0.0, self.frame.size.height, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewFamebuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
}
return self;
}
代码如上述,在这里我们需要做的就是设置绘制环境,开启或者禁用一些功能.
上面我们用到了一个函数其实现如下:
- (BOOL)createFramebuffer {
glGenFramebuffersOES(1, &viewFamebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFamebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
NSLog(@"%d,%d,%d,%d",viewFamebuffer,viewRenderbuffer,backingWidth,backingHeight);
if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
return NO;
}
return YES;
}
这样,我们的设置就做好了,现在我们需要做的就是根据我们的需要进行OpenGL ES的图形处理操作了.当然,在我们结束的时候记得要对绘制环境和OpenGL ES的状态机进行删除处理.代码大致为:
- (void)deleteFramebuffer
{
if (context) {
[EAGLContext setCurrentContext:context];
if (defaultFramebuffer) {
glDeleteFramebuffers(1, &defaultFramebuffer);
defaultFramebuffer = 0;
}
if (colorRenderbuffer) {
glDeleteRenderbuffers(1, &colorRenderbuffer);
colorRenderbuffer = 0;
}
}
}
和
[context release];
好了,一个以OpenGL ES为基础的模型就这样了..具体的绘制我们都努力去学习吧.