Skybox OpenGL ES在iPhone和iPad上的应用

3
我需要为iOS创建一个虚拟导览工具,这是一个考古应用程序:用户可以在历史建筑内或参观考古挖掘时打开它。不需要主观的末日观点:只需要一个天空盒。该应用程序将有一个兴趣点(POI)列表。每个POI都有自己的天空盒。
我想使用OpenGL-ES创建一种纹理天空盒,可以通过触摸进行驱动/旋转。纹理是高分辨率的PNG照片。
这是一个资助项目,我有4个月时间。
我需要去哪里学习如何开发它?我需要购买一本书吗?哪一本?
我只有适度的Objectve-C和Cocoa-touch技能,因为我只建立了一个iPad应用程序。我对OpenGL-ES毫无了解。
3个回答

10

由于我对OpenGL ES非常熟悉,因此我尝试了一个演示项目,做了你所描述的大部分内容。具体意图是在OpenGL ES下以最简单的方式执行所有操作,只要性能足够好。

从Apple提供的OpenGL模板开始,我编写了一个新类,其实现文件有很多注释,共122行,可以加载PNG图像作为纹理。我修改了示例视图控制器以按要求绘制天空盒,并使用iPhone普通惯性滚动的版本响应触摸,这意味着编写不到200行(也有注释)的代码。

为了实现这一点,我需要了解:

  • 从PNG中获取像素数据的CoreGraphics方法
  • 如何设置PROJECTION堆栈以获得具有正确宽高比的透视投影
  • 如何操作MODELVIEW堆栈,以确保根据成员变量使场景进行二轴旋转(第一人称射击或Google StreetView风格),并确保我定义的立方体几何体不会明显与近裁剪平面相交
  • 如何指定顶点位置和纹理坐标给OpenGL
  • 如何指定OpenGL应该在顶点之间构造三角形
  • 如何设置OpenGL纹理参数以仅提供纹理的一个层次
  • 如何跟踪触摸以操作指定旋转的成员变量,包括一点点机械学来给出惯性旋转

当然,遵守了普通视图控制器生命周期的说明。例如,在viewDidLoad上加载纹理并在viewDidUnload上释放,以确保此视图控制器与可能的内存警告友好地播放。

主要观察结果是,除了了解Objective-C的信号机制之外,大部分都是C语言。您主要使用C数组和引用来进行C函数调用,无论是OpenGL还是CoreGraphics。因此,编写此代码的先决条件是熟练掌握C,而不仅仅是Objective-C。

CoreGraphics相关的东西有点乏味,但只需要阅读文档来弄清楚每种类型的事物如何关联到下一个(没有真正令人困惑的内容)。只需记住你需要一个数据提供程序来获取PNG数据,然后可以从该数据提供程序创建图像,并创建一个使用你自己分配的内存的位图上下文,将图像绘制到上下文中,然后释放除了你自己分配的内存以外的所有内容,留下结果。这个结果可以直接上传到OpenGL。这是相对简短的样板文件,但OpenGL没有PNG的概念,而CoreGraphics没有方便的方法将事物推入OpenGL。

我假设纹理在磁盘上的大小是合适的。实际上,这意味着假设它们沿每条边都是2的幂次方大小。我的纹理为512x512。

OpenGL纹理管理很容易;只需要阅读手册来学习有关纹理名称、名称分配、纹理参数和上传图像数据的信息。更多的例行公事,更多的是知道正确的函数而不是管理直观的飞跃。

对于向OpenGL提供几何数据,我只是完全写出了数组。我猜你需要一点空间思维,但在纸上勾画出一个三维立方体并对角落进行编号会很有帮助。这里有三个相关的数组:

  • 顶点位置
  • 与每个顶点位置相对应的纹理坐标
  • 引用顶点位置并定义几何形状的索引列表

在我的代码中,我使用了24个顶点,将立方体的每个面视为逻辑上的单个物体(因此有六个面,每个面有四个顶点)。为简单起见,我仅使用三角形来定义几何形状。当你刚开始时,向OpenGL提供这些内容实际上非常麻烦;一旦犯了错误,程序通常会在OpenGL驱动程序深处崩溃,而不会给出任何关于你做错了什么的提示。最好一次性构建一点。

