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為基礎的模型就這樣了..具體的繪製我們都努力去學習吧.