2014-09-26 97 views
0

我必须不使用GLKit。我的项目的主要部分是用C++编写的,Objective-C中的另一部分是创建EAGLContext并设置主视图,我用它来绘制。的OpenGL ES 3.0的iOS主循环

现在,我得到了主屏幕和一些几何图元。他们都得出这样的(不是在循环中,只有一次):

Meteorite *met1 = new Meteorite(); 

aPosition = glGetAttribLocation(program, "a_position"); 
glVertexAttribPointer(aPosition, 2, GL_FLOAT, GL_FALSE, 0, met2->poly_coords); 
glEnableVertexAttribArray(aPosition); 

glDrawArrays(GL_LINE_STRIP, 0, met1->polygon_points+2); 

所以,我有三个问题:1。 如果我有两个对象绘制? am我必须做这样?:

Meteorite *met1 = new Meteorite(); 
Meteorite *met2 = new Meteorite(); 

GLuint aPosition = glGetAttribLocation(program, "a_position"); 
glVertexAttribPointer(aPosition, 3, GL_FLOAT, GL_FALSE, 0, met1->poly_coords); 
glEnableVertexAttribArray(aPosition); 

glDrawArrays(GL_LINE_STRIP, 0, met1->polygon_points+2); 

aPosition = glGetAttribLocation(program, "a_position"); 
glVertexAttribPointer(aPosition, 2, GL_FLOAT, GL_FALSE, 0, met2->poly_coords); 
glEnableVertexAttribArray(aPosition); 

glDrawArrays(GL_LINE_STRIP, 0, met2->polygon_points+2); 
  • 我怎样才能移动此对象分离?

  • 我试图找出如何创建“主循环”或像这样重绘我的对象,也许删除它们,等

  • 在OpenGL中,你可以只需创建例如while(1)循环并绘制该循环。

    更新:好吧,如果1是好的,那么我解决了第二个问题,通过添加vec4将参数转换为我的VertexShader.vsh,因此我可以分别移动我的对象。 还有第三个问题

    回答

    0

    iOS有一个名为CADisplayLink的类,它填充了您可能在经典CRT上使用垂直回扫的相同角色。您可以将它用作钩子来知道何时重新绘制视图。如果你这样做,那么你的重绘将以屏幕的刷新率发生。

    你永远不应该忙等待。这是低效率的。因此,您绝对不应该忙于等待手机。即使在高效运行时,手机已经被认为电池寿命不足。

    如果你绝对不能切换到现代面向回调的方法则上下文不是线程在iOS安全的,但你可以把多个环境到一个共享组,共享名为GL资源两者之间。所以,你可以运行在后台线程代码,具有锁定机构将其绑到显示的链接,渲染到纹理,然后只写同步的背景和推动渲染场景的主线程上的薄垫片相关层。

    +0

    好了,现在我有DisplayLink的方法重绘。但是,如果我把这个方法放在绘制代码(问题)中,没有任何反应。 对象没问题,但它们不是draw.So我该如何告诉Opengl重新绘制屏幕? – kudinovdenis 2014-09-27 07:47:41

    +1

    完全相同的方式,你已经介绍了它。 'EAGLContext -presentRenderBuffer:'。 – Tommy 2014-09-27 16:34:42