Android OpenGL ESおよび2D


95

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

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

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

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


33
and I'm not willing to learn itそれはここで質問を始めるのにあまり良い方法ではありません
Falmarri

62
私の質問全体を読んでください、あなたはそれの重要な部分を1つ取り、最も重要な完了を残しました:「私はOpenGLをまだ知りません、そして私はそれを学ぶつもりはありません。私はOpenGL ESを直接学びたいので、自分の開発をAndroidに向ける」組み込みデバイスでOpenGL ESのみを使用する場合、OpenGLを学ぶ意味は何ですか?乾杯
CoolStraw 2010

5
OpenGL ESは主にOpenGLのサブセットであることを考えると、OpenGLを学ぶつもりはないと定義する必要があるため、OpenGLを学ぶつもりはないのです。
ダッシュトムバン

2
ところで、レプリカアイランドはかなり見どころです。あなたはそれから始めて、それに変更を加えることから始めるかもしれません。不要または不要なものを取り除くと、100クラスは99、98、97となる...
dash-tom-bang

回答:


85

私も同じような状況でした。
非常に基本的なGLSurfaceViewサンプル/デモを見るところから始めて、openGLで始めた方法。

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

2D(スプライト)レンダリングに適切なGLフラグを使用してキャンバスをセットアップする方法については、レプリカアイランドのソースコードファイル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);

その後、スプライトをレンダリングする準備が整います。最初に、スプライトをテクスチャにロードする必要があります: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/


7
どうもありがとうございました!私はこのような方向性を得たことはありません、それがまさに私が探していたものです!そして、私はあなたのブログから目を離さないでしょう。うまくいけば、将来的に素晴らしいチュートリアルを提供してくれることを願っています:)、再び本当にありがとう
CoolStraw

1
OPと同じ状況で、答えてくれてありがとう。ゲーム/ブログで頑張ってください。再びthx
unR

1
ありがとう@Miguel Morales GLでの2D描画にうんざりしていました。CoolStrawが言ったように、不要なものがたくさんあるチュートリアルが多すぎます。その答えはクリスタルのように明確でした。
Evren Ozturk、2012年

@Miguel Morales何度も試した後、何も描くことができず、テクスチャが黒く表示されます。私は質問をしましたstackoverflow.com/questions/9624260/…見ていただけますか?
Evren Ozturk、2012年

12

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

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


8
わかりやすくするために、Zを使用して、ハードウェアにソートを行わせることができます。大きな変更は、2Dアプリケーションが透視図ではなく正投影ビューを使用することです。
ダッシュトムバン

回答ありがとうございます。あなたの声明では、OpenglとOpengl ESの定義について私が間違っていたことを示しています。
CoolStraw 2010

3

私は間違いなくAndroidをチェックアウトします-Chris Pruett Google IO講義Android redux用のリアルタイムゲームの作成

PDFも取得

それは多くのレベルで本当に役立ちます、クリスはモバイルデバイス用のゲームを作成することで本当に素晴らしい経験を持っています

しかし、本当に2Dに集中している場合は、Canvasから始め ますhttp://developer.android.com/guide/topics/graphics/index.html#drawing-with-canvas

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

OpenGL:チェック-Nehe Productions

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



0

すでに多くの良い情報が提供されているようです。OpenGLEにすぐに慣れるのに役立つサイトを共有したいと思いました。数か月しかかからず、デカルト座標系に基づくカスタム座標系がありました。拡張現実技術を使用して、カメラなしで3Dオブジェクトをレンダリングできました。

私はプログラミングの経験のみから始め、OpenGLの経験はありませんでした。Ray Wenderlichのチュートリアルサイトを使用しました。そこに提供される情報は一流であり、理解しやすいです。彼は余分な情報のほとんどを切り抜き、迅速に生産性を上げるために知っておくべきことを提供します。このチュートリアルを開始点として強くお勧めしますhttp : //www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

私がお勧めするもう1つのリソースは、Erik M Buck著のLearning OpenGL ES for iOSというタイトルの本です。

iOS向けOpenGL ESのブックカバーアートの学習

単純化しすぎているとの批判もある。しかし、それはまさに私が探していたものです。それは私がすべての基本を理解するのに役立ち、より高度なものを学ぶために次にどこに行くべきかについてのアイデアを私に与えました。しかし、当然のことながら、私はレイのサイトとエリックの本から学んだ簡単なテクニックを使用して、拡張現実アプリを構築することができました。共有してくれてありがとう!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.