【问题标题】:Design advice for OpenGL ES 2 / iOS GLKitOpenGL ES 2 / iOS GLKit 的设计建议
【发布时间】:2011-10-29 16:52:20
【问题描述】:

我想使用新的 GLKit 框架构建一个应用程序,我需要一些设计建议。我想创建一个应用程序,最多可以显示几千个“砖块”(具有非常简单几何形状的对象)。大多数将具有相同的纹理,但多达几百个将具有独特的纹理。我希望砖块每隔几秒钟出现一次,移动到位然后保持原位(在世界坐标中)。我想模拟一个位置和方向由用户手势控制的相机。

我需要的建议是关于如何组织代码。我希望我的模型是一个积木集合,其中包含的不仅仅是与它们相关的图形数据:

  • 将类似视图的对象与每个手柄几何体、纹理等相关联是否有意义?
  • 每块砖都应该有自己的顶点缓冲区吗?
  • 每个人都应该有自己的 GLKBaseEffect 吗?
  • 我正在寻求帮助来组织在设置过程中应该做什么对象,然后进行渲染。

我希望我可以接近典型的 MVC 模式,我的 GLKViewController 观察模型状态变化,根据手势控制眼睛坐标等等。

如果您能给我一些建议或引导我找到一个好的例子,我将不胜感激。提前致谢!

【问题讨论】:

    标签: ios opengl-es glkit


    【解决方案1】:

    关于模型,我认为类似于UIImageUIImageView 之间关系的方法是合适的。所以每种类型的砖块都有一个顶点缓冲区GLKBaseEffect、纹理和其他任何东西。然后每个砖块可能会出现多次,就像多个UIImageViews 可能使用相同的UIImage 一样。就保持多个参考框架而言,构建一个基本上等同于UIView 的层次结构实际上是一个非常好的主意,每个层次结构都包含一些相对于父级的变换,并且其中一种能够显示模型。

    从 GLKit 文档中,我认为保留所需相机类型(以及对象位置)的最佳方法是将其直接存储为 GLKMatrix4GLKQuaternion — 这样您就不会派生相机的其他描述中的矩阵或四元数(加上位置),而不是矩阵或四元数直接是相机的存储。

    这两个类都内置了应用旋转的方法,GLKMatrix4 可以直接处理平移。因此,您可以直接将相关手势映射到这些功能。

    在以这种方式处理相机时,我能想到的唯一不太明显的事情是您希望将 inverse 发送到 OpenGL 而不是事物本身。假设您使用矩阵,原因是如果您想在该位置绘制对象,您将直接加载矩阵然后绘制对象。当您在与相机相同的位置绘制对象时,您希望它最终被绘制在原点。因此,您必须为相机加载的矩阵是您要加载以在该位置绘制的矩阵的倒数,因为您希望两者相乘成为单位矩阵。

    我不确定您的积木模型有多复杂,但如果它们简单且完全独立移动,您可能会遇到性能瓶颈。处理 OpenGL 时的一般规则是,您一次可以提交的几何图形越多,一切进行得越快。因此,例如,在大多数游戏中,一个完全静态的世界比一个所有东西都可以独立移动的世界更容易有效地绘制。如果您正在绘制六面立方体并独立移动它们,那么您可能会看到比预期更差的性能。

    如果您有任何一起移动的砖块,那么将它们绘制为单个几何图形会更有效。如果您有任何绝对不可见的砖块,那么甚至不要尝试绘制它们。从 iOS 5 开始,GL_EXT_occlusion_query_boolean 可用,这是一种将一些几何体传递给 OpenGL 并询问其中是否可见的方法。您可以在实时场景中使用它,方法是构建描述数据的层次结构(如果您直接遵循 UIView 类比,您将拥有该结构),计算或存储每个视图的一些边界几何图形,并且仅在以下情况下进行绘制遮挡查询表明至少有一些边界几何图形是可见的。通过遵循这种逻辑,您通常可以在提交之前很久就丢弃大量几何图形。

    【讨论】:

    • 感谢您的好建议。正如您所建议的,我将根据 UIImageView 类比重新审视它。到目前为止,我已经做出了一些选择:1)选择将 GL 东西从模型中分离出来,2)由于砖块可以共享几何图形,因此将 glGenBuffer 和 glBufferData 放在类级别。 3)到目前为止,对我有用的是视图控制器拥有的单个基本效果,但作为渲染参数传递,因为 vc 迭代场景中的砖块,调用每个砖块进行渲染。在渲染中,砖块将其局部变换与效果合成,然后调用 glDrawArrays。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多