为啥 glBindFramebuffer(GL_FRAMEBUFFER, 0) 会导致 cocos2D-iphone 出现黑屏?
Posted
技术标签:
【中文标题】为啥 glBindFramebuffer(GL_FRAMEBUFFER, 0) 会导致 cocos2D-iphone 出现黑屏?【英文标题】:Why would glBindFramebuffer(GL_FRAMEBUFFER, 0) result in blank screen in cocos2D-iphone?为什么 glBindFramebuffer(GL_FRAMEBUFFER, 0) 会导致 cocos2D-iphone 出现黑屏? 【发布时间】:2012-07-23 16:58:17 【问题描述】:[iPad-3]-[iOS 5.0]-[Objective-C]-[XCode 4.3.3]-[Cocos2D]-[openGL|ES 2.0]
我正在学习如何使用 openGL|ES 2.0 并偶然发现了帧缓冲区对象 (FBO)
信息: 我正在使用 Cocos2D,它有很多额外的绘图处理。我想这可能与这个问题有关。如果 cocos 的“默认”帧缓冲区与绘制到屏幕的实际默认帧缓冲区不同,这可能会导致错误绘制
我的问题: 在我的“helloworld.m”类的初始化函数中,如果我放置“glBindFrameBuffer(GL_FRAMEBUFFER, 0);”在任何地方,我都会得到一个空白屏幕!
-(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;
我是否遗漏了一些基本而明显的东西?
据我所知,函数“glBindFramebuffer(GL_FRAMEBUFFER, 0);”只需将 Framebuffer 设置为 0 即可应用绘制到屏幕的默认帧缓冲区。
【问题讨论】:
我知道你是新来的。欢迎!表明您的问题已解决的方法是接受答案,而不是将答案放在问题中并在标题中添加“已解决”一词。发布并接受您自己问题的答案是完全可以的。 (您可能需要等待几个小时才能执行此操作;对新用户有一些临时限制。) 我不知道做(解决的)事情是不礼貌的。我已经看过很多次了,所以我认为这是 pplz 为自己做的。我试着回答自己,等了8个小时。我在工作,对这些事情没有耐心。我现在将进行编辑,明天再试一次以获得答案。如果还是不行,那我就离开吧。 我已经编辑了你的最后一行;正如所写,它暗示你没有解决问题的办法。 【参考方案1】:问题是 ios 或 Cocos2D(或两者)都可以有一个独特的帧缓冲区。 该唯一帧缓冲区的句柄将不同于 0,并且每次都可能不同。
要解决这个问题,我必须获取当前 FBO 的句柄,执行我的自定义帧缓冲区内容,然后在完成后重新应用 FBO 的句柄。
创建一个变量来引用原始帧缓冲区对象
GLint oldFBO;
将当前使用的 FBO 的句柄(即“GLint”)分配给变量“oldFBO”
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO);
//here is when you would create or manipulate custom framebuffers.//
之后,你将原来的 FBO 设置为当前的 Framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, oldFBO);
【讨论】:
这快把我逼疯了...谢谢你救了我! 嘎!为这个白痴浪费了半天时间……非常感谢您提供的重要线索。以上是关于为啥 glBindFramebuffer(GL_FRAMEBUFFER, 0) 会导致 cocos2D-iphone 出现黑屏?的主要内容,如果未能解决你的问题,请参考以下文章
glBindFramebuffer 导致 OpenGLES 的性能下降
OpenGL 不会通过调用 glBindFramebuffer(GL_FRAMEBUFFER,0) 渲染到屏幕
使用 GL_DRAW_FRAMEBUFFER 目标时,glBindFramebuffer 会导致“无效操作”GL 错误