本文介紹在iOS下通過(guò)OpenGL ES簡(jiǎn)單渲染一個(gè)視圖出來(lái)诚纸。
OpenGLView.h
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#include <OpenGLES/ES2/gl.h>
#include <OpenGLES/ES2/glext.h>
@interface OpenGLView : UIView {
EAGLContext *context;
GLuint colorRenderBuffer;
GLuint framebuffer;
}
@end
OpenGLView.m
#import "OpenGLView.h"
@implementation OpenGLView
//設(shè)置OpenGLView 的layer層為CAEAGLLayer
+ (Class)layerClass {
return [CAEAGLLayer class];
}
- (void)setup {
// 創(chuàng)建一個(gè)管理上下文
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
// 設(shè)置其為當(dāng)前OpenGL 渲染的管理上下文
[EAGLContext setCurrentContext:context];
// 創(chuàng)建渲染緩沖區(qū)
glGenRenderbuffers(1, &colorRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderBuffer);
// 創(chuàng)建幀緩沖區(qū)
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
// 將渲染緩沖區(qū)和幀緩沖區(qū)關(guān)聯(lián)
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderBuffer);
// 將渲染緩沖區(qū)和layer關(guān)聯(lián)在一起(OpenGL ES渲染緩存對(duì)象綁定到layer上)
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
// 檢測(cè)幀對(duì)象是否創(chuàng)建成功
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
}
// 清除顏色緩沖區(qū)
glClearColor(1, 1, 0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
// 將渲染緩沖區(qū)呈現(xiàn)出來(lái)
[context presentRenderbuffer:GL_RENDERBUFFER];
}
- (void)didMoveToSuperview {
[super didMoveToSuperview];
[self setup];
}
@end
ViewController.m
#import "ViewController.h"
#import "OpenGLView.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
OpenGLView *view = [[OpenGLView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[self.view addSubview:view];
}
@end