2011-08-09 46 views
3

我一些我想要什麼新的OpenGL ES,並建立一個簡單的立方體,但似乎有讓我想有4個不同的TRIANGLE_FANs的指數之字節的緩衝區的一些問題,我會怎樣去這樣做/重寫我的代碼:的Android/openGL的立方體GL_TRIANGLE_FAN

public class GLCube{ 

private float vertices[] = { 
    1, 1, -1, //p0 - topFrontRight 
    1, -1, -1, //p1 bottomFront Right 
    -1, -1, -1, //p2 bottom front left 
    -1, 1, -1, //p3 front top left 
    1, 1, 1, //p4 - topBackRight 
    1, -1, 1, //p5 bottomBack Right 
    -1, -1, 1, //p6 bottom back left 
    -1, 1, 1, //p7 front back left 
}; 

private FloatBuffer vertBuff; 

private short[] pIndex = { 
     0, 4, 1, 3, //i0 fan of top front right 
     5, 4, 1, 6, //i1 fan from bottom right back 
     2, 1, 3, 6, //i2 fan from bottom left front 
     7, 3, 4, 6 //i3 fan from top left back 
}; 

private ShortBuffer pBuff; 

public GLCube(){ 

    ByteBuffer bBuff = ByteBuffer.allocateDirect(vertices.length * 4); 
    bBuff.order(ByteOrder.nativeOrder()); 
    vertBuff = bBuff.asFloatBuffer(); 
    vertBuff.put(vertices); 
    vertBuff.position(0); 


    ByteBuffer pbBuff = ByteBuffer.allocateDirect(pIndex.length * 2); 
    pbBuff.order(ByteOrder.nativeOrder()); 
    pBuff = pbBuff.asShortBuffer(); 
    pBuff.put(pIndex); 
    pBuff.position(0); 
} 

public void draw(GL10 gl){ 
    gl.glFrontFace(GL10.GL_CW); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff); 
    gl.glDrawElements(GL10.GL_TRIANGLE_FAN, pIndex.length, GL10.GL_UNSIGNED_SHORT, pBuff); 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 

} 
} 

我認爲你必須使用GL10.GL_PRIMITIVE_RESTART,但與Android,我不認爲這存在...

回答

3

你是正確的假設,沒有primitive_restart分機,您不能在一個電話glDrawElements中呈現多個三角形風扇。你可以做的是使用glMultiDrawElements,在那裏你可以在一個調用繪製多個圖元,但它的使用是有點麻煩,我不知道它是否真的讓你在一個三角形列表peformance好處(尤其是這種簡單的立方體)。

我給你的一般提示是遠離三角形條和粉絲等複雜的圖元,因爲它們只用於某些特殊的小几何圖形(無論如何你都不會獲得任何性能優勢)。如果有的話,更大的一般網格需要更多的努力才能真正從這些基本類型中獲得優勢。只需使用一個簡單的索引三角列表,你很好。

順便說一句,如果你真的想要一個立方體的「高精尖」的細分,你可以建立從一個單一的三角形帶一個立方體,但解決的辦法是給你或谷歌。

編輯:剛看了GLES規範,似乎在ES中刪除了glMultiDraw...功能。所以沒有辦法繞過單個索引三角形列表(或三角形條形解決方案),至少如果要在一次調用中繪製立方體,這是可取的。

+0

嘿基督教,非常感謝你的迴應!就像我說的,我對OpenGL相當陌生,你的深思熟慮的迴應已經幫了大忙。再次感謝 – travis

+0

@ user848162如果有幫助,我們將讚賞增加投票(也許接受)。 –

+0

我真的覺得這樣做的原因是球迷,他們都極其有限使用,它們大多是有用的使用即時模式時,當手工編程的形狀('在glBegin()/ glEnd()')。這可以解釋爲什麼微軟[在D3D10剝離出來三角形扇(http://gamedev.stackexchange.com/questions/35547/why-are-triangle-fans-not-supported-in-direct3d-10-or-later) – bobobobo