我正在尝试使用 OpenGLES 2.0 显示绿屏,但是当我运行它时,它只是一个黑屏。我不确定我是否正确设置了 nib 文件,但是当我在 appdelegate 中添加 glView 的子视图时,它会从默认的白屏变为黑屏,因此 OpenGLView.m 可能有问题
OpenGLView.m
#import "OpenGLView.h"
@interface openGLView ()
@end
@implementation openGLView
+(Class)layerClass {
return [CAEAGLLayer class];
}
-(void)setupLayer {
_eaglLayer = (CAEAGLLayer*) self.layer;
_eaglLayer.opaque = YES;
}
-(void)setupContext{
EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES2;
_context = [[EAGLContext alloc] initWithAPI:api];
if (!_context) {
NSLog(@"failed to initialize openGLES 2.0 context");
exit(1);
}
if (![EAGLContext setCurrentContext:_context]) {
NSLog(@"Failed to set current OpenGL Context");
exit(1);
}
}
-(void)setupRenderBuffer {
glGenRenderbuffers(1, &_colorRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer);
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
}
-(void)setupFrameBuffer {
GLuint framebuffer;
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderBuffer);
}
-(void)render {
glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
[_context presentRenderbuffer:GL_RENDERBUFFER];
}
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setupLayer];
[self setupContext];
[self setupRenderBuffer];
[self setupFrameBuffer];
[self render];
}
return self;
}
-(void) dealloc {
[_context release];
_context = Nil;
[super dealloc];
}
@end
AppDelegate.m
@implementation AppDelegate
@synthesize glView = _glview;
- (void)dealloc
{
[_glview release];
[_window release];
[super dealloc];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
CGRect screenBounds = [[UIScreen mainScreen] bounds];
self.glView = [[[openGLView alloc] initWithFrame:screenBounds] autorelease];
[self.window addSubview:_glview];
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
return YES;
}