3

opengles を使用するゲームを書いています。レンダラー クラスを作成し、エミュレーターで動作するゲームのサンプルを用意しましたが、実際のデバイスではテクスチャが表示されません。これの最も一般的な原因は、テクスチャを 2 倍にする必要があることだと読みましたが、同じサイズのテクスチャがマップされた正方形 (128x128) を描画しようとしましたが、これはエミュレータでのみ表示されます。さらに、私の実際のゲームは長方形を使用するため、正方形のテクスチャを長方形にマッピングする方法がわかりません.これはこれまでの私のコードです(ゲームは2Dなので、オルソモードを使用しています):編集:私コードを更新したところ、テクスチャが正しくバインドされ、サイズ 128x128 のテクスチャが使用されるようになりましたが、エミュレータではテクスチャしか表示されません。

    public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
    byteBuffer = ByteBuffer.allocateDirect(shape.length * 4);
    byteBuffer.order(ByteOrder.nativeOrder());
    vertexBuffer = byteBuffer.asFloatBuffer();
    vertexBuffer.put(cardshape);
    vertexBuffer.position(0);

    byteBuffer = ByteBuffer.allocateDirect(shape.length * 4);
    byteBuffer.order(ByteOrder.nativeOrder());
    textureBuffer = byteBuffer.asFloatBuffer();
    textureBuffer.put(textureshape);
    textureBuffer.position(0);

    // Set the background color to black ( rgba ).
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    // Enable Smooth Shading, default not really needed.
    gl.glShadeModel(GL10.GL_SMOOTH);
    // Depth buffer setup.
    gl.glClearDepthf(1.0f);
    // Enables depth testing.
    gl.glEnable(GL10.GL_DEPTH_TEST);
    // The type of depth testing to do.
    gl.glDepthFunc(GL10.GL_LEQUAL);
    // Really nice perspective calculations.
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

    gl.glEnable(GL10.GL_TEXTURE_2D);
    loadGLTexture(gl);
}

public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glMatrixMode(GL10.GL_PROJECTION); // Select Projection
    gl.glPushMatrix(); // Push The Matrix
    gl.glLoadIdentity(); // Reset The Matrix
    gl.glOrthof(0f, 480f, 0f, 800f, -1f, 1f);
    gl.glMatrixMode(GL10.GL_MODELVIEW); // Select Modelview Matrix
    gl.glPushMatrix(); // Push The Matrix
    gl.glLoadIdentity(); // Reset The Matrix

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glLoadIdentity();
    gl.glTranslatef(card.x, card.y, 0.0f);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, card.texture[0]); //activates texture to be used now
    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}

public void onSurfaceChanged(GL10 gl, int width, int height) {
    // Sets the current view port to the new size.
    gl.glViewport(0, 0, width, height);
    // Select the projection matrix
    gl.glMatrixMode(GL10.GL_PROJECTION);
    // Reset the projection matrix
    gl.glLoadIdentity();
    // Calculate the aspect ratio of the window
    GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f,
            100.0f);
    // Select the modelview matrix
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    // Reset the modelview matrix
    gl.glLoadIdentity();
}

public int[] texture = new int[1];

public void loadGLTexture(GL10 gl) {
    // loading texture
    Bitmap bitmap;
        bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.image);
        // generate one texture pointer
        gl.glGenTextures(0, texture, 0); //adds texture id to texture array
        // ...and bind it to our array
        gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]); //activates texture to be used now
        // create nearest filtered texture
        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);
        // Use Android GLUtils to specify a two-dimensional texture image from our bitmap
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
        // Clean up
        bitmap.recycle();
}

私が間違ったことはありますか?それとも私がやったことのないものですか?エミュレーターでは問題なく動作するので、2 の累乗の問題だとしか思えませんでしたが、前述のように、正方形で 128x128 のテクスチャを使用してみましたが、表示されませんでした..

編集: minsdkversion を 3 に設定し、入力ストリーム bitmap = BitmapFactory.decodeStream(is) を介してビットマップをロードし、BitmapFactory.Options.inScaled を false に設定し、画像を nodpi フォルダーに配置してから、生のフォルダ..他のアイデアはありますか?

4

2 に答える 2

1

私は実際に今、同様の問題の解決策を探しています。ただし、一時的な修正があると思います。

問題は、エミュレーターで正投影ビューが反転していることにあるようです。これを解決するために、私のアプリでは、何も描画されない場合にビューを手動で反転するオプションを設定に追加しました。これを処理するスニペットは次のとおりです。

if (!flipped)
{
    glOrthof(0, screenWidth, screenHeight, 0, -1, 1); //--Device
}
else
{
    glOrthof(0, screenWidth, 0, -screenHeight, -1, 1); //--Emulator
}

お役に立てれば!誰かがより一般的な解決策を持っているなら、私はそれを聞いてうれしいです!

于 2012-06-20T04:08:16.900 に答える
0

私はあなたのコードを見ていませんでしたが、私は以前にその道を歩んできました。OpenGL で開発するのは本当に大変です。OpenGL を使用する義務がない場合は、グラフィック エンジンを使用してください。Unityは素晴らしいもので、しかも無料です。また、ゲームは Android、iOS、またはその他のプラットフォームで動作します。あなたの選択を注意深く研究してください。幸運を..

于 2012-05-19T00:34:43.520 に答える