VAO被删除而无需致电Gldeletevertexarrays()

VAO gets deleted without calling glDeleteVertexArrays()

本文关键字:Gldeletevertexarrays 删除 VAO      更新时间:2023-10-16

我刚刚开始学习OpenGL,我目前正在尝试应用我在小型游戏体系结构中获得的OpenGL知识,但是我很难与课堂合作。我正在尝试使用这样的单独类在屏幕上显示三角形:cubemodel.h

 #pragma once
 #include <vector>
 #include <gladglad.h>
 class CubeModel
 {
 public:
     //x y and z are dimensions of the cube
     CubeModel();
     CubeModel( float x, float y, float z);
     ~CubeModel();
     void Bind();
     void Unbind();
private:
     unsigned int m_VAO, m_VBO;
     std::vector<float> m_vertices = {
        -0.5f, -0.5f, 0.0f,
         0.5f, -0.5f, 0.0f,
         0.0f,  0.5f, 0.0f
     };
     std::vector<float> m_vertices2 = {
        -0.5f, -0.5f, -0.5f,  0.0f, 0.0f,
         0.5f, -0.5f, -0.5f,  1.0f, 0.0f,
         0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
         0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
        -0.5f,  0.5f, -0.5f,  0.0f, 1.0f,
        -0.5f, -0.5f, -0.5f,  0.0f, 0.0f,
        -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
         0.5f, -0.5f,  0.5f,  1.0f, 0.0f,
         0.5f,  0.5f,  0.5f,  1.0f, 1.0f,
         0.5f,  0.5f,  0.5f,  1.0f, 1.0f,
        -0.5f,  0.5f,  0.5f,  0.0f, 1.0f,
        -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
        -0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
        -0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
        -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
        -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
        -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
        -0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
         0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
         0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
         0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
         0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
         0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
         0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
        -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
         0.5f, -0.5f, -0.5f,  1.0f, 1.0f,
         0.5f, -0.5f,  0.5f,  1.0f, 0.0f,
         0.5f, -0.5f,  0.5f,  1.0f, 0.0f,
        -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
        -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
        -0.5f,  0.5f, -0.5f,  0.0f, 1.0f,
         0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
         0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
         0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
        -0.5f,  0.5f,  0.5f,  0.0f, 0.0f,
        -0.5f,  0.5f, -0.5f,  0.0f, 1.0f
    };
};

cubemodel.cpp

#include "CubeModel.h"
CubeModel::CubeModel()
{
    CubeModel(1.0f, 1.0f, 1.0f);
}
CubeModel::CubeModel(float x, float y, float z)
{
    unsigned int VAO, VBO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(m_vertices[0]) * m_vertices.size(), 
    m_vertices.data(), GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);
    glBindVertexArray(0);
    m_VAO = VAO;
    m_VBO = VBO;
}
CubeModel::~CubeModel()
{
    glDeleteVertexArrays(1, &m_VAO);
    glDeleteBuffers(1, &m_VBO);
}
void CubeModel::Bind()
{
    glBindVertexArray(m_VAO);
}
void CubeModel::Unbind()
{
    glBindVertexArray(0);
}

game_state.h(使用cubemodel):

#pragma once
#include "Window.h"
#include "Shader.h"
#include "CubeModel.h"
#define TIMESTEP 1.0f/100.0f
class Game_State
{
public:
    Game_State();
    ~Game_State();
    int             Run();
    bool            IsDone();
private:
    void            HandleInput();
    void            Update(double deltatime);
    void            Render();
    Window          m_window;
    double          m_elapsedTime = 0;
    Shader          m_cubeShader;
    CubeModel       m_testCube;
};

game_state.cpp:

#include "Game_State.h"
Game_State::Game_State()
    : m_window("Title to be determined...", glm::vec2(1920, 1080))
    , m_cubeShader("cubeshader.vs","cubeshader.fs")
{
}
Game_State::~Game_State()
{
}
int Game_State::Run()
{
    while (m_elapsedTime > TIMESTEP)
    {
        m_elapsedTime -= TIMESTEP;
        HandleInput();
        Update(m_elapsedTime);
    }
    Render();
    m_elapsedTime += glfwGetTime();
    glfwSetTime(0.0f);
    return 0;
}
void Game_State::Update(double deltatime)
{
    m_window.Update();
}
void Game_State::Render()
{
    m_window.BeginDraw(0.7f, 0.5f, 0.3f, 1.0f);
    m_cubeShader.use();
    m_testCube.Bind();
    glDrawArrays(GL_TRIANGLES, 0, 6);
    m_testCube.Unbind();
    m_window.EndDraw();
}
void Game_State::HandleInput()
{
    if (glfwGetKey(m_window.GetWindow(), GLFW_KEY_F11) == GLFW_PRESS)
    {
        m_window.ToggleFullscreen();
    }
    if (glfwGetKey(m_window.GetWindow(), GLFW_KEY_ESCAPE) == GLFW_PRESS)
    {
        m_window.CloseWindow();
    }
}
bool Game_State::IsDone() { return m_window.IsDone(); }

当我尝试调试代码时,一切都在工作,VAO和VBO都获得了ID。m_vao和m_vbo都被调用为bind(),将其重置为0,这是什么原因?!?!我已经尝试在渲染函数中直接使用此精确代码,并且可以正常使用,因此渲染似乎很好。(我正在使用GLFW,很高兴)提前致谢!:)

this:

CubeModel::CubeModel()
{
    CubeModel(1.0f, 1.0f, 1.0f);
}

是错误的。这会在构造函数中创建CubeModel 临时。那与委派构造函数不是一样。如果那是您想要的,则必须使用适当的C 11语法:

CubeModel::CubeModel() : CubeModel(1.0f, 1.0f, 1.0f)
{}

请注意,这可能不是您唯一的问题,因为您忽略了发布所有代码。

例如,CubeModel在技术上是可复制的,但不应该 BE。您没有任何复制的特殊津贴(从本质上讲,必须创建一个新的VAO和缓冲区,并从其他VAO/Buffer中复制数据)。因此,您需要删除复制操作,并编写适当的移动操作:

CubeModel(const CubeModel &) = delete;
CubeModel(CubeModel &&other) : m_VAO(other.m_VAO), m_VBO(other.m_VBO)
{
  other.m_VAO = 0;
  other.m_VBO = 0;
}

并为移动分配操作做类似的操作。或者只是将其视为不可交配的。

在C 中,您无法像在此处一样从另一个构造函数中调用构造函数:

CubeModel::CubeModel()
{
    CubeModel(1.0f, 1.0f, 1.0f);
}

这里实际发生的事情是,您创建了一个临时的,未命名的cubemodel,当剩下默认的构造函数时被删除。那是您的VAO被删除的时候。

如果您不想在两个函数中复制代码,则需要编写一个新方法并从两个构造函数中调用该方法。

相关文章:
  • 没有找到相关文章