2017-10-13 5 views
0

Mon application utilise OpenGL ES pour rendre un écran où l'utilisateur dessine sa signature. Mon code fonctionne correctement depuis plus de 3 ans, mais après la mise à niveau vers Xcode 9, j'obtiens un étrange changement de couleur dans les lignes que je dessine (à la fois sur le simulateur et sur l'appareil). Les lignes utilisées pour avoir une couleur rouge, verte ou bleue pure, et maintenant ils ont une ligne grise/noire mélangée.
Je ne sais pas grand-chose sur OpenGL et mon code a été mis en place à partir d'exemples d'applications et de tutoriels.opengles dessin de couleur changeant avec xcode 9

Qu'est-ce qui a pu causer cette modification?

Ceci est le dessin après mise à jour vers Xcode 9:
drawing after upgrading xcode

Le code pour changer la couleur:

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

Le code pour dessiner: CGPoint newMidPoint = CGPointMake (x/échelle, y/échelle);

[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]; 

Code init:

 - (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; 
    } 

Répondre

0

J'ai finalement trouvé une solution à mon problème. J'ai utilisé une image de texture de brosse qui était 64x64 contre 32x32 et qui a résolu le problème. Je ne sais pas pourquoi cela a fonctionné et j'aimerais quand même avoir des commentaires sur ce qui a causé le problème.