java - 重复调用 glBufferData 未能为新缓冲区分配内存

标签 java android opengl-es opengl-es-2.0

在渲染器的初始化中,VBO被创建并绑定(bind)到GL_ARRAY_BUFFER或GL_ELEMENTS_ARRAY_BUFFER,第一个有三个顶点。调用glBufferData将这三个顶点的属性缓存到GPU。 如:

InitVBO() {

    vboArray = new int[4];

    GLES20.glGenBuffers(4, vboArray, 0);

    poseBuf = ByteBuffer.allocateDirect(poseLength * Float.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
    UpdatePose(); // fill array data to FloatBuffer

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboArray[VBO_VERTEX]);
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, poseLength * Float.SIZE / Byte.SIZE, poseBuf, GLES20.GL_DYNAMIC_DRAW);    // poseBuf initialized capacity is 9 * 4

    GLES20.glGetBufferParameteriv(GLES20.GL_ARRAY_BUFFER, GLES20.GL_BUFFER_SIZE, params, 0);  // Get params[0] is 36

    colorBuf = ByteBuffer.allocateDirect(colorLength * Float.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
    UpdateColor(); // fill array data to FloatBuffer
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboArray[VBO_GRID_COLOR]);
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, colorLength * Float.SIZE / Byte.SIZE, gridColorBuf, GLES20.GL_DYNAMIC_DRAW);

    ...
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
}

然后,它在子线程中从 TCP Network Msg 接收顶点数据。顶点数多于三个。我想起了glBufferData:

UpdateVBO(){

    poseBuf = ByteBuffer.allocateDirect(poseLength * Float.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
    UpdatePose(); // fill array data to FloatBuffer
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboArray[VBO_VERTEX]);
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, poseLength * Float.SIZE / Byte.SIZE, poseBuf, GLES20.GL_DYNAMIC_DRAW);  // poseBuf has been updated with capacity 12 * 4

    GLES20.glGetBufferParameteriv(GLES20.GL_ARRAY_BUFFER, GLES20.GL_BUFFER_SIZE, pnew, 0);  // get pnew[0] is 0

    ...

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
}

为什么 OpenGL ES Server 不为新缓冲区分配内存?

最佳答案

我找到了答案。

我的程序的重大错误是我不应该在程序的子线程中更新缓冲区缓存。

如果我创建一个由子线程调用的函数来更新顶点poseBuf,并更新绘制函数中的VBO缓存。这个问题将会得到解决。

关于java - 重复调用 glBufferData 未能为新缓冲区分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38950558/

相关文章:

java - 按位 "& "就长了?

java - Libgdx 处理 SVG

java - 二进制到字符串的麻烦

java - 图书馆 |安卓|我可以在简单游戏中使用非 pow2 纹理吗?

java - 如何在 C/OpenGL 中从整数数组创建位图

java - 如何为 Spring 托管 bean 编写 Junit 测试用例?

java - 有没有办法忽略 Toothpick 中的绑定(bind)覆盖?

android - 未定义 layoutweight 属性时 View 消失

安卓 : Quickblox get total unread message count

c++ - 什么是 Regal OpenGL?