3

我使用harism 的 page curl(Harism,thanx 了很多这个优秀的库!)为 android 开发商业应用程序 - 电子杂志。

我包装了应该在应用程序周围的所有内容,即 xml - 杂志页面的 rpc 获取、缓存、加载程序、我自己的位图提供程序、自定义手势事件处理程序等......

但是,我有一个非常大的问题,无论我如何尝试,我都无法解决自己。

我需要实现一个真正的书籍功能,这意味着当页面以横向模式定向时,我需要成对的页面(初始屏幕 - 左空白,右封面。第一次翻转 = 左页 1,右页 2。第二次翻转 =左边第 3 页,右边第 4 页……)

我阅读了 Harism 给那些在 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 知识也很有限,但我过去也遇到过类似的问题。要拥有两个纹理,您至少需要修改此行:

gl.glGenTextures(2, mTextureIds, 0);

这里有一个如何使用多个纹理的示例。

于 2011-08-27T14:12:56.593 回答