2010-08-24 132 views
92

好的,這是我的要求。我已經不知道OpenGL了,但我不願意學習它,但是我想直接學習OpenGL ES,因爲我將自己的開發目標鎖定在了Android上。我想學習OpenGL ES以開發我的2D遊戲。我選擇它用於表演目的(因爲基本的SurfaceView繪圖在RT遊戲方面效率不高)。 我的問題是:從哪裏開始? 我花了一個多月的瀏覽谷歌和讀/嘗試一些教程/例子,我發現任何地方,但說實話,它並沒有太大的幫助,這是出於兩個原因:Android OpenGL ES和2D

  1. 幾乎所有我遇到的文章/教程是3D相關的(我只想學習如何做2D Sprites繪圖)
  2. 沒有基礎,因爲所有文章的目標都是特定的東西:「如何繪製一個三角形(帶頂點)「,」如何創建網格「等。

我試過了也可以添加一些源代碼(例如:replica island),但代碼太複雜並且包含很多不必要的內容;結果:我迷失在100個.java文件中,並帶有奇怪的類名和內容。

我想有沒有像我正在尋找的課程,但我會很高興,如果有人可以給我一些指導方針和一些鏈接也許學習我最喜歡的(只有OpenGL ES 2D Sprites渲染!沒有3D)。

+32

',我不願意學習它'這不是一個很好的方式在這裏開始一個問題 – Falmarri 2010-08-24 03:11:17

+56

請閱讀我的整個問題,你採取了一個敏感的部分,並留下最重要的完成:「我不'已經知道OpenGL了,我不想學習它,我想直接學習OpenGL ES,因爲我的目標是我的開發到Android「 如果我只用OpenGL工作,學習OpenGL有什麼意義? ES在嵌入式設備上? Cheers – CoolStraw 2010-08-24 04:00:39

+5

鑑於OpenGL ES主要是OpenGL的一個子集,我沒有看到說你不會學習OpenGL的觀點,因爲根據定義你將不得不這樣做。 – 2010-08-25 01:12:35

回答

84

我處於類似的情況。
我開始使用openGL的方式,首先查看非常基本的GLSurfaceView示例/演示。

開始,通過設置您的應用程序活動並設置基本畫布。

在副本島源代碼文件:GameRenderer.java中獲取如何使用適當的GL標誌設置2D(精靈)渲染的畫布。 你真的應該看看SpriteMethodTest通過副本島嶼的同一作者:http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

看到這個問題,我貼我自己的代碼:Using OpenGL to replace Canvas - Android

你有你的畫布設置完畢後,您可以通過調用的東西開始如: gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

之後,您已準備好呈現精靈。 首先,你需要精靈加載到紋理:http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

然而,這真的幫了我與裝載精靈教程: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

這是我要做的事,我有一類名爲Texture.java:

public class Texture 
{ 
    /*Begin public declarations*/ 
    public float x = 0; 
    public float y = 0; 
    public float z = 0; 
    public float width = 0; 
    public float height = 0; 
    /*Begin Private Declarations*/ 
    private GL10 gl; 
    public int[] texture; //holds the texture in integer form 
    private int texture_name; 
    private int[] mCropWorkspace; 
    private final BitmapFactory.Options sBitmapOptions; 


/*Begin Methods*/ 
public Texture(GL10 gl_obj) 
{ 
    gl = gl_obj; 
    texture = new int[1]; 
    mCropWorkspace = new int[4]; 
    sBitmapOptions = new BitmapFactory.Options(); 
    sBitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565; 
    //Log.d(TAG, "Initializing Texture Object"); 
}  
public int get_texture_name() 
{ 
    return texture_name; 
} 

/*Loads the resource to memory*/ 
public boolean Load(Bitmap bitmap) //rename this to glLoad and don't have it as an initializer parameter 
{ 
    /*many thanks to sprite method test if this works*/ 
    if (gl == null) 
    { 
     Log.e(TAG, "Failed to load resource. Context/GL is NULL"); 
     return false; 
    } 
    int error; 

    int textureName = -1; 
    gl.glGenTextures(1, texture, 0); 
    textureName = texture[0]; 

    //Log.d(TAG, "Generated texture: " + textureName); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE); 

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

    mCropWorkspace[0] = 0; 
    mCropWorkspace[1] = bitmap.getHeight(); 
    mCropWorkspace[2] = bitmap.getWidth(); 
    mCropWorkspace[3] = -bitmap.getHeight(); 

    ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, 
      GL11Ext.GL_TEXTURE_CROP_RECT_OES, mCropWorkspace, 0); 

