OpenGL ES iPhone переключается с IB на initWithFrame - PullRequest
0 голосов
/ 29 апреля 2011

Эй, ребята, я пишу собственный вид для рендеринга OpenGLES. Я получил это, когда у меня было представление в конструкторе интерфейса и установил класс для моего представления рендеринга, но теперь я переключился на создание представления с initWithFrame. (Обратите внимание, что я могу установить цвет фона для вида и увидеть его, я просто не могу ничего визуализировать в OpenGL, даже не чистый цвет) Кажется, все вызывается, и класс слоя тоже выглядит нормально, просто по некоторым причинам не работает вне непосредственного создания его с помощью InterfaceBuilder. Есть идеи?

У меня есть этот установочный код:

+ (Class) layerClass
{
    return [CAEAGLLayer class];
}

- (id)initWithCoder:(NSCoder*)coder 
{
    if (self = [super initWithCoder:coder]) 
    {
        [self setupView];
    }
    return self;

}

- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        [self setupView];
    }   
    return self;
}

- (void)setupView
{
    CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;

    eaglLayer.opaque = YES;
    eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];

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

    if (!_context || ![EAGLContext setCurrentContext:_context])
    {
        NSLog(@"Error could not set context");
        [self release];
    }

    _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(renderView:)];
    _displayLink.paused = YES;
    _displayLink.frameInterval = FPS;

    [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

    [EAGLContext setCurrentContext:_context];

    [self setup];
}

А потом код компоновки.

- (void)layoutSubviews 
{
    [EAGLContext setCurrentContext:_context];
    [self destroyBuffers];
    if (![self createBuffers]){
        NSLog(@"Failed to create framebuffer!");
    }

    [self resumeRendering];
}

И некоторый код рендеринга:

- (void)renderView:(CADisplayLink*)sender
{
    [EAGLContext setCurrentContext:_context];

        glBindFramebuffer(GL_FRAMEBUFFER, _viewFrameBuffer);

        glClearColor(0.5, 0.5, 0.5, 1.0);

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     



        GLenum attachments[] = {GL_DEPTH_ATTACHMENT, GL_COLOR_ATTACHMENT0};
        glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 2, attachments);


        glBindRenderbuffer(GL_RENDERBUFFER, _viewRenderBuffer);


    [_context presentRenderbuffer:GL_RENDERBUFFER];

}

Я не могу понять, почему ничто не рендерится, поскольку все то же самое называют. Если кто-нибудь может мне помочь, это было бы здорово!

1 Ответ

0 голосов
/ 29 апреля 2011

Возможно, здесь слишком много спекуляций, но переход от IB к initWithFrame пропущен, т. Е. LoadView в вашем viewController, где вы будете создавать экземпляр своего пользовательского класса представления вместо стандартного класса представления.

...