opengl-es - 为什么 glBindFramebuffer(GL_FRAMEBUFFER, 0) 会导致 cocos2D-iphone 中出现黑屏?

标签 opengl-es screen opengl-es-2.0 framebuffer

[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”类的 init 函数中,如果我放置“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);”只需将帧缓冲区设置为 0 即可应用绘制到屏幕的默认帧缓冲区。

最佳答案

问题是 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);

关于opengl-es - 为什么 glBindFramebuffer(GL_FRAMEBUFFER, 0) 会导致 cocos2D-iphone 中出现黑屏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11617013/

相关文章:

android - 打开/唤醒屏幕一段时间

ios - OpenGL Es 2.0 GLKit 绘制像素

ios - iOS视频处理的最佳实践

java - android opengles 2.0 绘制字符串 2d

ios - swift glGetProgramInfoLog

c++ - OpenGL ES 纹理坐标稍微偏离

从文件中读取图像时,android drawable 会更改屏幕上的大小

ios - OpenGL ES glFragColor 取决于 iOS 中片段着色器的条件

java - 使用 libgdx Actor 类和 SpriteBatch 绘制网格几何体

user-interface - BlackBerry - 可用屏幕的高度,不包括横幅和标题字段