关于能够承载OpenGL内容的UIView,我基本上使用了苹果直接提供的OpenGL模板中的基本内容。我所做的唯一更改是明确禁用任何尝试使用OpenGL ES 2.x的功能。对于这个任务来说,1.x已经足够了,因此我们首先通过不提供两种可选的渲染路径来获得简单性,其次是ES 2.x路径会更加复杂。ES 2.x是完全可编程化的管道,具有像素和顶点着色器,但在ES领域中,固定管道被完全删除。因此,如果你想要一个,则必须提供自己的正常矩阵堆栈替代品,必须编写顶点和片段着色器来执行“三角形与纹理”等操作。

触摸跟踪并不特别复杂,基本上只需要我理解视图棱台如何工作以及触摸在Cocoa Touch中如何传递即可。在完成其他所有操作后,这部分应该相当容易。

值得注意的是,我需要实现的数学知识非常简单,实际上只涉及触摸跟踪。假设您想要一个类似于Google Maps的视图,意味着我可以完全依赖OpenGL内置的旋转功能。在任何时候,我都没有显式地处理过矩阵。

因此,编写这个项目需要多长时间取决于您自己对C语言和CoreGraphics的信心以及您对于有时在漆黑中编写代码的满意度。因为我知道自己在做什么,所以整个过程只花了两到三个小时。

我会尝试找个地方上传这个项目,让你可以浏览一下它的外观是否陌生。这可能会给你一个很好的想法,即你能否在项目的时间范围内实现符合所有需求的东西。

我将视图控制器保留为仅具有一个视图,即OpenGL视图。但是,普通的iPhone混合规则仍然适用于你的项目,你可以很容易地在上面放置普通控件。你可以在mediafire 上获取我的小实现。由于StackOverflow帖子长度限制,我无法在此处放置大量代码片段,但如果您有任何特定问题,请随时提问。


2
我注意到样例项目中的惯性旋转对手指抬起时的速度理解过于严格。它在模拟器中运行得很完美,但在设备上却不太行。不过我认为这并不是问题的根本原因,所以我会将其保留。同样地,我也没有在我的EAGLView版本中实现Retina显示屏支持——这主要涉及到普通的Cocoa Touch内容,因此我认为这也不是完全相关的事情。 - Tommy
Tommy,请通过我的邮件联系我。我想亲自感谢你的帮助。 - microspino
Tommy,有人试图下载你的天空盒实现:http://stackoverflow.com/questions/10212991/skybox-with-opengl-es-on-ios-no-glkit-ios-5-0 ,但似乎Mediafire已将该文件删除。你介意重新在那里或其他地方上传你的项目吗?这真的可以帮助他们。 - Brad Larson
自那时起,我已经换了电脑和国家,但很可能仍然在家里有一份副本;我会检查并希望重新上传,尽管我想适应GLKit可能是更明智的方式。我猜把它放在GitHub或类似的地方可能是避免这种问题的永久方法。 - Tommy
汤米:自回答发布以来已经有一段时间了。但是你最终是否找到了可以分享的文件呢?谢谢。 - Unheilig
显示剩余2条评论

2

如果你从零开始学习OpenGL ES会很困难。我建议使用图形引擎来做大部分重活。我目前在使用Ogre3d,从目前的情况看,我可以推荐它:http://www.ogre3d.org/。它拥有天空盒(以及更多),应该很容易上手。


1

我认为你可以做到这一点,以下是一些帮助你入门的链接:

http://sidvind.com/wiki/Skybox_tutorial

常见问题:
(我想贴上直接链接,但是stackoverflow不允许我这样做)
请参考stackoverflow上的2859722和2297564。
一些可以帮助制作纹理的程序和技巧:
spacescape 这里有一些很好的OpenGL教程。

nehe.gamedev.net

它们不是专门针对iPhone的,但它们很好地解释了OpenGL。我认为有些人已经将它们移植到手机上了,只是我现在找不到它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接