c ++ OpenGL问题绘图网格,其中vbo和vao存储在object中
c++ OpenGL Issue drawing mesh with vbo and vao stored within an object
我正在尝试使用 C++ 和 OpenGL 制作一个 3D 国际象棋游戏,但在这样做时我遇到了一个非常奇怪的错误,三角形(代表棋子)不会绘制,我只剩下一个黑屏。当我在 main 函数中而不是在 class 中创建网格 object 时,它可以正常工作,但是当它在 class 中时却没有。这是指针的问题吗?
这是我的代码:
所以主要是我创建了一个国际象棋棋子
Piece piece = Piece(vec3(0, 0, 0)); //Create a chess peice
稍后在 main 方法中循环绘制网格(draw 方法稍后将在此 post 中显示)
piece.GetMesh().Draw(); //Draw the chess peice
在国际象棋中 header 我创建了网格信息 object:
//Mesh information
vector <vec3> verticies;
vector <unsigned int> indicies;
Mesh mesh;
我在国际象棋的 .cpp 文件中创建了网格 object
- verticies 是一个 vec3 向量,indicies 是一个无符号整型向量。
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);
}
这里是绘制函数,它是 Mesh 中的一个方法 class
void Mesh::Draw()
{
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, drawCount, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}
如果我提供的代码不足,请询问,我可以在线程中添加更多代码部分。
谢谢。
也许这是一个愚蠢的想法,但由于您在 class Mesh
的构造函数中使用了 glGenVertexArrays
,因此我假设您在 glDeleteVertexArrays
class Mesh
.
的析构函数
在这一行中:
mesh = Mesh(verticies, indicies);
发生以下情况:
您创建了一个临时 Mesh
对象,该对象在其构造函数中生成顶点数组对象。此时所有数据都有效,生成顶点数组对象(GPU)。当您分配对象时,临时对象的成员被复制到目标对象。现在存在 2 个相同的对象。完成后,临时 Mesh
对象立即被销毁,顶点数组对象被临时对象的析构函数 Mesh::~Mesh
删除(glDeleteVertexArrays
)。此时所有数据都没有了。
在析构函数中设置断点Mesh::~Mesh
,然后您可以简单地跟踪过期时间。
使 class 不可复制且不可复制构造,但指定移动构造函数和移动运算符。
class Mesh
{
Mesh(const Mesh &) = delete;
Mesh & operator = (const Mesh &) = delete;
Mesh( Mesh && );
Mesh & operator = ( Mesh && );
....
};
参见:
我正在尝试使用 C++ 和 OpenGL 制作一个 3D 国际象棋游戏,但在这样做时我遇到了一个非常奇怪的错误,三角形(代表棋子)不会绘制,我只剩下一个黑屏。当我在 main 函数中而不是在 class 中创建网格 object 时,它可以正常工作,但是当它在 class 中时却没有。这是指针的问题吗?
这是我的代码:
所以主要是我创建了一个国际象棋棋子
Piece piece = Piece(vec3(0, 0, 0)); //Create a chess peice
稍后在 main 方法中循环绘制网格(draw 方法稍后将在此 post 中显示)
piece.GetMesh().Draw(); //Draw the chess peice
在国际象棋中 header 我创建了网格信息 object:
//Mesh information
vector <vec3> verticies;
vector <unsigned int> indicies;
Mesh mesh;
我在国际象棋的 .cpp 文件中创建了网格 object - verticies 是一个 vec3 向量,indicies 是一个无符号整型向量。
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);
}
这里是绘制函数,它是 Mesh 中的一个方法 class
void Mesh::Draw()
{
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, drawCount, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}
如果我提供的代码不足,请询问,我可以在线程中添加更多代码部分。
谢谢。
也许这是一个愚蠢的想法,但由于您在 class Mesh
的构造函数中使用了 glGenVertexArrays
,因此我假设您在 glDeleteVertexArrays
class Mesh
.
的析构函数
在这一行中:
mesh = Mesh(verticies, indicies);
发生以下情况:
您创建了一个临时 Mesh
对象,该对象在其构造函数中生成顶点数组对象。此时所有数据都有效,生成顶点数组对象(GPU)。当您分配对象时,临时对象的成员被复制到目标对象。现在存在 2 个相同的对象。完成后,临时 Mesh
对象立即被销毁,顶点数组对象被临时对象的析构函数 Mesh::~Mesh
删除(glDeleteVertexArrays
)。此时所有数据都没有了。
在析构函数中设置断点Mesh::~Mesh
,然后您可以简单地跟踪过期时间。
使 class 不可复制且不可复制构造,但指定移动构造函数和移动运算符。
class Mesh
{
Mesh(const Mesh &) = delete;
Mesh & operator = (const Mesh &) = delete;
Mesh( Mesh && );
Mesh & operator = ( Mesh && );
....
};
参见: