2011-04-12 4 views
0

이상한 문제가 있습니다. 때로는 일어나는 경우도 있으며 그렇지 않은 경우도 있습니다.OpenGl ES iPhone, 이상한 라인

GLfloat 배열에 8 개 항목이 있습니다. EAGLView가 그릴 때 배열의 두 줄뿐만 아니라 추가 줄이 표시됩니다.

enter image description here

EAGLView.m

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

- (id)initWithCoder:(NSCoder*)coder { 


    if ((self = [super initWithCoder:coder])) { 
     CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; 

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

     context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; 

     if (!context || ![EAGLContext setCurrentContext:context]) { 
      [self release]; 
      return nil; 
     } 


    } 
    return self; 
} 


- (void)drawView { 

    int numero=malloc_size(puntosPintar)/sizeof(GLfloat); 

    [EAGLContext setCurrentContext:context]; 

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
    glViewport(0, 0, backingWidth, backingHeight);  

    glClear(GL_COLOR_BUFFER_BIT); 

    glVertexPointer(2, GL_FLOAT, 0, puntosPintar); 

    glEnableClientState(GL_VERTEX_ARRAY); 

    glColor4f(1,1,1,1); 

    glDrawArrays(GL_LINES, 0, numero); 

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 

    free(puntosPintar); 
} 


- (void)layoutSubviews { 
    [EAGLContext setCurrentContext:context]; 

    [self destroyFramebuffer]; 
    [self createFramebuffer]; 
    [self drawView]; 
} 


- (BOOL)createFramebuffer { 

    glGenFramebuffersOES(1, &viewFramebuffer); 
    glGenRenderbuffersOES(1, &viewRenderbuffer); 

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); 

    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 
    if (USE_DEPTH_BUFFER) { 
     glGenRenderbuffersOES(1, &depthRenderbuffer); 
     glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); 
     glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); 
     glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); 
    } 



    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) { 
     NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); 
     return NO; 
    } 


    return YES; 
} 


- (void)destroyFramebuffer { 

    glDeleteFramebuffersOES(1, &viewFramebuffer); 
    viewFramebuffer = 0; 
    glDeleteRenderbuffersOES(1, &viewRenderbuffer); 
    viewRenderbuffer = 0; 

    if(depthRenderbuffer) { 
     glDeleteRenderbuffersOES(1, &depthRenderbuffer); 
     depthRenderbuffer = 0; 
    } 
} 



- (void)dealloc { 


    if ([EAGLContext currentContext] == context) { 
     [EAGLContext setCurrentContext:nil]; 
    } 

    [context release]; 
    [super dealloc]; 
} 

@end 

puntosPintar

puntosPintar=(GLfloat*)malloc(sizeof(GLfloat)*8); 
    puntosPintar[0] = -0.25f; 
    puntosPintar[1] = -1.49f; 
    puntosPintar[2] = -0.1f; 
    puntosPintar[3] = 0.0f; 
    puntosPintar[4] = 0.25f; 
    puntosPintar[5] = -1.49f; 
    puntosPintar[6] = 0.1f; 
    puntosPintar[7] = 0.0f; 

답변

4

당신은 glDrawArrays의 카운트 인수에 '4'를 통과해야한다가, 8 (이 아니다 부동 소수점의 수는 아니고 정점의 수).