我发现我的大部分问题都与 java-android 相关。 @jerry 为我的问题中的主要思想提出了正确的解决方案,但我将解决与 java-android 相关的问题部分:
首先; Android 的 Renderer 接口中的方法签名为您提供了一个 GL10 对象作为参数,但您需要的一些方法在 opengl-es1.1 中,因此您需要强制转换 gl 对象。
public void onDrawFrame(GL10 gl) {
GL11 gl11 = (GL11)gl;
当然,如果设备不支持 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 对象。你可以从这个 sn-p 中得到我的想法。
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);
}
如果有误导的地方可以指正..