2012-07-23 24 views
10

[iPad-3] - [iOS 5.0] - [Objective-C] - [XCode 4.3.3] - [Cocos2D] - [OpenGL | ES 2.0]Tại sao glBindFramebuffer (GL_FRAMEBUFFER, 0) dẫn đến màn hình trắng trong cocos2D-iphone?

Tôi đang học cách sử dụng OpenGL | ES 2.0 và đã vấp ngã trên các đối tượng khung đệm (FBO) s

Thông tin: Tôi đang làm việc với Cocos2D có nhiều thao tác vẽ lạ mắt để vẽ. Tôi tưởng tượng rằng điều này có thể được liên kết với vấn đề này. Nếu 'mặc định' đệm khung cho cocos là khác nhau từ bộ đệm khung mặc định thực tế thu hút vào màn hình, điều này có thể dẫn đến một mis-vẽ

Vấn đề của tôi: trong hàm init của "helloworld tôi. m "class, nếu tôi đặt" glBindFrameBuffer (GL_FRAMEBUFFER, 0); " bất cứ nơi nào, tôi chỉ đơn giản là có được một màn hình trống!

-(id) init 
{ 
if((self=[super init])) 
{ 

CGSize winSize = [CCDirector sharedDirector].winSize; 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 


CCSprite * spriteBG = [[CCSprite alloc] initWithFile:@"cocos_retina.png"]; 
spriteBG.position = ccp(512,384); 
//[self addChild:spriteBG z:1]; 

[self scheduleUpdate]; 
_mTouchDown = NO; 


_mSprite = [CCSprite spriteWithTexture:_mMainTexture]; 
_mSprite.position = ccp(512,384); 
[self addChild:_mSprite]; 

self.isTouchEnabled = YES; 

} return self;} 

Tôi có thiếu cái gì cơ bản và hiển nhiên không?

Theo như tôi đã học, hàm "glBindFramebuffer (GL_FRAMEBUFFER, 0);" đơn giản chỉ cần thiết lập Framebuffer là 0, áp dụng framebuffer mặc định để vẽ lên màn hình.

+0

Tôi thấy bạn mới ở đây. Chào mừng bạn! Cách để chỉ ra rằng vấn đề của bạn đã được giải quyết là chấp nhận câu trả lời, không đặt câu trả lời trong câu hỏi và thêm từ "Giải quyết" vào tiêu đề. Nó hoàn toàn ok để gửi và chấp nhận một câu trả lời cho câu hỏi của riêng bạn. (Bạn có thể phải chờ một vài giờ để làm điều này; có một số hạn chế tạm thời đối với người dùng mới.) –

+0

Tôi không biết rằng đó là nghi thức tồi tệ để làm điều (đã giải quyết). Tôi đã nhìn thấy nó được thực hiện rất nhiều lần như thế này vì vậy tôi cho rằng đó là cách pplz chỉ làm điều đó cho chính họ. Tôi đã cố gắng tự trả lời, chờ đợi 8 tiếng. và tôi đang làm việc và không có kiên nhẫn cho những thứ như vậy. Tôi sẽ chỉnh sửa ngay bây giờ và thử lại vào ngày mai để đưa ra câu trả lời. nếu nó vẫn không hoạt động, thì tôi sẽ để nó lại. – JThora

+0

Tôi đã chỉnh sửa dòng cuối cùng của bạn; như được viết, nó ngụ ý rằng bạn không có một giải pháp cho vấn đề. –

Trả lời

24

Vấn đề là iOS hoặc Cocos2D (hoặc cả hai) có thể có bộ đệm khung duy nhất. Bộ xử lý của bộ đệm khung duy nhất sẽ khác 0 và có thể khác nhau mỗi lần.

Để giải quyết vấn đề này, tôi phải nắm lấy tay cầm của FBO hiện tại, làm công cụ chỉnh sửa Framebuffer tùy chỉnh của tôi và sau đó áp dụng lại xử lý của FBO sau khi hoàn tất.

Tạo một biến để tham khảo các Khung gốc Buffer Object

GLint oldFBO; 

Gán tay cầm FBO của đang được sử dụng (mà là một 'tia sáng lóe lên') để biến 'oldFBO'

glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO); 

//here is when you would create or manipulate custom framebuffers.// 

Sau đó, Bạn đặt FBO ban đầu là Framebuf hiện tại fer

glBindFramebuffer(GL_FRAMEBUFFER, oldFBO); 
+1

CÓ! Cảm ơn bạn! Điều này cũng hoạt động trên Android. – Tyguy7

+0

Điều này khiến tôi phát điên ... Cảm ơn vì đã cứu tôi! – Matferib

+0

GAH! Mất một nửa ngày để sự ngu ngốc này ... cảm ơn nhiều vì những đầu mối quan trọng. –