2017-10-13 92 views
0

我的應用使用OpenGL ES來渲染用戶繪製其簽名的屏幕。 我的代碼一直工作超過3年,但升級到Xcode 9後,我得到了一個奇怪的顏色變化(我在模擬器和設備上繪製的線)。 這些線條具有純紅色,綠色或藍色,現在它們混合了灰色/黑色線。
我對OpenGL瞭解不多,而且我的代碼是通過示例應用程序和教程組合在一起的。使用xcode 9改變繪製顏色的opengles

什麼可能導致這種變化?

這是圖升級到的Xcode 9後:
drawing after upgrading xcode

的代碼來改變顏色:

// Change the brush color 
- (void)changeBrushColor:(NSString *) newColor 
{ 
    SEL setcolor = NSSelectorFromString(newColor); 
    UIColor *nColor = [UIColor performSelector:setcolor]; 

    CGColorRef color = nColor.CGColor; 
    const CGFloat *components = CGColorGetComponents(color); 

    brushColor[0] = (GLfloat) components[0]; 
    brushColor[1] = (GLfloat) components[1]; 
    brushColor[2] = (GLfloat) components[2]; 
    brushColor[3] = (GLfloat) components[3]; 

    if (initialized) { 
     glUseProgram(program[PROGRAM_POINT].id); 
     glUniform4fv(program[PROGRAM_POINT].uniform[UNIFORM_VERTEX_COLOR], 1, brushColor); 
    } 
} 

的代碼來繪製: CGPoint newMidPoint = CGPointMake(X /縮放比例,y /規模);

[currentStroke insertObject:[NSValue valueWithCGPoint:newMidPoint] atIndex:2]; 
    [currentStroke removeObjectAtIndex:0]; 
    [currentStroke removeObjectAtIndex:0]; 
    //NSLog(@" after draw currentstroke %@: ", currentStroke); 


    // Load data to the Vertex Buffer Object & Draw it 
    //glUseProgram(program[PROGRAM_POINT].id); 
    //glBindBuffer(GL_ARRAY_BUFFER, vboId); 
    glBufferData(GL_ARRAY_BUFFER, vertexCount*2*sizeof(GLfloat), vertexBuffer, GL_DYNAMIC_DRAW); 
    //glEnableVertexAttribArray(ATTRIB_VERTEX); 
    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, GL_FALSE, 0, 0); 

    // Draw 
    glDrawArrays(GL_POINTS, 0, (int)vertexCount); 

    // Display the buffer 
    //glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER]; 

初始化代碼:

 - (BOOL)initGL 
     { 
      // Generate IDs for a framebuffer object and a color renderbuffer 
      glGenFramebuffers(1, &viewFramebuffer); 
      g 

    lGenRenderbuffers(1, &viewRenderbuffer); 

      glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); 
      glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); 
      // This cal 

l associates the storage for the current render buffer with the EAGLDrawable (our CAEAGLLayer) 
     // allowing us to draw into a buffer that will later be rendered to screen wherever the layer is (which corresponds with our view). 
     [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(id<EAGLDrawable>)self.layer]; 
     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer); 

     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); 
     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); 


     if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
     { 
      NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); 
      return NO; 
     } 

     // Setup the view port in Pixels 
     glViewport(0, 0, backingWidth, backingHeight); 

     // Create a Vertex Buffer Object to hold our data 
     glGenBuffers(1, &vboId); 

     // Load the brush texture 
     brushTexture = [self textureFromName:@"brush"]; 

     // Load shaders 
     [self setupShaders]; 

     // Enable blending and set a blending function appropriate for premultiplied alpha pixel data 
     glEnable(GL_BLEND); 
     glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

     //moved from draw 
     glUseProgram(program[PROGRAM_POINT].id); 
     glBindBuffer(GL_ARRAY_BUFFER, vboId); 
     glEnableVertexAttribArray(ATTRIB_VERTEX); 

    // //***** for testing ****** 
    // [self sample]; 
    // //***** for testing ****** 

     return YES; 
    } 

回答

0

我終於找到了解決我的問題。我使用了64x64而不是32x32的畫筆紋理圖像,解決了這個問題。我不確定爲什麼這會起作用,並且仍然會對導致問題的原因提供一些意見。