我想使用OpenGL-ES创建一种纹理天空盒,可以通过触摸进行驱动/旋转。纹理是高分辨率的PNG照片。
这是一个资助项目,我有4个月时间。
我需要去哪里学习如何开发它?我需要购买一本书吗?哪一本?
我只有适度的Objectve-C和Cocoa-touch技能,因为我只建立了一个iPad应用程序。我对OpenGL-ES毫无了解。
由于我对OpenGL ES非常熟悉,因此我尝试了一个演示项目,做了你所描述的大部分内容。具体意图是在OpenGL ES下以最简单的方式执行所有操作,只要性能足够好。
从Apple提供的OpenGL模板开始,我编写了一个新类,其实现文件有很多注释,共122行,可以加载PNG图像作为纹理。我修改了示例视图控制器以按要求绘制天空盒,并使用iPhone普通惯性滚动的版本响应触摸,这意味着编写不到200行(也有注释)的代码。
为了实现这一点,我需要了解:
当然,遵守了普通视图控制器生命周期的说明。例如,在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帖子长度限制,我无法在此处放置大量代码片段,但如果您有任何特定问题,请随时提问。
如果你从零开始学习OpenGL ES会很困难。我建议使用图形引擎来做大部分重活。我目前在使用Ogre3d,从目前的情况看,我可以推荐它:http://www.ogre3d.org/。它拥有天空盒(以及更多),应该很容易上手。
我认为你可以做到这一点,以下是一些帮助你入门的链接:
http://sidvind.com/wiki/Skybox_tutorial
常见问题:nehe.gamedev.net
它们不是专门针对iPhone的,但它们很好地解释了OpenGL。我认为有些人已经将它们移植到手机上了,只是我现在找不到它们。