c++ - 如何正确跟踪 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__
解决方案
缺少地址 ( &
) 运算符
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());
}
推荐阅读
- haskell - Xmonad 基于环境变量设置布局
- jquery - 如何防止在输入中选择删除部分字符串,同时仍允许用户编写其余部分
- perl - 带有非 ERP 渲染器的 Mojolicious 自定义错误页面?
- snowflake-cloud-data-platform - oracle 到雪花查询的转换
- javascript - 组件内的 SPA 并单击导航附加到 url VueJS
- excel - 使用 vba 查找列标题并在该标题下添加新记录
- javascript - 添加手动 Plotly 事件(例如 onLegendClick)时模式栏消失 - plotly.js/react-plotly.js
- java - Spring Boot 容器应用程序上的 Datadog 检测 - 找不到类
- mysql - 更改 2 个外键的表时 H2 失败(MYSQL 语法)
- asp.net - 你能在 IIS 中运行 asp.net core 3.0 gRPC CLIENT 吗?(可能在 Azure 上?)