Cocos2D 应用程序中 OpenGL ES 3D 视图的缓冲区问题



我正在尝试在iPad上的Cocos2D应用程序中插入OpenGL ES 3D视图。我对这些框架比较陌生,所以我基本上在我的 CCLayer 中添加了这些行:

CGRect rScreen;
// some code to define the bounds and origin of my frame
EAGL3DView * view3d = [[EAGL3DView alloc] initWithFrame:rScreen] ;
[[[CCDirector sharedDirector] openGLView] addSubview: view3d];
[view3d startAnimation]

我用于 3D 部件的代码基于 Apple 开发人员的示例代码:http://developer.apple.com/library/mac/#samplecode/GLEssentials/Introduction/Intro.html我所做的唯一更改是以编程方式创建我的视图(没有xib文件,initWithCoder -> initWithFrame...),并且我还将EAGLView类和文件重命名为EAGL3DView,以免干扰Cocos2D附带的EAGLView。

现在进入我的问题:当我运行这些时,我收到"OpenGL 错误0x0502 -[EAGLView swapBuffers]",3D 视图正确显示,但否则屏幕完全呈粉红色。

我在 Cocos2d EAGLView 中进入了 swapBuffers 函数,结果发现唯一重要的代码块是这个:

if(![context_ presentRenderbuffer:GL_RENDERBUFFER_OES])
    CCLOG(@"cocos2d: Failed to swap renderbuffer in %sn", __FUNCTION__);

顺便说一句,它没有输入"if"条件(presentRenderbuffer 不返回空值,但不正确,因为 CHECK_GL_ERROR() 之后给出了0x0502错误)。

所以我知道我的 3D 视图对 OpenGL ES 渲染缓冲区的某种不正确覆盖(因为 Cocos2d 也使用 OpenGL ES),导致 Cocos2D 视图无法正常工作。这就是我到目前为止得到的,我无法确切地弄清楚需要做什么才能修复它。那你怎么看?

希望这只是一个新手问题...

像素食者

我认为您要做的正确的方法是:

  1. 创建您自己的自定义CCSprite/CCNode类;

  2. 将 Apple 示例中使用的所有 GL 代码放入该类(即重写该类的drawvisit方法)。

如果你想尝试让两个GL视图很好地协同工作,你可以尝试阅读这篇文章,它将解释如何将不同的缓冲区与你的视图相关联。

至于第一种方法,看看这篇文章和这篇文章。

确实,第一种方法可能更复杂(取决于 Apple 示例如何执行 open gl),但将使用更少的内存,并且比第二种方法更优化。

相关内容

最新更新