【问题标题】:I need help adding a second texture to glSurfaceView我需要帮助向 glSurfaceView 添加第二个纹理
【发布时间】:2011-08-22 14:53:49
【问题描述】:

我使用harism's page curl(Harism,非常感谢这个优秀的库!)为 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);
}

并为它提供一个单独的位图,但我不知道该怎么做。

再次感谢

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

【问题讨论】:

    标签: android opengl-es textures glsurfaceview


    【解决方案1】:

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

    gl.glGenTextures(2, mTextureIds, 0);
    

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

    【讨论】:

    • 我在您提供的链接上找到了解决方案。您引用的行也应更改为: gl.glGenTextures(2, mTextureIds, 0);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2017-07-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2023-03-09
    相关资源
    最近更新 更多