2017-10-13 87 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的画笔纹理图像,解决了这个问题。我不确定为什么这会起作用,并且仍然会对导致问题的原因提供一些意见。