2012-09-05 108 views
0

我想將256 * 256紋理映射到多維數據集。當我這樣做時,正面和背面如預期的那樣,左和右面在z方向上反轉,並且頂面和底面被「污跡」成重複的模糊。我之前已經討論過這個問題,但是我能找到的唯一解決方案是使用quads,這些quads在Android的OpenGL ES2.0實現中不可用,或者創建一個包含所有面的頂點的頂點列表(而不僅僅是8個頂點),然後用索引0-23(而不是0-7)引用它們。OpenGL ES2 Android - 將2D紋理映射到GL_TRIANGLES多維數據集

使用給出結果上面的代碼如下IM:

private float vertices[] = { 

    //Front 
    -1.0f, -1.0f, 1.0f, //0 Bottom Left 
    1.0f, -1.0f, 1.0f, //1 Bottom Right 
    -1.0f, 1.0f, 1.0f, //2 Top Left 
    1.0f, 1.0f, 1.0f, //3 Top Right 

    //Back 
    -1.0f, -1.0f, -1.0f, //4 Bottom Left 
    1.0f, -1.0f, -1.0f, //5 Bottom Right 
    -1.0f, 1.0f, -1.0f, //6 Top Left   
    1.0f, 1.0f, -1.0f //7 Top Right 
}; 

//Order to draw points in vertices array 
private short indices[] = { 
    //Faces definition 
    0,1,2, 2,1,3, //Front 
    5,4,7, 7,4,6, //Back 
    1,5,3, 3,5,7, //Right 
    4,0,6, 6,0,2, //Left 
    2,3,6, 6,3,7, //Top 
    4,5,0, 0,5,1 //Bottom 
}; 

private float textureVertices[] = { 
    0.0f, 1.0f, //Front 
    1.0f, 1.0f, 
    0.0f, 0.0f, 
    1.0f, 0.0f, 

    1.0f, 1.0f, //Back 
    0.0f, 1.0f, 
    1.0f, 0.0f, 
    0.0f, 0.0f, 

    1.0f, 1.0f, 
    0.0f, 1.0f, //Right 
    1.0f, 0.0f, 
    0.0f, 0.0f, 

    1.0f, 1.0f, //Left 
    0.0f, 1.0f, 
    1.0f, 0.0f, 
    0.0f, 0.0f, 

    0.0f, 1.0f, //Top 
    1.0f, 1.0f, 
    0.0f, 0.0f, 
    1.0f, 0.0f, 

    0.0f, 1.0f, //Bottom 
    1.0f, 1.0f, 
    0.0f, 0.0f, 
    1.0f, 0.0f 

}; 

public void draw(GL10 gl){ 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureIDs[0]); 

    gl.glEnable(GL10.GL_CULL_FACE); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

    gl.glFrontFace(GL10.GL_CCW); 
    gl.glCullFace(GL10.GL_BACK); 

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,GL10.GL_UNSIGNED_SHORT,indicesBuffer); 

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    gl.glDisable(GL10.GL_CULL_FACE); 
} 

我認爲在後Mapping a square texture to a triangle接受的答案後,幾乎涵蓋了什麼即時通訊,如果它確實有可能在指數和質地我期待的方式。

回答

1

您的vertices數組應該與textureVertices數組的佈局匹配。這意味着8個頂點不足以渲染紋理立方體,因爲indices是紋理和頂點數組的索引,所以在相同位置的頂點可能具有不同的紋理座標,這取決於它們屬於哪個面。

考慮一個旋轉的立方體,使邊緣朝向你。在邊緣的左側,紋理結束。在右側,紋理開始。

+0

感謝您的快速和明確的迴應 - 我現在明白爲什麼我試圖做的不工作。我不明白索引也用於紋理數組。有沒有辦法爲紋理使用單獨的索引數組,或者是匹配紋理頂點和立方體頂點數組的最佳做法? – user1648755