ios - OpenGL ES 2/iOS GLKit 的设计建议

标签 ios opengl-es glkit

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

我需要的建议是关于如何组织代码。我希望我的模型是砖 block 的集合,这些砖 block 所关联的不仅仅是图形数据:

  • 将类似 View 的对象与每个 handle 几何形状、纹理等相关联是否有意义?
  • 每 block 砖都应该有自己的顶点缓冲区吗?
  • 每个人都应该有自己的 GLKBaseEffect 吗?
  • 我正在寻求帮助来组织什么对象在设置期间应该做什么,然后是渲染。

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

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

最佳答案

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

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

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

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

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

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

关于ios - OpenGL ES 2/iOS GLKit 的设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7940261/

相关文章:

安卓区域监控?

opengl - 片段着色器并为纹理着色

java - Android OpenGL ES 1 : Filling display with a quad

ios - 带有旋转表面的 OpenGL ES 2.0 工件

ios - OpenGL ES 2.0 中的半透明

xcode4.2 - 为什么我的 OpenGL ES 2.0 程序只绘制一条线而不是一组线? (GLKit 或 OpenGL)

iphone - 如何在iOS上触摸图像透明部分的 ImageView 后面?

ios - 在 iOS Metal 中重用具有不同统一参数的像素着色器

java - Android OpenGL ES读取纹理像素

iOS 应用因 UIWebView 被拒绝