2014-11-16 43 views
0

我有一個在iOS 6和7上運行正常的孩子繪圖應用程序。現在嘗試如何在iOS 8.1上運行應用程序,我發現只有一個bug。OpenGL圖層在黑色上presentRenderBuffer

繪圖上下文被正確初始化,但是當我繪製一條線時,突然背景變黑(而不是白色默認值),但是正確繪製了線條,並使用了不同的着色器(鉛筆,筆刷,標記)。 ..)

這裏就是屏幕變黑

- (void)renderLineFromPoint:(CGPoint)start toPoint:(CGPoint)end 
{ 
static GLfloat*  vertexBuffer = NULL; 
static NSUInteger vertexMax = 64; 
NSUInteger   vertexCount = 0, 
count, 
i; 

[EAGLContext setCurrentContext:context]; 
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); 

// Convert locations from Points to Pixels 
CGFloat scale = self.contentScaleFactor; 
start.x *= scale; 
start.y *= scale; 
end.x *= scale; 
end.y *= scale; 

// Allocate vertex array buffer 
if(vertexBuffer == NULL) 
    vertexBuffer = malloc(vertexMax * 2 * sizeof(GLfloat)); 

// Add points to the buffer so there are drawing points every X pixels 
count = MAX(ceilf(sqrtf((end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y))/kBrushPixelStep), 1); 
for(i = 0; i < count; ++i) { 
    if(vertexCount == vertexMax) { 
     vertexMax = 2 * vertexMax; 
     vertexBuffer = realloc(vertexBuffer, vertexMax * 2 * sizeof(GLfloat)); 
    } 

    vertexBuffer[2 * vertexCount + 0] = start.x + (end.x - start.x) * ((GLfloat)i/(GLfloat)count); 
    vertexBuffer[2 * vertexCount + 1] = start.y + (end.y - start.y) * ((GLfloat)i/(GLfloat)count); 
    vertexCount += 1; 
} 

// Load data to the Vertex Buffer Object 
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 
// glUseProgram(program[PROGRAM_POINT].id); 
glDrawArrays(GL_POINTS, 0, vertexCount); 

// Display the buffer 
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER]; 

self.mustSave = YES; 
} 

代碼這是initGL代碼

- (BOOL)initGL 
{ 
// Generate IDs for a framebuffer object and a color renderbuffer 
glGenFramebuffers(1, &viewFramebuffer); 
glGenRenderbuffers(1, &viewRenderbuffer); 

glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); 
// This call 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); 

// For this sample, we do not need a depth buffer. If you do, this is how you can create one and attach it to the framebuffer: 
// glGenRenderbuffers(1, &depthRenderbuffer); 
// glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); 
// glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight); 
// glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer); 

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:kStrokePatternPencil]; 

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

return YES; 
} 

是否有任何問題的智慧h我忽略的iOS 8?

回答

1

鑑於您沒有調用glClear,我在猜測您期望幀緩衝區的內容能夠跨幀保留。在iOS上的OpenGL ES中,情況並非總是如此,它可能取決於GPU和iOS版本。當幀緩衝區沒有保存時​​,它會像你描述的那樣變黑。

看到這個鏈接:Working with EAGLContexts。具體標題爲:

eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:TRUE], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; 

(重要的部分:如果您使用CAEAGLLayer渲染你的OpenGL ES的內容,那麼你可以設置保留的財產像這樣「將結果呈現給核心動畫」

是否將kEAGLDrawablePropertyRetainedBacking設置爲true)

+0

如果確實啓用了保留的備份,則會在移動GPU上發揮顯着的性能。構建渲染器通常會更好,以便它可以在每個幀上重新繪製整個場景。 – rickster

+0

對不起,我避免粘貼initGL方法,其中我用這個屬性初始化上下文,但是我正在做。 – Rotten