2017-10-13 4 views
0

Meine App verwendet OpenGL ES für das Rendern eines Bildschirms, wo der Benutzer seine Unterschrift zeichnet. Mein Code funktioniert seit über 3 Jahren gut, aber nach dem Upgrade auf Xcode 9 bekomme ich eine seltsame Farbänderung in den Linien, die ich zeichne (sowohl auf dem Simulator als auch auf dem Gerät). Die Linien hatten eine reine rote, grüne oder blaue Farbe und jetzt haben sie eine grau/schwarze Linie.
Ich weiß nicht viel über OpenGL und mein Code wurde aus Beispiel-Apps und Tutorials zusammengestellt.openGLES Zeichnung Farbe ändern mit xcode 9

Was könnte diese Änderung verursacht haben?

ist dies die Zeichnung nach zu Xcode Upgrade 9:
drawing after upgrading xcode

Die Codefarbe zu ändern:

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

Der Code zu ziehen: CGPoint newMidPoint = CGPointMake (x/scale, y/Rahmen);

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

init Code:

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

Antwort

0

fand ich endlich eine Lösung für mein Problem. Ich verwendete ein Pinsel-Textur-Bild, das 64x64 gegenüber 32x32 war und das Problem löste. Ich bin mir nicht sicher, warum das funktioniert hat und möchte noch einige Kommentare zu dem, was das Problem verursacht hat.