2014-09-26 100 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