0

我正在尝试使用 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;
}
4

1 回答 1

0

试试这个..我得到了答案

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        _eaglLayer = (CAEAGLLayer *)self.layer;
        _eaglLayer.opaque = YES;

        _context =[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

        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);
        }        // Initialization code

        glGenRenderbuffers(1, &_colorRenderBuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer);
        [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];

        GLuint framebuffer;
        glGenFramebuffers(1, &framebuffer);
        glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderBuffer);


        glClearColor(1.0,1,0,1.0);
        glClear(GL_COLOR_BUFFER_BIT);
        [_context presentRenderbuffer:GL_RENDERBUFFER];
    }
    return self;
}
+(Class)layerClass{
    return [CAEAGLLayer class];
}
-(void)dealloc
{
    [_context release];
    _context = nil;
    [super dealloc];
}
于 2013-04-20T11:05:43.863 回答