Opengl es 如何更改opengles中glDrawArrays方法中使用的vertexbuffer的内容

Opengl es 如何更改opengles中glDrawArrays方法中使用的vertexbuffer的内容,opengl-es,3d,Opengl Es,3d,我有一些三角形多边形,并以传统方式绘制它们: (android java代码) 我想更新三角形的顶点坐标。我发现的所有教程都使用初始顶点数据,然后仅对其应用变换。我需要独立地更改每个顶点坐标 我更改了用于创建相关vertexbuffer的数组的内容,但它不会在屏幕上进行任何更改。我想,在每个帧上重建vertexbuffer似乎不是正确的方法 如果您知道任何示例源代码,您至少可以指出任何示例源代码吗?我认为您要做的是在初始化时创建多个顶点缓冲区,然后使用glBindBuffer()绑定到不同的顶点

我有一些三角形多边形,并以传统方式绘制它们: (android java代码)

我想更新三角形的顶点坐标。我发现的所有教程都使用初始顶点数据,然后仅对其应用变换。我需要独立地更改每个顶点坐标

我更改了用于创建相关vertexbuffer的数组的内容,但它不会在屏幕上进行任何更改。我想,在每个帧上重建vertexbuffer似乎不是正确的方法


如果您知道任何示例源代码,您至少可以指出任何示例源代码吗?

我认为您要做的是在初始化时创建多个顶点缓冲区,然后使用glBindBuffer()绑定到不同的顶点缓冲区。基本上,如前所述更新数组的内容,然后调用
glBufferSubData
以使用新值更新顶点缓冲区对象


这假设您只修改了相对较小的数据子集。如果要修改大部分数据,通常最好再次调用
glBufferData

我发现我的大部分问题都与java android相关@jerry为我问题的主要思想提出了正确的解决方案,但我将讨论与java android相关的部分问题:

第一,;Android渲染器界面中的方法签名为您提供了一个GL10对象作为参数,但您需要的一些方法在opengl-es1.1中,因此您需要转换gl对象

public void onDrawFrame(GL10 gl) {
   GL11 gl11 = (GL11)gl;    
当然,如果设备不支持opengl-es1.1,您的代码将无法工作,但这超出了我们的主题

我的另一个问题是关于opengl es的java实现的差异。在java中,您创建一个相关的缓冲区对象,它是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:不,我不记得在使用
glbuffersubdata
时做过任何不寻常/特殊的事情。我做过类似的smt(如果看起来很清楚的话)public void draw(GL11 gl){gl.glEnableClientState(GL10.gl\u VERTEX\u数组);gl.glEnableClientState(GL10.gl_纹理_坐标_数组);gl.glVertexPointer(3,GL10.gl_浮点,0,顶点缓冲);gl.glTexCoordPointer(2,GL10.gl_浮点,0,纹理缓冲);gl.glDrawArrays(GL10.gl_三角形,0,3);gl.glDisableClientState(GL10.gl_顶点_数组);GL10.glDisableClientState(GL10.gl_纹理_坐标_数组);顶点[0]+=5;gl.glBufferSubData(GL11.gl_数组_BUFFER,0,4,vertexBuffer);}我会继续努力,如果可以,我会通知你manage@JerryCoffin您没有指出这样一个事实,即
glBufferSubData
仅在缓冲区的一小部分需要更新时才可取。否则,应使用
glBufferData
。来源:@b1nary.atr0phy:至少在我读到它时,这就是问题的全部。He已经提交了数据,正在修改一些特定的部分,并希望避免重新发送所有数据。我不明白这将如何工作。我希望更改每个顶点的内容,而不是在数组之间切换。没有理由这样做。如果他只使用一个VBO有问题,那么告诉他使用多个是解决不了的任何东西
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);

}