首页 > 解决方案 > 如何正确跟踪 VBO 和 VAO 以进行清理?

问题描述

原谅我的笨拙,但我是其中之一。我目前正在尝试寻找一种方法来跟踪 VAO 和 VBO id,以便我可以使用 for 循环运行它们并告诉 OpenGL 删除它们。我目前的方法是将它们推入向量并在终止时向后运行它们,这导致了段错误。在编译时使用向量一直在给我这个警告:

lou@debian:~/Development/GamEngine$ make
src/model.cpp: In static member function ‘static void Model::_cleanup()’:
src/model.cpp:39:27: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   39 |   glDeleteVertexArrays(1, (unsigned int*)_vaos[i]);
src/model.cpp:43:22: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   43 |   glDeleteBuffers(1, (unsigned int*)_vbos[i]);

我在想我也许可以为模型类使用析构函数,并让每个模型删除自己的 VAO 和 VBO,因为每个模型都会跟踪这些。这是模型::_cleanup():

void Model::_cleanup()
{
    // Clean VAOs
    for(int i = _vaos.size(); i > 0; i--) {
        glDeleteVertexArrays(1, (unsigned int*)_vaos[i]);
    }
    // Clean VBOs
    for(int i = _vbos.size(); i > 0; i--) {
        glDeleteBuffers(1, (unsigned int*)_vbos[i]);
    }
}

这是model.hpp:

#ifndef __MODEL_HPP__
#define __MODEL_HPP__

#include <glad/glad.h> 
#include <vector>

using std::vector;

class Model
{

public:
    Model(float* p_pos);
    unsigned int getVaoID() { return m_vaoID; }
    unsigned int getVboID() { return m_vboID; }
    unsigned int getVertexCount() { return m_vertexCount; }

    static void _cleanup();

private:
    unsigned int m_vaoID;
    unsigned int m_vboID;
    unsigned int m_vertexCount;

    void m_createVAO(int p_attribNum, float* p_data);
    void m_unbindVAO();

    void m_createVBO();
    void m_unbindVBO();

    static vector<unsigned int> _vaos;
    static vector<unsigned int> _vbos;

};

#endif // __MODEL_HPP__

标签: c++openglopengl-4

解决方案


缺少地址 ( &) 运算符

glDeleteVertexArrays(1, (unsigned int*)_vaos[i]);

glDeleteVertexArrays(1, &_vaos[i]);

或者,您可以这样做:

glDeleteVertexArrays(1, _vaos.data()+i);

无论如何,您根本不需要 for 循环(请参阅 参考资料std::vector):

void Model::_cleanup()
{
    glDeleteVertexArrays(_vaos.size(), _vaos.data());
    glDeleteBuffers(_vbos.size(), _vbos.data());
}

推荐阅读