Мне нужна помощь в добавлении второй текстуры в glSurfaceView - PullRequest
3 голосов
/ 22 августа 2011

Я использовал page curl curl (Harism, большое спасибо за эту замечательную библиотеку!) Для Android для разработки коммерческого приложения - электронного журнала.

Я обернул все, что должно было быть в приложении, а именно: xml - rpc выборка страниц журнала, кэширование, загрузчики, мой собственный поставщик растровых изображений, обработчики пользовательских жестов и т. Д. *

Но у меня есть очень большая проблема, что, как бы я ни пытался, я не могу решить себя.

Мне нужно реализовать реальную функциональность книги, а это означает, что когда страница ориентирована в альбомном режиме, мне нужны пары страниц (первый экран - слева пусто, правая обложка. Первый переворот = слева страница 1, справа страница 2. Второй щелчок = левая страница 3, правая страница 4 ...)

Я прочитал информацию, которую Харизм дал людям, которые задали то же самое на github, по вопросу, который они открыли в связи с этим, но этого просто недостаточно с моим ограниченным знанием openGL.

Я понимаю, что мне нужно реализовать заднюю текстуру, но кто-нибудь может быть более подробным по этому вопросу? Я зашел в тупик, пытаясь сделать это сам, и мне остро нужна помощь.

Если есть необходимость в дополнительном размещении кода - дайте мне знать, я с большей готовностью отправлю любой / весь код.

Спасибо!

РЕДАКТИРОВАТЬ, перечитав его, я понял, что должен был быть более подробным. У страницы, которая скручивается, есть текстура, которая является растровым изображением реальной страницы. При текущей настройке передняя и задняя части растрового изображения отображаются отдельно, но это одна и та же текстура. Мне нужен задний, чтобы быть другим.

Код, который выполняет рендеринг:

/**
 * 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);
}

И предоставить ему отдельное растровое изображение, но я не знаю, как это сделать.

Еще раз спасибо

РЕДАКТИРОВАТЬ: Я начал мегаполис, мне действительно нужно это ответили ...:)

1 Ответ

1 голос
/ 27 августа 2011

Мои знания openGL также ограничены, но у меня была похожая проблема в прошлом.Чтобы иметь две текстуры, вам нужно, по крайней мере, изменить эту строку:

gl.glGenTextures(2, mTextureIds, 0);

Здесь у вас есть пример использования более чем одной текстуры.

...