2011-08-22 41 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