2011-04-28 5 views
0

안녕하세요, 저는 OpenGLES 렌더링을위한 사용자 정의보기를 작성하고 있습니다. 내가 인터페이스 빌더에서 뷰를 가지고 있고 렌더링 뷰에 클래스를 설정했을 때 작동하도록 만들었지 만 이제는 initWithFrame을 사용하여 뷰를 생성하도록 전환했습니다. (내가보기의 배경색을 설정할 수 있고 OpenGL에서 아무 것도 렌더링 할 수 없다는 것을 알 수있다.) 모든 것이 불려지는 것처럼 보이고 레이어 클래스도 괜찮은 것처럼 보인다. InterfaceBuilder를 사용하여 직접 생성하지 않아도됩니다. 어떤 아이디어? 다음OpenGL ES iPhone에서 IB로 전환하는 initWithFrame

+ (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]; 

} 

내가 알아낼 수 없습니다. 누군가가 저를 도울 수 있다면 그것은 굉장 할 것입니다!

답변

0

여기에서 너무 많이 추측하고 있지만 IB에서 initWithFrame으로 전환하는 단계가 생략되어 있습니다. 즉, 표준 뷰 클래스 대신 사용자 정의보기 클래스를 인스턴스화하는 viewController의 loadView입니다.

+0

어쨌든 나는 initWithFrame으로 만들고 그것을 하위보기로 추가했다. 내가 배경색을 설정하면 나는 볼 수 있다고 말했듯이, 나는 단지 어떤 색의 OpenGL 렌더링도 할 수 없다. –