2011-12-25 139 views
2

我想獲得一個簡單的立方體貼圖,而不使用紋理圖集。我可以在任何給定的時間綁定看到我的任何一個紋理,但似乎不能超過1,更不用說6.下面是我的繪製循環中的代碼。OpenGL ES 1.1 Android Cubemapping

/*Cube to draw */ 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cube); 

    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[2]); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, circleTexCoords);  
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[3]); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[4]); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[5]); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[6]); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D,mTextures[7]); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4); 

我在這裏丟失了什麼?

事我已經做了檢查: 是的,我產生一個紋理緩存。 是的,我從我的資源中正確加載和綁定紋理。 是的,上面的代碼工作的時候,而不是結合紋理我glColorf

畫它,我感謝你的幫助。

編輯:

如何產生的立方體:

private float box[] = new float[] { 
     // FRONT 
     -0.5f, -0.5f, 0.5f, 
     0.5f, -0.5f, 0.5f, 
     -0.5f, 0.5f, 0.5f, 
     0.5f, 0.5f, 0.5f, 
     // BACK 
     -0.5f, -0.5f, -0.5f, 
     -0.5f, 0.5f, -0.5f, 
     0.5f, -0.5f, -0.5f, 
     0.5f, 0.5f, -0.5f, 
     // LEFT 
     -0.5f, -0.5f, 0.5f, 
     -0.5f, 0.5f, 0.5f, 
     -0.5f, -0.5f, -0.5f, 
     -0.5f, 0.5f, -0.5f, 
     // RIGHT 
     0.5f, -0.5f, -0.5f, 
     0.5f, 0.5f, -0.5f, 
     0.5f, -0.5f, 0.5f, 
     0.5f, 0.5f, 0.5f, 
     // TOP 
     -0.5f, 0.5f, 0.5f, 
     0.5f, 0.5f, 0.5f, 
     -0.5f, 0.5f, -0.5f, 
     0.5f, 0.5f, -0.5f, 
     // BOTTOM 
     -0.5f, -0.5f, 0.5f, 
     -0.5f, -0.5f, -0.5f, 
     0.5f, -0.5f, 0.5f, 
     0.5f, -0.5f, -0.5f, 
}; 

/* Initialize values for cube */ 
ByteBuffer bb = ByteBuffer.allocateDirect(Float.SIZE * box.length); 
bb.order(ByteOrder.nativeOrder()); 
cube = bb.asFloatBuffer(); 
cube.put(box); 
cube.rewind(); 

CircleTexCoords是用詞不當,我使用它作爲一個單元,紋理座標幾種不同的紋理:

bb = ByteBuffer.allocateDirect(Float.SIZE * 8); 
bb.order(ByteOrder.nativeOrder()); 
circleTexCoords = bb.asFloatBuffer(); 
circleTexCoords.put(new float[] { 0f, 1f, 1f, 1f, 0f, 0f, 1f, 0f}); 
circleTexCoords.rewind(); 
+0

什麼'cube'和'circleTexCoords'包含哪些內容? – 2011-12-25 09:19:09

+0

代碼生成這些添加。 – nmjohn 2011-12-25 17:06:38

+0

啊,我猜對了! – 2011-12-25 20:06:20

回答

1

你頂點數組不匹配。從當前啓用的屬性數組中繪製時,對於您的案例vertex和tecCoords,數組必須匹配大小當然。當您致電glDrawArrays(..., 8, 4)時,您指示OpenGL從第8個元素開始繪製4個數組元素(頂點)。但是你的texCoord數組只包含4個頂點,頂點數組中頂點4-23的texCoords應該是什麼?或者,OpenGL應該如何知道你想爲每4個連續頂點重複texCoords。

所以爲了讓它工作,你需要自己重複texCoords。請始終記住,所有已啓用數組的大小在從它們中繪製時(至少到最後繪製的元素)必須匹配。所以你重新使用這個小的circleTexCoords陣列的想法將無法工作。

這是因爲在概念上,頂點不僅僅是一個位置,而是所有屬性(位置,法線,texCoords,...)的compaund。同樣,頂點不僅是來自數組的元素,它綁定到glVertexPointer,而是來自所有當前已啓用的數組。這也是爲什麼你不能在OpenGL中有兩個不同的texCoords而沒有重複的單個頂點,因爲好吧,那麼它不再是單個頂點。在OpenGL中指定位置屬性頂點是一個不好的選擇,雖然這更多是出於遺留原因,並且已經在現代OpenGL中進行了清理。

+0

感謝您的回答和解釋。這非常有意義,我證實這些更改實際上按照需要工作。 – nmjohn 2011-12-26 03:46:52