web-dev-qa-db-ja.com

Android OpenGL ESおよび2D

さて、ここに私のリクエストがあります。私はまだOpenGLを知らないので、それを学ぶつもりはありません。ただし、開発をAndroidに向けているので、OpenGL ESを直接学びたいです。 2Dゲームを開発するためにOpenGL ESを学びたいです。パフォーマンスの目的で選択しました(RTゲーム)の場合、基本的なSurfaceViewの描画はそれほど効率的ではありません。私の質問は:どこから始めますか?そして、どこかで見つけたいくつかのチュートリアル/例を読んだり試したりしますが、正直なところ、それはあまり役に立ちませんでした。これは2つの理由です:

  1. ほとんどall私が出会った記事/チュートリアルは3D関連です(2Dスプライトの描画方法を学びたいだけです)
  2. すべての記事は、「三角形の描画方法(頂点を含む)」、「メッシュの作成方法」などの特定の事柄を対象としているため、開始点はありません。

ソースコード(例:レプリカアイランド)も読み込もうとしましたが、コードが複雑すぎて、不要なものがたくさん含まれています。結果:奇妙なクラス名やものを含む100個の.Javaファイルの中で迷子になります。

私が探しているようなコースはないと思いますが、誰かが私にいくつかのガイドラインといくつかのlinksを教えてもらえたらとても嬉しいです(OpenGLのみ) ES 2Dスプライトレンダリング!3Dなし)。

95
CoolStraw

私も同じような状況にありました。
非常に基本的なGLSurfaceViewのサンプル/デモを見て、openGLで始めた方法。

アプリのアクティビティを設定して開始し、基本的なキャンバスを設定します。

適切なGL 2D(Sprite)レンダリング用のフラグを使用してキャンバスをセットアップする方法については、レプリカ島のソースコードファイルGameRenderer.Javaを参照してください。SpriteMethodTestを実際に見てください。レプリカ島の同じ著者: http://code.google.com/p/apps-for-Android/source/browse/trunk/SpriteMethodTest

私自身のコードを投稿したこの質問を参照してください: OpenGLを使用してCanvasを置​​き換える-Android

キャンバスを設定した後、次のようなものを呼び出すことから始めます。gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

その後、Spriteをレンダリングする準備ができました。最初に、テクスチャにSpriteをロードする必要があります。 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/

85
Miguel Morales

2Dプログラミングは、平面に制約された3Dプログラミングです。 3Dを学習する以外に選択肢はありませんが、使用する場合はz = 0に設定してください。

OpenGL ESに関する公式の本があります。それはあなたがあなたがしているイントロを与えるかもしれません: http://www.Amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/

12

私は間違いなくチェックアウトしますAndroid-Chris Pruett Google IO講義Android redux

PDFも

クリスは多くのレベルで本当に役に立ちます

しかし、本当に2Dに焦点を合わせている場合は、Canvasから始めてください http://developer.Android.com/guide/topics/graphics/index.html#drawing-with-canvas

スキルレベルに依存する別のオプションは、Flash + Adob​​eAIRからAndroidです。私自身はプログラミングレベルが好きで、さらに開発を始めると、その理由がわかります。

OpenGL:チェック-Nehe Productions

価値があり、無料の携帯電話に配置したいアプリがいくつかあります:OpenGLデモ、min3dフレームワーク、RedBookサンプル

3
Atom Arcade

プロジェクトを見ることができます: https://github.com/ChillingVan/Android-openGL-canvas/blob/master/README-en.md これはOpenGLでキャンバスを実装します。純粋なJavaです。通常のキャンバスでできることの一部を実装します。

1
ChillingVan

従うことができるオンラインチュートリアルはたくさんありますが、初心者にとってはこれに代わるものはありません: 本当のOpen GL ES 2.0 2Dチュートリアル

0
ucMedia

すでに多くの良い情報が提供されていることがわかります。 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の本から学んだ簡単なテクニックを使用して、拡張現実アプリを構築することができました。共有してくれてありがとう!

0
MikeyE