2011-03-22 18 views
0

EDIT:それを解決!私は愚かなミスをした、私はテクスチャを持っていた私はそれがtextureIDだったときを忘れていた私は使用する必要があります。アンドロイド用OpenGL ESでの2Dゲーム用レンダリング画像

わかりました。これは定期的な質問であり、多くのチュートリアルとオープンソースコードがあることを十分に認識しています。しかし、ここで私ができる限り最善を尽くしています。私の画面はまだ空白です(glClearColor()を使用して設定した色で)。

私はリソースイメージをレンダリングするいくつかの作業コードを間違っている、あるいはそれ以上にしていることへの指針に感謝します。

レンダラーを実装しているクラスの私のonDrawFrameでこれまでに得たことを(私はいくつかの手の込んだコピー貼り付けをして)表示します。私はいくつかのメソッド間のジャンプを取り除き、実行された順に単に貼り付けます。

私の現在のコードを無視してもよろしいですが、誰かが私に動作するコードを与えることができれば、私は最初からやり直すことができます。

セットアップ:

bitmap = BitmapFactory.decodeResource(panel.getResources(), 
      R.drawable.test); 
    addGameComponent(new MeleeAttackComponent()); 

    // Mapping coordinates for the vertices 
    float textureCoordinates[] = { 0.0f, 2.0f, // 
      2.0f, 2.0f, // 
      0.0f, 0.0f, // 
      2.0f, 0.0f, // 
    }; 

    short[] indices = new short[] { 0, 1, 2, 1, 3, 2 }; 

    float[] vertices = new float[] { -0.5f, -0.5f, 0.0f, 
             0.5f, -0.5f, 0.0f, 
            -0.5f, 0.5f, 0.0f, 
             0.5f, 0.5f, 0.0f }; 

    setIndices(indices); 
    setVertices(vertices); 
    setTextureCoordinates(textureCoordinates); 

protected void setVertices(float[] vertices) { 
    // a float is 4 bytes, therefore we multiply the number if 
    // vertices with 4. 
    ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); 
    vbb.order(ByteOrder.nativeOrder()); 
    mVerticesBuffer = vbb.asFloatBuffer(); 
    mVerticesBuffer.put(vertices); 
    mVerticesBuffer.position(0); 
} 


protected void setIndices(short[] indices) { 
    // short is 2 bytes, therefore we multiply the number if 
    // vertices with 2. 
    ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2); 
    ibb.order(ByteOrder.nativeOrder()); 
    mIndicesBuffer = ibb.asShortBuffer(); 
    mIndicesBuffer.put(indices); 
    mIndicesBuffer.position(0); 
    mNumOfIndices = indices.length; 
} 


protected void setTextureCoordinates(float[] textureCoords) { 

    // float is 4 bytes, therefore we multiply the number of 
    // vertices with 4. 
    ByteBuffer byteBuf = ByteBuffer 
      .allocateDirect(textureCoords.length * 4); 
    byteBuf.order(ByteOrder.nativeOrder()); 
    mTextureBuffer = byteBuf.asFloatBuffer(); 
    mTextureBuffer.put(textureCoords); 
    mTextureBuffer.position(0); 
} 

// onDrawFrame(GL10のGL)

gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    gl.glLoadIdentity(); 
    gl.glTranslatef(0, 0, -4); 

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    // Specifies the location and data format of an array of vertex 
    // coordinates to use when rendering. 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVerticesBuffer); 

    if(shoudlLoadTexture){ 
     loadGLTextures(gl); 
     shoudlLoadTexture = false; 
    } 

    if (mTextureId != -1 && mTextureBuffer != null) { 
     gl.glEnable(GL10.GL_TEXTURE_2D); 
     // Enable the texture state 
     gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

     // Point to our buffers 
     gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer); 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId); 
    } 

    gl.glTranslatef(posX, posY, 0); 
    // Point out the where the color buffer is. 
    gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfIndices, 
      GL10.GL_UNSIGNED_SHORT, mIndicesBuffer); 
    // Disable the vertices buffer. 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 

    if (mTextureId != -1 && mTextureBuffer != null) { 
     gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    } 


private void loadGLTextures(GL10 gl) { 

    int[] textures = new int[1]; 
    gl.glGenTextures(1, textures, 0); 
    mTextureID = textures[0]; 

    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID); 

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
    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); 

} 

それはクラッシュしない、例外なく、色付き単に空白の画面。私はそこに物を印刷したので、それはすべて実行されていると確信しています。

私はそれがあなたの場合は

どうもありがとう

+0

すぐに質問:あなたが表示していないどこかで、モデルビューとプロジェクトスタックを初期化していますか? – Tommy

+0

どうすればいいのか分かりませんが、ほとんどのコードを表示していると思います。それは実行し、私に背景色を与えるので、私は何か正しいことをやっている。あなたは何を意味するかを詳しく説明できますか? (私の理解の不足のため、申し訳ありませんが、これは恐ろしい未知の領域です:S) –

+0

必ずしも答えではないが、私は十分な部屋を得るために答えを投稿する必要があります。 – Tommy

答えて

1

を単にコードを貼り付けますが、現時点では、私はちょうど私がキャンバスに行うことができたものを行うことができるようにしたい:)し、最適ではないことを知っていますあなたのウィンドウが適切に設定されていることを意味する背景色を取得しています。 OpenGLは画面のその領域に接続されています。

OpenGLはオブジェクトがカメラを横切ったり交差したりすることがないように(カメラが数学的にも論理的にも意味をなさない)、オブジェクトが遠く離れていないことを保証します現れる。したがって、モデルビューと投影を正しく設定していないと、すべてのジオメトリがクリップされている可能性があります。

Modelviewは、世界から目の空間にマップするために使用されます。プロジェクションは、アイスペースからスクリーンスペースにマップします。したがって、典型的なアプリケーションでは、前者を使用してシーン内にオブジェクトを配置し、シーンをカメラに相対的に配置します。後者は、カメラが視点で見えるかどうか、何台のワールドユニットがいくつのスクリーンユニットを作成するかなどを扱います。

like this one、特にonSurfaceChangedを見ると、カメラが原点に固定された透視投影の例が表示されます。

カメラが(0、0、0)にあるため、ジオメトリをコードのままにしておくと、ジオメトリがクリップされます。そのサンプルコードでは、彼らは、z = 0.1になるようにニアクリップ面を設定した、既存のコードでのように、あなたは変更される可能性:

gl.glTranslatef(posX, posY, 0); 

へ:

gl.glTranslatef(posX, posY, -1.0); 

十分に戻ってあなたのジオメトリをプッシュします画面にはるかに表示されます。

+0

ありがとうございましたが、何も変わっていません:SそこにはglTranslatef(0,0、-4)が設定されていますが、私がチュートリアルを理解する限り、そのトリックを完了しているはずです –

+0

コードはまだモデルビューと投影を設定する場所を示していません。私は本当にそれがあなたが乗り越えている場所だと思っています。それを見ずに、より具体的なアドバイスを提供することは非常に難しいです。 – Tommy

関連する問題