【问题标题】:Buffer issue with an OpenGL ES 3D view in a Cocos2D appCocos2D 应用程序中 OpenGL ES 3D 视图的缓冲区问题
【发布时间】:2012-07-05 09:04:20
【问题描述】:

我正在尝试在 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 Developer 的示例代码:http://developer.apple.com/library/mac/#samplecode/GLEssentials/Introduction/Intro.html 我所做的唯一更改是以编程方式创建我的视图(没有 xib 文件,initWithCoder -> initWithFrame ...),我还将 EAGLView 类和文件重命名为 EAGL3DView,以免干扰 Cocos2D 附带的 EAGLView。

现在解决我的问题:当我运行这些程序时,我收到“-[EAGLView swapBuffers] 中的 OpenGL 错误 0x0502”,3D 视图可以正确显示,但其他情况下会显示完全粉红色的屏幕。

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

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

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

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

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

像素兽

【问题讨论】:

  • 听起来您正在尝试设置两个单独的 OpenGL 视图。如果在 iOS 上可行,我不会推荐它。

标签: opengl-es cocos2d-iphone buffer


【解决方案1】:

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

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

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

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

至于第一种方法,看看这个postthis one

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

【讨论】:

  • 我想我想保持我展示的那种结构(在 CCDirector 中创建一个子视图),因为我在应用程序中插入了一个 PDF 阅读器和一个电影播放器​​,它只是工作美好的。在我看来,CCSprites 只是带有图像的贴纸,您可以在屏幕上粘贴(SDL 方式),但也许我错了? edit 非常感谢您的链接,这似乎正是我所需要的。我会调查的!
  • 事实是 OpenGL 管道比已经为插入其他视图而设计的其他视图要“精致”得多。这就是为什么我给出的链接为每个 OpenGL 视图处理不同的缓冲区的原因。当然,这将在内存方面付出代价。另一方面,CCNode 是您可以覆盖由 cocos2d 完成的打开 GL 绘图的地方。我将在我的答案中添加一些链接。无论如何,我希望它有所帮助。
  • 我已经研究了多缓冲区解决方案,但我仍然需要弄清楚如何使其工作:我确实有 2 个不同的缓冲区,但问题是我必须在“同一个地方”使用glBindRenderbuffer(GL_RENDERBUFFER,...),我认为这就是导致问题发生的原因。似乎我在创建缓冲区后附加缓冲区的方式有一些误解。我将研究 CCNode 解决方案,它确实看起来有点复杂,但看起来它在任何情况下都可以工作。非常感谢您的帮助。
  • glBindRenderbuffer(GL_RENDERBUFFER, ...) 的第二个参数是缓冲区的“名称”,因此您应该能够将它们分开。你可以显示你的代码......另外,检查这个链接:cocos2d-iphone.org/forum/topic/1932
  • 确实应该。但事实并非如此 :D 我想我还是要进入 CCNode 方向。应该没事。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多