2015-09-23 12 views
8

Khi tôi chạy ứng dụng OpenGL của tôi, tôi nhận được lỗi sau:hiện tại của màu sắc chưa được khởi tạo tập tin đính kèm vấn đề

enter image description here

Tôi googled nhưng không thể nhận được bất kỳ thông tin hữu ích.

Here're một đoạn mã nguồn:

- (void)render:(CADisplayLink*)displayLink { 
    [self.canvas clear]; 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_BLEND); 

    NSInteger mLength = mParticles.count; 
    NSInteger drawCount = 0; 
    NSInteger drawIndex = 0; 
    WQParticle* drawParticle; 
    CGFloat drawX,drawY,drawScale,drawAngle; 
    GLKMatrix4 changeColorMatrix; 
    if (mLength > 0){ 
     glBindFramebuffer(GL_FRAMEBUFFER, FBO); 
     glViewport(0,0,width,height); 
     drawCount = 0; 
     drawIndex = -1; 
     while (drawCount < mLength){ 
      drawParticle = mParticles[drawCount]; 

      if(!(drawParticle.flg && random > 0.5)){ 

       if (drawIndex != drawParticle.texIndex) { 
        glActiveTexture(GL_TEXTURE0); 
        glBindTexture(GL_TEXTURE_2D, (GLuint)(texture[drawParticle.texIndex])); 
        glUniform1i((GLint)uniLocation[1], 0); 
        drawIndex = drawParticle.texIndex; 
       } 

       if(drawParticle.flg){ 
        drawX = drawParticle.posX + (random * 1 - 0.5) * drawParticle.scale * 0.06; 
        drawY = drawParticle.posY + (random * 1 - 0.5) * drawParticle.scale * 0.06; 
        drawScale = drawParticle.scale * (random * 0.4 + 0.8); 
        changeColorMatrix = [self setChangeColorWithDp:drawParticle n:random]; 
        drawX = drawX/drawScale; 
        drawY = drawY/drawScale; 
       }else{ 
        drawX = drawParticle.posX/drawParticle.scale; 
        drawY = drawParticle.posY/drawParticle.scale; 
        drawScale = drawParticle.scale; 
        changeColorMatrix = [self setChangeColorWithDp:drawParticle n:1]; 
       } 
       glUniformMatrix4fv((GLint)uniLocation[2], 1, 0, changeColorMatrix.m); 
       drawAngle = drawParticle.angle; 
       CGFloat drawR = sqrt(drawX * drawX + drawY * drawY); 
       CGFloat oa = 2 * M_PI - acos(drawX/drawR); 
       drawX = cos(oa - drawAngle) * drawR; 
       drawY = sin(oa - drawAngle) * drawR; 

       mMatrix = GLKMatrix4Identity; 
       mMatrix = GLKMatrix4Rotate(mMatrix, drawAngle, 0, 0, 1); 
       mMatrix = GLKMatrix4Scale(mMatrix, drawScale, drawScale, drawScale); 
       mMatrix = GLKMatrix4Translate(mMatrix, drawX, drawY, 0); 
       mvpMatrix = GLKMatrix4Multiply(f_tmpMatrix, mMatrix); 

       glUniform1i((GLint)uniLocation[3], YES); 
       glUniformMatrix4fv((GLint)uniLocation[0], 1, 0, mvpMatrix.m); 
       glDrawElements(GL_TRIANGLES, sizeof(indices), GL_UNSIGNED_BYTE, 0); 
      } 

      if (drawParticle.life > 0) { 
       [mVF getForceFromPosWithPx:drawParticle.posX Py:drawParticle.posY]; 
       [drawParticle setVFupdateWithOutX:mVF.outX OutY:mVF.outY]; 
       drawCount++; 
       continue; 
      } 
      [mParticles removeObjectAtIndex:drawCount]; 
      mLength = mLength - 1; 
     } 
     glBindFramebuffer(GL_FRAMEBUFFER,0); 
    } 

    glBindTexture(GL_TEXTURE_2D, FBOTexture); 
    mMatrix = GLKMatrix4Identity; 
    mvpMatrix = GLKMatrix4Multiply(tmpMatrix, mMatrix); 
    glUniformMatrix4fv((GLint)uniLocation[0], 1, 0, mvpMatrix.m); 
    glUniform1i((GLint)uniLocation[3], NO); 
    glDrawElements(GL_TRIANGLES, sizeof(indices), GL_UNSIGNED_BYTE, 0); 
    [self.canvas.glContext presentRenderbuffer:GL_RENDERBUFFER]; 
} 

Làm thế nào tôi có thể giải quyết này?

+0

Bất kỳ lý do nào bạn không muốn xóa bộ đệm khung trước khi bắt đầu hiển thị, như lỗi được đề xuất? Đặt một 'glClear()' vào đầu phương thức render của bạn, và bạn sẽ được thiết lập tất cả. –

+0

@RetoKoradi '[self.canvas clear];' đã chứa các phương thức 'glClearColor (1.0, 1.0, 1.0, 1.0); glClear (GL_COLOR_BUFFER_BIT); glClearDepthf (1.0);' – Allen

+0

Đoán khác là khung nhìn của bạn hoặc hộp kéo cắt không phải là cùng kích thước với bề mặt hiển thị ứng dụng, vì vậy bạn chỉ xóa/hiển thị cho một tập con của bề mặt cửa sổ. – solidpixel

Trả lời

2

Kiểm tra xem glViewport() có được đặt kích thước của renderpass mà bạn đang hiển thị hay không, và cả glScissor() cũng được đặt thành kích thước đó, hoặc kiểm tra hình cắt kéo được tắt qua glDisable().

Các vấn đề liên quan