3

私はAndroid 用の harism のページ カール(Harism、この優れたライブラリに感謝します!) を使用して、商用アプリケーション (電子雑誌) を開発しました。

アプリに必要なすべてのもの、つまり xml をラップしました - 雑誌ページの rpc フェッチ、キャッシュ、ローダー、独自のビットマップ プロバイダー、カスタム ジェスチャ イベント ハンドラーなど...

しかし、どう頑張っても自分では解決できないという大きな問題を抱えています。

実際の本の機能を実装する必要があります。つまり、ページが横向きモードの場合、ページのペアが必要です (最初の画面 - 左空白、右表紙。最初のフリップ = 左ページ 1、右ページ 2。2 回目のフリップ =左ページ 3、右ページ 4...)

ハリズムがこれに関してオープンした問題についてgithubで同じことを尋ねた人々に提供した情報を読みましたが、openGL esに関する私の限られた知識では十分ではありません。

裏面テクスチャを実装する必要があることは理解していますが、この問題についてもう少し詳しく教えてください。私はそれを自分でやろうとして行き止まりになり、緊急に助けが必要です.

追加のコード投稿が必要な場合はお知らせください。コードの一部またはすべてを投稿したいと考えています。

ありがとう!

編集-再読して、もっと詳しく説明する必要があることに気付きました。カールしているページには、実際のページのビットマップであるテクスチャがあります。現在の設定では、ビットマップの表と裏が別々にレンダリングされますが、同じテクスチャです。私は後ろのものを別のものにする必要があります。

実際のレンダリングを行うコード:

/**
 * Draws our mesh.
 */
public synchronized void draw(GL10 gl) {
    // First allocate texture if there is not one yet.
    if (DRAW_TEXTURE && mTextureIds == null) {
        // Generate texture.
        mTextureIds = new int[1];
        gl.glGenTextures(1, mTextureIds, 0);
        // Set texture attributes.
        gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureIds[0]);
        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);
    }
    // If mBitmap != null we have a new texture.
    if (DRAW_TEXTURE && mBitmap != null) {
        gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureIds[0]);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, mBitmap, 0);
        mBitmap = null;
    }

    if (DRAW_TEXTURE) {
        gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureIds[0]);
    }

    // Some 'global' settings.
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    // TODO: Drop shadow drawing is done temporarily here to hide some
    // problems with its calculation.
    if (DRAW_SHADOW) {
        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        gl.glColorPointer(4, GL10.GL_FLOAT, 0, mShadowColors);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mShadowVertices);
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, mDropShadowCount);
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        gl.glDisable(GL10.GL_BLEND);
    }

    // Enable texture coordinates.
    if (DRAW_TEXTURE) {
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTexCoords);
    }
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertices);

    // Enable color array.
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
    gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColors);

    // Draw blank / 'white' front facing vertices.
    gl.glDisable(GL10.GL_TEXTURE_2D);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, mVerticesCountFront);
    // Draw front facing texture.
    // TODO: Decide whether it's really needed to have alpha blending for
    // front facing texture. If not, GL_BLEND isn't needed, possibly
    // increasing performance. The heck, is it needed at all?
    if (DRAW_TEXTURE) {
        gl.glEnable(GL10.GL_BLEND);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, mVerticesCountFront);
        gl.glDisable(GL10.GL_TEXTURE_2D);
        gl.glDisable(GL10.GL_BLEND);
    }
    int backStartIdx = Math.max(0, mVerticesCountFront - 2);
    int backCount = mVerticesCountFront + mVerticesCountBack - backStartIdx;
    // Draw blank / 'white' back facing vertices.
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, backStartIdx, backCount);
    // Draw back facing texture.
    if (DRAW_TEXTURE) {
        gl.glEnable(GL10.GL_BLEND);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, backStartIdx, backCount);
        gl.glDisable(GL10.GL_TEXTURE_2D);
        gl.glDisable(GL10.GL_BLEND);
    }

    // Disable textures and color array.
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glDisableClientState(GL10.GL_COLOR_ARRAY);

    if (DRAW_POLYGON_OUTLINES) {
        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glLineWidth(1.0f);
        gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertices);
        gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, mVerticesCountFront);
        gl.glDisable(GL10.GL_BLEND);
    }

    if (DRAW_CURL_POSITION) {
        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glLineWidth(1.0f);
        gl.glColor4f(1.0f, 0.5f, 0.5f, 1.0f);
        gl.glVertexPointer(2, GL10.GL_FLOAT, 0, mCurlPositionLines);
        gl.glDrawArrays(GL10.GL_LINES, 0, mCurlPositionLinesCount * 2);
        gl.glDisable(GL10.GL_BLEND);
    }

    if (DRAW_SHADOW) {
        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        gl.glColorPointer(4, GL10.GL_FLOAT, 0, mShadowColors);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mShadowVertices);
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, mDropShadowCount,
                mSelfShadowCount);
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        gl.glDisable(GL10.GL_BLEND);
    }

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}

私は改ざんする必要があると思います:

// Draw back facing texture.
if (DRAW_TEXTURE) {
    gl.glEnable(GL10.GL_BLEND);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, backStartIdx, backCount);
    gl.glDisable(GL10.GL_TEXTURE_2D);
    gl.glDisable(GL10.GL_BLEND);
}

別のビットマップを提供しますが、これを行う方法がわかりません。

再度、感謝します

編集:私は巨大な報奨金を始めました、私は本当にこれに答える必要があります... :)

4

1 に答える 1

1

私のopenGLの知識も限られていますが、過去に同様の問題がありました。2 つのテクスチャを作成するには、少なくとも次の行を変更する必要があります。

gl.glGenTextures(2, mTextureIds, 0);

ここでは、複数のテクスチャを使用する方法の例を示します。

于 2011-08-27T14:12:56.593 に答える