2011-08-22 38 views
3

我用harism's page curl(Harism,thanx很多这个卓越的库!)为Android开发一个商业应用程序 - 一个电子杂志。我需要帮助添加第二个纹理glSurfaceView

我包的一切,应该是围绕应用程序,这是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); 
} 

,并为其提供一个sepparate位图,但我不知道该怎么办这个。

再次感谢

编辑:我开始兆赏金,我真的需要这个回答... :)

回答

1

我openGL的知识也是有限的,但我在过去也有类似的问题。 有两个纹理你需要,至少,修改此行:

gl.glGenTextures(2, mTextureIds, 0); 

Here你如何使用一个以上的粗糙感的例子。

+1

我在您提供的链接上找到了解决方案。你所引用的行应改为:gl.glGenTextures(2,mTextureIds,0); – Nemanja

+0

@Newjaja:修正! – Macarse