繁体   English   中英

带有存储在对象中的vbo和vao的c ++ OpenGL问题绘图网格

[英]c++ OpenGL Issue drawing mesh with vbo and vao stored within an object

我正在尝试使用c ++和OpenGL制作3D象棋游戏,而这样做的时候,我遇到了一个非常奇怪的错误,即三角形(代表棋子的棋子)不会画图,而我却留下了空白的画面。 当我在主函数中而不是在片段类中创建网格对象时,它可以正常工作,但是在片段类中却没有问题。 这是指针问题吗?

这是我的代码:

所以我主要是创建一个国际象棋

Piece piece = Piece(vec3(0, 0, 0)); //Create a chess peice

稍后在main方法中,网格是在循环中绘制的(draw方法将在本文后面显示)

piece.GetMesh().Draw(); //Draw the chess peice

在国际象棋peice标头中,创建网格信息和对象:

//Mesh information
vector <vec3> verticies;
vector <unsigned int> indicies;
Mesh mesh;

在国际象棋的.cpp文件中,我创建了网格对象-顶点是vec3向量,而索引是无符号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);
}

这是绘制函数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 )。 至此,所有数据都消失了。

在析构函数Mesh::~Mesh 〜Mesh中放置一个断点,然后您可以简单地跟踪到期时间。

使该类不可复制且不可复制构造,但指定一个move构造函数和move运算符。

class Mesh 
{
    Mesh(const Mesh &) = delete;
    Mesh & operator = (const Mesh &) = delete;

    Mesh( Mesh && );
    Mesh & operator = ( Mesh && );

    ....
};

看到:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM