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