c++ opengl nvoglv32.dll error



我有一个精灵类来处理初始化精灵并绘制它,但我一直收到这个错误Exception thrown at 0x68ECC760 (nvoglv32.dll),这似乎主要是因为_vboID_vertNum,不过我不确定它们出了什么问题,以下是它的源代码

void Sprite::init(int vertNum, float r, Shape shape) {
    _vertNum = vertNum;
    if (_vboID = 0) {
        glGenBuffers(1, &_vboID);
    }
    std::vector<Vertex> vertexData(vertNum);
    if (shape == Shape::CIRCLE) {
        for (int i = 0; i < vertNum; i++) {
            vertexData[i].setPosition(r*cos(i), r*sin(i));
        }
    }
    for (int i = 0; i < _vertNum; i++) {
        vertexData[i].setColor(1, 1, 1, 1);
    }
    glBindBuffer(GL_VERTEX_ARRAY, _vboID);
    glBufferData(GL_VERTEX_ARRAY, sizeof(vertexData), vertexData.data(), GL_DYNAMIC_DRAW);
    glBindBuffer(GL_VERTEX_ARRAY, 0);
}
void Sprite::draw() {
    //bind buffer array
    glBindBuffer(GL_VERTEX_ARRAY, _vboID);
    //use first vertex attrib array
    glEnableVertexAttribArray(0);
    //pointer to vertices location
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));
    //pointer to vertices color
    glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, color));
    //Draw the 6 vertices to the screen
    glDrawArrays(GL_POLYGON, 0, _vertNum);
    //Disable the vertex attrib array. This is not optional.
    glDisableVertexAttribArray(0);
    //Unbind the VBO
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

GL_VERTEX_ARRAY不是有效的缓冲区绑定目标。你要找的是GL_ARRAY_BUFFER

当您在需要缓冲区绑定目标的上下文中使用GL_VERTEX_ARRAY时,您应该只得到一个GL_INVALID_ENUM错误,并且调用将不会产生进一步的影响。因此,在glVertexAttribPointer调用期间没有绑定GL_ARRAY_BUFFER,这将导致GL将您的指针解释为指向客户端内存的指针。

您真的应该添加一些错误检查,或者使用调试回调,这样就可以尽早发现这些简单的错误。

相关内容

最新更新