c++OpenGL发布用存储在对象中的vbo和vao绘制网格
c++ OpenGL Issue drawing mesh with vbo and vao stored within an object
我正试图使用c++和OpenGL制作一款3D国际象棋游戏,在制作过程中,我遇到了一个非常奇怪的错误,三角形(棋子的替身)无法绘制,我只剩下一个空白屏幕。当我在主函数中而不是在piece类中创建网格对象时,它可以毫无问题地工作,但当它位于piece类中时,它就不会了。这是指针的问题吗?
这是我的代码:
所以总的来说,我创建了一个国际象棋佩斯
Piece piece = Piece(vec3(0, 0, 0)); //Create a chess peice
稍后在主方法中,网格被绘制成循环(绘制方法将在本文稍后显示)
piece.GetMesh().Draw(); //Draw the chess peice
在国际象棋标题中,我创建了网格信息和对象:
//Mesh information
vector <vec3> verticies;
vector <unsigned int> indicies;
Mesh mesh;
在国际象棋比赛的.cpp文件中,我创建了网格对象-verticalies是vec3向量,indices是无符号int向量。
mesh = Mesh(verticies, indicies); //Create the mesh object
这是网格构造函数
Mesh::Mesh(vector <vec3> verticies, vector <unsigned int> indicies)
{
unsigned int numVerticies = verticies.size();
unsigned int numIndicies = indicies.size();
vector <vec2> texCoords;
//set the tex coords
unsigned int texCoordsIndex = 0;
for (unsigned int i = 0; i < numIndicies; i++)
{
switch (texCoordsIndex)
{
case 0:
texCoords.push_back(vec2(0, 0));
texCoordsIndex++;
break;
case 1:
texCoords.push_back(vec2(0, 1));
texCoordsIndex++;
break;
case 2:
texCoords.push_back(vec2(1, 1));
texCoordsIndex = 0;
break;
}
}
//Sends the mesh to the buffer
drawCount = indicies.size();
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(NUM_BUFFERS, vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo[POSITION_VB]);
glBufferData(GL_ARRAY_BUFFER, verticies.size() * sizeof(verticies[0]), &verticies[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vbo[TEXCOORD_VB]);
glBufferData(GL_ARRAY_BUFFER, texCoords.size() * sizeof(texCoords[0]), &texCoords[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[INDEX_VB]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicies.size() * sizeof(indicies[0]), &indicies[0], GL_STATIC_DRAW);
glBindVertexArray(0);
}
这是draw函数whitch是Mesh类中的一种方法
void Mesh::Draw()
{
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, drawCount, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}
如果我提供的代码不够,只需询问,我就可以向线程添加更多的代码部分。
谢谢。
也许这是一个偶然的发现,但由于您在类Mesh
的构造函数中使用glGenVertexArrays
,我假设您在类Mesh
的析构函数中使用glDeleteVertexArrays
在行中:
mesh = Mesh(verticies, indicies);
发生以下情况:
创建一个临时Mesh
对象,该对象在其构造函数中生成顶点数组对象。此时,所有数据都是有效的,并生成顶点阵列对象(GPU)。指定对象时,临时对象的成员将复制到目标对象。现在存在两个相同的对象。在这之后,立即通过临时对象的析构函数Mesh::~Mesh
销毁临时Mesh
对象并且删除顶点数组对象(glDeleteVertexArrays
)。此时,所有数据都不见了
在destrutorMesh::~Mesh
中放置一个断点,然后就可以简单地跟踪过期时间。
使类不可复制且不可复制构造,但指定移动构造函数和移动运算符。
class Mesh
{
Mesh(const Mesh &) = delete;
Mesh & operator = (const Mesh &) = delete;
Mesh( Mesh && );
Mesh & operator = ( Mesh && );
....
};
参见:
- 移动赋值运算符
- 移动构造函数
- C++11教程:介绍Move构造函数和Move赋值运算符
- VBO必须在VAO之后绑定
- 我们是否需要序列化 VAO 和 VBO
- OpenGL VAO VBO resize
- glVertexAttribDivisor 存储在哪里 - VAO、VBO 或全局状态?
- 为什么VAO可以使用VBO数据绑定它?
- 两个不同的对象 OpenGL.VAO VBO IBO 网格失真问题
- 如何使用多个VAO和VBO在OpenGL中绘制多个对象
- GLSL着色器不渲染任何内容,VAO已填充,VBO已填充顶点
- Opengl VAO and VBO objects
- c++OpenGL发布用存储在对象中的vbo和vao绘制网格
- OpenGL VAO VBO 着色器混淆
- 在3.2中使用VAO和VBO绘制OpenGL线条和正方形
- vao如何知道哪些vbo/ibo被绑定到它?
- 每个着色器属性的VBO没有VAO,或不同的方法
- OPEN GL:这是使用VBO、IBO和VAO的正确方式吗?
- VAO/VBO管理-更改所有VBO数据
- OpenGL - glVertexAttribPointer与多个vbo和vao使用相同的着色器
- 一个VBO可以绑定多个vao
- 如何在体素引擎中正确使用VAO和VBO
- OpenGL -正确分离VAO定义从VBO和其他缓冲区的创建