Opengl es 调用glBufferSubData时生成一个GLU无效\U操作

Opengl es 调用glBufferSubData时生成一个GLU无效\U操作,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,我想让GLTools在Android设备上启动(GLTools是OpenGL SuperBible的一个库)。这本书只谈到iOS,没有提到Android。 有一个问题 void GLBatch::CopyVertexData3f(M3DVector3f *vVerts) { // First time, create the buffer object, allocate the space if(uiVertexArray == 0) { glGenBuffers(1, &u

我想让GLTools在Android设备上启动(GLTools是OpenGL SuperBible的一个库)。这本书只谈到iOS,没有提到Android。 有一个问题

void GLBatch::CopyVertexData3f(M3DVector3f *vVerts) 
{
// First time, create the buffer object, allocate the space
if(uiVertexArray == 0) {
    glGenBuffers(1, &uiVertexArray);
    glBindBuffer(GL_ARRAY_BUFFER, uiVertexArray);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * nNumVerts, vVerts, GL_DYNAMIC_DRAW);
    }
else    { // Just bind to existing object
    glBindBuffer(GL_ARRAY_BUFFER, uiVertexArray);
    __android_log_print(ANDROID_LOG_ERROR, "CopyVertexData3f", "uiVertexArray = %d", 
        glIsBuffer(uiVertexArray));
    // Copy the data in
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * 3 * nNumVerts, vVerts);
    //glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * nNumVerts, vVerts, GL_DYNAMIC_DRAW);
    pVerts = NULL;
    }
}
如果变量uiVertexArray不是零。代码将进入else块并抛出如下GL_INVALID_操作:

<qgl2DrvAPI_glBufferSubData:769>: GL_INVALID_OPERATION
:GL\u无效\u操作
如果保留缓冲区对象名称0绑定到目标,则生成GL_无效_操作。 但uiVertexArray不是零。调用glBufferSubData时,为什么代码抛出GL_无效_操作


一旦我将glBufferSubData更改为glBufferData,它就会工作。

如果映射了缓冲区,也会调用它。您可以尝试显式取消映射它吗?另外,我希望您在正确的线程上调用它(与您创建上下文的线程相同)。如果您尝试在缓冲区结尾之外写入,也可能发生错误。您确定
nNumVerts
不大于初始创建缓冲区时的值吗?