如何正确跟踪 VBO 和 VAO 以进行清理?
How to properly keep track of VBOs and VAOs for cleanup?
请原谅我的笨拙,但我是其中之一。我目前正在尝试寻找一种方法来跟踪 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]);
我想我可以为模型 class 使用析构函数,并让每个模型删除自己的 VAO 和 VBO,因为每个模型都会跟踪它们。这是 Model::_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__
缺少 address-of (&
) 运算符
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());
}
请原谅我的笨拙,但我是其中之一。我目前正在尝试寻找一种方法来跟踪 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]);
我想我可以为模型 class 使用析构函数,并让每个模型删除自己的 VAO 和 VBO,因为每个模型都会跟踪它们。这是 Model::_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__
缺少 address-of (&
) 运算符
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());
}