2011-09-29 57 views
5

我正在寫一個使用GL10的3D遊戲,但我希望應用程序支持GL11或GL20(如果可用)。支持所有3的最佳設計是什麼?或者這是一個傻瓜的差事,我應該只關注支持一個版本?如何在Libgdx中支持OpenGL ES GL10,GL11和GL20?

我目前的想法是將我的render()函數分成renderGL10,renderGL11,renderGL20,並根據可用的GL實例調用適當的渲染函數。每個渲染函數內部都是渲染GL版本的正確方法; GL10和GL11可能會有重疊。這是處理我的問題的適當方式還是有更好的方法?

public render(){ 
    if (Gdx.graphics.isGL20Available()){ 
    renderGL20(); 
    } else if (Gdx.graphics.isGL11Available()){ 
    renderGL11(); 
    } else { 
    renderGL10(); 
    } 
} 

編輯: 解決方法:如果gl1.x可用,GL10也可以(和Gdx.gl10不爲空)。

public render(){ 
    // Use Gdx.gl for any gl calls common to all versions 
    if (Gdx.graphics.isGL20Available()){ 
    // Use Gdx.GL20 for all gl calls 
    } else { 
    if (Gdx.graphics.isGL11Available()){ 
     // Use Gdx.gl11 for any gl11 call not supported by gl10 
    } 
    // Use Gdx.gl10 for all gl calls 
    } 
} 

回答

10

你真的在你的OpenGL ES 2.0的路徑中使用的着色器或者你依靠SpriteBatch和后妃處理骯髒的細節你:所以,我的渲染代碼一般應如下結構?在後一種情況下,在GLES 2.0中沒有真正的好處(除了兩個紋理的非功率,這在某些設備上可能會更慢)

通常您在GLES 1.x或2.0之間選擇。如果你使用1.x,你不需要做任何事情。如果你想使用2.0,你必須創建一個AndroidApplicationConfig並將useGL20標誌設置爲true。如果設備上不支持GLES 2.0,那麼libgdx將回退到1.x.然後你可以使用你的上面的渲染循環,如果可用,將使用GLES 2.0,否則返回1.x。除非您直接使用GLES調用,否則您不可能必須爲1.0和1.x分開路徑。

+1

我不使用圖書館的許多藝術部分,我正在探索如何設計它,而沒有太多的gles2.0知識或者libgdx如何處理gl1.x.我使用這個遊戲來擴展我對遊戲編程和GLES的知識,所以我想支持這兩個,所以我可以嘗試學習GLSL。基於你關於1.x的回答,我只是簡單地看了一下Android和Jogl後端的源代碼,並注意到當gl11可用時,Gdx.gl10 = Gdx.gl11;如果設置了gl11,我預計gl10將爲空(當2.0可用時,gl10和gl11爲空)。這和你的答案真的有幫助。 – Doran