    error = gl.glGetError(); 
    if (error != GL10.GL_NO_ERROR) 
    { 
     Log.e(TAG, "GL Texture Load Error: " + error); 

    } 
    //Log.d(TAG, "Loaded texture: " + textureName); 
    return true; 
} 
} 

然後在我的onDrawFrame()方法,我只是做:

Texture texture = ... 
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture.texture[0]); 
((GL11Ext) gl).glDrawTexfOES((float)(draw_x + 0.5), (float)(draw_y + 0.5), 0, tile_width, tile_height); 

這應該讓你在openGL畫布上繪製2D精靈。 我注意到這裏真的沒有簡單的教程。希望將來我會在我的開發博客中發佈一條:http://developingthedream.blogspot.com/

+6

非常感謝你!我從來沒有像這樣的方向,這正是我所期待的!我會密切關注你的博客,希望你能在將來爲我們提供一個很棒的教程:),再次非常感謝你 – CoolStraw 2010-09-10 05:08:44

+1

在與OP相同的情況下,和他一樣感謝你的回答。祝你好運與你的遊戲/博客。 thx再次 – unR 2011-10-09 13:52:33

+1

謝謝@Miguel Morales我厭倦了用GL來尋找二維圖紙。正如CoolStraw所說的,有太多的教程和很多不必要的東西。這個答案像水晶一樣清晰。 – 2012-03-08 13:51:17

11

2D編程只是3D編程,它被限制在一個平面上。您將別無選擇,只能學習3D,但是當您使用它時,只需設置z = 0。

有一本關於OpenGL ES的官方書籍。這可能給你,你的介紹後: http://www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/

+7

要迂腐,你仍然使用Z,這樣你就可以讓硬件爲你排序。最大的變化是(可能)2D應用程序將使用正交視圖而不是透視圖。 – 2010-08-25 01:14:04

+0

非常感謝您的回答,您的陳述顯示我對Opengl和Opengl ES定義有誤。 – CoolStraw 2010-08-25 17:19:02

2

我肯定會結賬的Android克里斯 - PRUETT谷歌IO講座 編寫實時遊戲爲Android終極版

搶PDF也

這是在許多層面上真正有用的,克里斯與移動設備的

,但如果你真的專注於2D然後用畫布開始創建遊戲真正偉大的經驗 http://developer.android.com/guide/topics/graphics/index.html#drawing-with-canvas

另一個選擇取決於技術水平是Flash + Adob​​eAIR到Android,我自己喜歡和luv編程級別,當你進一步開始開發時,你會發現爲什麼。

的OpenGL: 檢查 - 訥河製作

幾個應用程序,你可以把它放到你的手機上是值得的,他們是免費的是: OpenGL的演示, min3d框架, 紅皮書樣品

1

我看到很多好的信息已經提供了。我想分享一個可以幫助快速掌握OpenGLE的網站!它只花了幾個月的時間,並有一個基於笛卡爾座標系的自定義座標系。我能夠使用增強現實技術渲染3D對象沒有相機。

我從只有編程經驗入手,沒有OpenGL經驗。我使用了Ray Wenderlich的教程網站。所提供的信息是一流的,易於理解。他切入了大部分多餘的信息,並提供您需要知道的快速生產。我強烈推薦本教程作爲出發點:http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

我推薦的其他資源是Erik M Buck編寫的一本書,標題爲Learning OpenGL ES for iOS。

Learning OpenGL ES for iOS book cover art

有人批評它說這是過於簡單化。但那正是我所期待的。它幫助我理解了所有的基礎知識,並讓我知道我應該去哪裏學習更先進的東西。但毫不奇怪,我能夠使用我從Ray的網站和Erik的書中學到的簡單技術構建我的增強現實應用程序。感謝他們倆分享!