调用 glGenBuffers() 时的访问冲突



我正在尝试开发游戏引擎,并正在添加批处理渲染功能。我这里有 2 个问题,

  1. 有一些异常的访问冲突错误

    我将 Buffer 类初始化为 Renderer 类的成员变量

    Scope<VertexBuffer> vertex = CreateScope<OpenGLVertexBuffer>(ME_MAX_VERTEX_BUFFER_SIZE, GL_DYNAMIC_DRAW);
    Scope<IndexBuffer> index = CreateScope<OpenGLIndexBuffer>(ME_MAX_INDEX_BUFFER_SIZE, GL_DYNAMIC_DRAW);
    

    上面的意思是Scope是指unique_ptrCreateScope是指make_unique
    代码文件:
    Header: https://github.com/VikramSGIT/MarsEngine/blob/master/MarsEngine/src/RenderAPI/OpenGL/OpenGLRenderer.cpp
    CPP: https://github.com/VikramSGIT/MarsEngine/blob/master/MarsEngine/src/RenderAPI/OpenGL/OpenGLRenderer.cpp
    顶点缓冲区类的构造函数(索引缓冲区类具有类似的构造函数)

    OpenGLVertexBuffer::OpenGLVertexBuffer(const unsigned int& size, const unsigned int& mode)
    :Emptybuffer(true)
    {
    ME_PROFILE_TRACE_CALL();
    GLLogCall(glGenBuffers(1, &m_RendererID));
    GLLogCall(glBindBuffer(GL_ARRAY_BUFFER, m_RendererID));
    GLLogCall(glBufferData(GL_ARRAY_BUFFER, size, nullptr, mode));
    }
    

    glGenBuffers(1 ,&m_RendererID)完全有访问违规。 甚至双倍检查我在glfwMakeCurrentContext(window)后打电话给glewInit()

  2. 当我尝试在上面的OpenGLVertexBuffer类构造函数中添加glewInit()时。出现了另一个不寻常的问题,glDeleteBuffers(1, &m_RendererID)在未终止!!

    OpenGLVertexBuffer::~OpenGLVertexBuffer()
    {
    ME_PROFILE_TRACE_CALL();
    GLLogCall(glDeleteBuffers(1, &m_RendererID));
    }
    

    然后我在VS Code中运行了相同的代码模型,运行流畅。所以这得出结论,我没有司机问题。

    需要注意的是,我的屏幕上没有输出(不包括在内,因为我不确定逻辑),ImGui 运行流畅。但是我在逻辑的每个部分都运行断点,缓冲区按预期填充 ba 可以 fain waz goin wroonng :(

链接到我的 Github 存储库:https://github.com/VikramSGIT/MarsEngine

template<typename T>
using Ref = std::shared_ptr<T>;
template<typename T>
using Scope = std::shared_ptr<T>;
template<typename T, typename... Args>
Ref<T> CreateRef(Args&& ... args) { return std::make_shared<T>(std::forward<Args (args)...); }
template<typename T, typename ... Args>
Scope<T> CreateScope(Args&& ...args) { return std::make_unique<T>(std::forward<Args> (args)...); }

CreateScope函数创建一个unique_ptr,但Scope对象存储shared_ptr。我怀疑问题是这样的:

template<typename T>
using Scope = std::shared_ptr<T>;

这应该是:

template<typename T>
using Scope = std::unique_ptr<T>;

最新更新