我需要帮助向glSurfaceView添加第二个纹理

时间:2011-08-22 14:53:49

标签: android opengl-es textures glsurfaceview

我使用harism's page curl(Harism,对于这个优秀的图书馆来说非常有用!),以便Android开发商业应用程序 - 电子杂志。

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

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

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

我阅读了Harism给人们提供的信息,他们在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);
}

并提供一个sepparate位图,但我不知道如何做到这一点。

再次感谢

编辑:我开始了一个巨大的奖金,我真的需要这个答案......:)

1 个答案:

答案 0 :(得分:1)

我的openGL知识也有限,但我过去也遇到过类似的问题。 要获得两个纹理,至少需要修改这一行:

gl.glGenTextures(2, mTextureIds, 0);

Here您有一个如何使用多个纹理的示例。