2011-05-01 72 views
3

我有一些三角的多邊形,以傳統的方式把他們拉在調用glDrawArrays方法使用vertexbuffer的內容: (Android的Java代碼)如何更改opengles

gl.glDrawArrays(GL10.GL_TRIANGLES, i, j); 

我想更新的頂點座標的三角形。我發現的所有教程都使用初始頂點數據,然後只對它們應用變換。我需要獨立地更改每個頂點座標。

我更改用於創建相關頂點緩衝區的數組的內容,但它不會在屏幕上進行任何更改。在每個幀上重建頂點緩衝區似乎都不是我想的正確方式。

如果你知道的話,你可以至少指出任何示例源代碼?

回答

6

你似乎在尋找glBufferSubData。基本上,如上所述,您更新數組的內容,然後調用glBufferSubData以使用新值更新頂點緩衝區對象。

這假定你只修改了一小部分數據。如果您要修改大部分數據,最好再撥打glBufferData代替。

+0

也許你是對的,但我無法設法工作。你知道在使用glbuffersubdata之前是否需要做一些關於glgenbuffers和glbindbuffer的準備工作? – emre 2011-05-01 18:51:49

+0

@emre:不,我不記得使用'glbufferSubData'做任何異常/特殊的事情。 – 2011-05-01 18:53:15

+0

我做類似於這個(如果它似乎很清楚) \t public void draw(GL11 gl){ \t \t gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); \t \t gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); \t \t \t \t gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer); \t \t gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,textureBuffer); \t \t \t \t gl.glDrawArrays(GL10.GL_TRIANGLES,0,3); \t \t \t gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); \t \t gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); \t \t \t 頂點\t [0] + = 5; \t \t gl.glBufferSubData(GL11.GL_ARRAY_BUFFER \t,0,4,vertexBuffer); \t \t \t} \t我會繼續奮鬥,並告知如果@JerryCoffin你無法指出一個事實,即'glBufferSubData'只是建議在緩衝區的一小部分需要更新我可以管理 – emre 2011-05-01 19:06:04

-1

我想你想要做的是在初始化時創建多個頂點緩衝區,然後只要綁定使用glBindBuffer()不同的人

+0

我不明白這將如何工作。我想更改每個頂點的內容,而不是在數組之間切換。 – emre 2011-05-01 18:54:44

+1

沒有理由這樣做。如果他只與一個VBO有關,那麼告訴他使用多個VBO不會解決任何問題。 – 2014-09-25 00:15:05

1

我發現我的問題的大部分是java-android相關的。 @jerry在我的問題中提出了正確的解決方案,但我會解決與java-android相關的部分問題:

首先; Android的Renderer接口中的方法簽名爲您提供了一個GL10對象作爲參數,但您需要的一些方法在opengl-es1.1中,因此您需要投射gl對象。

public void onDrawFrame(GL10 gl) { 
    GL11 gl11 = (GL11)gl;  

Ofcourse,如果設備不支持OpenGL-ES1.1您的代碼將無法正常工作,但是這是我們的主題。

我的另一個問題是關於opengl-es的Java實現的差異。在java中,您創建了一個相關的Buffer對象,它是java.nio包中的本機java類,並用指定的數組填充此緩衝區。

public static FloatBuffer createFloatBuffer(float[] array){  
    ByteBuffer byteBuf = ByteBuffer.allocateDirect(array.length * 4); 
    byteBuf.order(ByteOrder.nativeOrder()); 
    FloatBuffer fbuf = byteBuf.asFloatBuffer(); 
    fbuf.put(array); 
    fbuf.position(0); 
    return fbuf; 
} 

在這部分之後,你與數組對象無關。您需要更新緩衝區對象。您可以使用相關緩衝區類的put(index, value)方法更新緩衝區的內容。

這是我們要繪製的對象的draw()方法。 vertexBuffer是一個FloatBuffer對象。你可以從這段代碼中得到我想到的想法。

public void draw(GL11 gl) { 

    vertexBuffer.put(index, floatValue); 
    gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, 0, vertexBuffer.capacity(),vertexBuffer); 

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

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 

    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); 

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

} 

你可以糾正我,如果有誤導性的點..