我对iOS上的OpenGL ES还是很陌生,并且有一个宠物项目,最好将其描述为实质上试图在iOS上创建更原始的Stellarium版本。

我正在设法加载大约一个点。 9000个顶点(每个顶点代表夜空中可见的星星的当前位置),并且通过将正确的模型旋转矩阵传递给顶点着色器,它们可以根据一天中的时间和用户的位置实时移动。换句话说,数学不是问题,EAGLView和EAGLView的基本设置,各种缓冲区和着色器编译等也不是问题,在这里,我基本上遵循Ray Wenderlich的this教程。

计算顶点位置以使所有顶点都位于一个不可见球体的表面上,该球体在位置(0,0,0)周围具有任意半径,从而模拟了夜空。

最终,我希望能够实现基本的拖动/收缩手势,以将观察者的视点(位于位置0,0,0处)和“缩放”更靠近球体以查看更多细节,例如星号。

我努力的部分如下

1)投影矩阵:在上述场景下,关于围绕哪种投影选择的专家建议?我正在努力理解平截头体,但是认为这是要走的路。我将如何实现“缩放”更紧密?

2)每颗星的形状:当前,这是一个顶点,在屏幕上产生一个点。施加星形纹理的最佳方法是什么?

3)我的顶点阵列中最终会有一些顶点保持不动,例如一个显示方位角和高度的天体网格,即它们不应像星星一样旋转。如何将旋转矩阵应用于某些顶点,而不能应用于其他顶点?可以通过将glDrawElements()分为几个部分来实现?

最佳答案

  • 通常使用辅助函数来计算投影矩阵。例如,gluPerspective。如果您想实现缩放,则可以调整FOV(较小/较大的值将放大/缩小)。通常,缩放还可以通过修改视图矩阵(同样,通常使用辅助函数来计算)来实现,这取决于您使用哪种方法(或组合)。
  • 要应用纹理,GL有一个特殊的片段着色器输入变量 gl_PointCoord ,可用于在GL_POINT基元上轻松映射纹理(请参阅GL ES 2.0规范,第3.3节“要点”)。您还可以编写一个几何着色器,将点转换为四边形,并编写一个“标准”片段着色器-尽管这可能需要更多工作。
  • 将用不同的统一数据(例如,模型/视图/投影矩阵)处理的几何拆分成单独的绘图调用可能会更容易。通常,这是大多数游戏引擎如何渲染对象的方式,除非预期的绘制调用数量变大,然后它们频繁实现某种批量绘制。但是,如果您只有两组,那应该不是很大的问题。
  • 07-26 03:57