【问题标题】:Parallax backgrounds in OpenGL ES on the iPhoneiPhone 上 OpenGL ES 中的视差背景
【发布时间】:2010-04-20 02:59:58
【问题描述】:

我基本上在 iPhone 上有一个 2d 游戏,我正在尝试设置以不同速度滚动的多个背景(称为视差背景)。

所以我的想法是使用不同的 z 坐标平面将背景粘贴在前景后面,并让它们比前景(大小)更大以适应,这样整个东西就可以滚动(只是在不同的速度)。

而且(据我所知)我基本上实现了这一点。唯一的问题是它似乎完全忽略了我给它的任何 z 值,或者更确切地说它只是将它们全部归零。我看到了背景(到目前为止,我只测试了一个背景,以保持简单......所以现在我只有一个前景,我想要一个背景以不同的速度滚动),但它与我的滚动 1:1前景,所以它显然看起来不正确,并且大部分都被切断了(因为它更大)。我已经尝试了各种背景的 z 值和各种近/远剪裁平面......它总是一样的。我可能只是做错了一件简单的事情,但我无法弄清楚。我想知道它是否与我在 glVertexPointer 中仅使用 2 个坐标作为前景有关? (当然是我在3的背景)

我会发布一些代码:

这是一些初始设置:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glEnableClientState(GL_VERTEX_ARRAY);
//glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

//transparency
glEnable (GL_BLEND);
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

关于我前景的浮点数组的一点点......它是交错的。对于我的前景,它去顶点 x,顶点 y,纹理 x,纹理 y,重复。这一切都很好。

这是我的 FOREGROUND 渲染:

glVertexPointer(2, GL_FLOAT, 4*sizeof(GLfloat), texes); <br>
glTexCoordPointer(2, GL_FLOAT, 4*sizeof(GLfloat), (GLvoid*)texes + 2*sizeof(GLfloat)); <br>
glDrawArrays(GL_TRIANGLES, 0, indexCount / 4);

背景渲染:

除了这次它去顶点 x、顶点 y、顶点 z、纹理 x、纹理 y 之外,这里相同的钻头,重复。这次记下 z 值。我确实在调试时确保了这个数组中的数据是正确的(得到正确的 z 值)。又一次,它出现了……它并没有像它应该的那样回到很远的地方。

glVertexPointer(3, GL_FLOAT, 5*sizeof(GLfloat), b1Texes);
glTexCoordPointer(2, GL_FLOAT, 5*sizeof(GLfloat), (GLvoid*)b1Texes + 3*sizeof(GLfloat));
glDrawArrays(GL_TRIANGLES, 0, b1IndexCount / 5);

要移动我的相机,我只需执行一个简单的 glTranslatef(x, y, 0.0f);

我不明白我做错了什么,因为这似乎是可以想象的最基本的 3D 功能......更远的东西更小,并且在相机移动时移动速度不会那么快。对我来说不是这样。似乎它应该是非常基本的,甚至不会真正受到我的投影和所有这些的影响(尽管我什至尝试做 glFrustum 只是为了好玩,但没有成功)。请帮忙,我觉得这只是一件愚蠢的事情。如有必要,我会发布更多代码。

【问题讨论】:

标签: iphone opengl-es scroll background


【解决方案1】:

在黑暗中拍摄...

您可能不得不忘记在帧缓冲区初始化程序中设置深度缓冲。

从 Apple 的旧 EAGLView 模板复制和粘贴:

glGenRenderbuffersOES(1, &depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

【讨论】:

  • 我实际上正在使用这个模板。我在 iPhone OS 2.2.1 上进行测试,并且我有 SDK 3.0 或其他东西。您在那里编写的代码嵌入在“if (USE_DEPTH_BUFFER)”语句中,并且我确实将 USE_DEPTH_BUFFER #define'd 设置为 1。我还调试并确保调用了该代码。仍然难倒,但感谢您的建议。我是否忘记了 glEnable 的某些内容?
【解决方案2】:

如果您依赖于混合,则必须按深度顺序绘制,这意味着首先绘制最远(最深)的图层。否则,即使该区域 100% 透明,它们也会在写入 z 缓冲区值时被顶部的层覆盖。

here

【讨论】:

    【解决方案3】:

    我发现我使用的正交投影无法显示更远的东西(如果我在这方面错了,请纠正我)。当我早些时候尝试 glFrustum 时(正如我在问题中所述),我在设置它时做错了。我使用负值作为接近剪切值,我基本上遇到了 1:1 滚动问题,与正交。但我已将其更改为 0.01,它终于开始正确显示(背景显示更远)。

    我的问题已解决,但作为一个附带想法,我现在想知道是否可以在同一框架内混合正交和透视,以及需要什么。因为我宁愿保持前景非常简单和正交(2d),但我希望我的背景以透视深度显示。

    我的想法是这样的:

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f);
    
    //render foreground
    
    glLoadIdentity();
    glFrustum(-1.0f, 1.0f, -1.5f, 1.5f, 0.01f, 1000.0f);
    
    //render backgrounds
    

    我会玩弄这个并评论我的结果,以防有人好奇。对此问题的反馈将不胜感激,尽管从技术上讲,我不再迫切需要这个问题(从这里开始,这只是想法讨论)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多