我發現我的問題的大部分是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);
}
你可以糾正我,如果有誤導性的點..
也許你是對的,但我無法設法工作。你知道在使用glbuffersubdata之前是否需要做一些關於glgenbuffers和glbindbuffer的準備工作? – emre 2011-05-01 18:51:49
@emre:不,我不記得使用'glbufferSubData'做任何異常/特殊的事情。 – 2011-05-01 18:53:15
我做類似於這個(如果它似乎很清楚) \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