OpenGL ES 2/iOS GLKit的设计建议

OpenGL ES 2/iOS GLKit的设计建议,ios,opengl-es,glkit,Ios,Opengl Es,Glkit,我想使用新的GLKit框架构建一个应用程序,我需要一些设计建议。我想创建一个应用程序,将提供多达几千块“砖”(具有非常简单的几何体的对象)。大多数会有相同的纹理,但多达几百个会有独特的纹理。我希望砖块每隔几秒钟出现一次,移动到位,然后(在世界坐标系中)保持原位。我想模拟一个摄像头,其位置和方向由用户手势控制 我需要的建议是关于如何组织代码。我希望我的模型是一个砖块的集合,其中包含的不仅仅是与其相关的图形数据: 将类似视图的对象与每个控制柄几何体、纹理等相关联是否有意义 每个砖块都应该有自己的顶

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

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

  • 将类似视图的对象与每个控制柄几何体、纹理等相关联是否有意义
  • 每个砖块都应该有自己的顶点缓冲区吗
  • 每个都应该有自己的GLKBaseEffect吗
  • 我正在寻找帮助组织什么对象应该做什么,在安装过程中,然后渲染
我希望我能接近典型的MVC模式,用我的GLKViewController观察模型状态的变化,根据手势控制眼睛坐标,等等


如果你能给我一些建议或给我一个好的例子,我将不胜感激。提前谢谢

关于模型,我认为类似于
UIImage
UIImageView
之间关系的方法是合适的。因此,每种类型的砖都有一个顶点缓冲区,
glkbaseffect
,纹理和其他任何东西。每个砖可能会出现多次,就像多个
uiimageview
可能使用相同的
UIImage
一样。就保持多个参考帧而言,实际上构建一个本质上等同于
UIView
的层次结构是一个非常好的主意,每个层次结构都包含一些相对于父对象的变换,并且一个排序能够显示模型

从GLKit文档中,我认为保存您想要的相机类型(以及对象位置)的最佳方法是将其直接存储为
GLKMatrix4
GLKQuaternion
-这样您就不会从相机的其他描述中导出矩阵或四元数(加上位置),相反,矩阵或四元数直接是相机的存储

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

在用这种方式处理相机时,我能想到的唯一一件稍微不明显的事情是,您希望将发送到OpenGL,而不是对象本身。假设你使用一个矩阵,推理是如果你想在那个位置画一个对象,你可以直接加载矩阵,然后画这个对象。当在与摄影机相同的位置绘制对象时,希望最终在原点绘制对象。因此,你必须为相机加载的矩阵是你在那个位置绘制的矩阵的倒数,因为你希望这两个矩阵相乘,成为单位矩阵

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


如果您有任何协调移动的砖块,那么将它们作为一块几何体绘制会更有效。如果你有任何明显看不见的砖块,那就不要试着画它们。从iOS 5开始,
GL\u EXT\u occlusion\u query\u boolean
可用,这是一种将一些几何图形传递给OpenGL并询问其中任何几何图形是否可见的方法。您可以在实时场景中通过构建描述数据的层次结构(如果您直接遵循
UIView
类比,您已经拥有了这些数据)来使用它,计算或存储每个视图的某些边界几何图形,并且仅当遮挡查询表明至少某些边界几何图形可见时才进行绘制。通过遵循这种逻辑,您通常可以在提交几何图形之前很久就丢弃大量几何图形。

谢谢您的建议。我将按照您的建议,从UIImageView类比的角度重新审视它。到目前为止,我已经做了一些选择:1)选择将GL内容与模型分离,2)因为砖块可以共享几何体,所以将glGenBuffer和glBufferData放在类级别。3) 到目前为止,对我有效的是视图控制器拥有的单个基本效果,但在vc迭代场景中的砖块并调用每个砖块进行渲染时,将其作为渲染参数传递。在渲染中,砖将其局部变换与效果的局部变换合成,然后调用glDrawArrays。