LOADING

加载过慢请开启缓存 浏览器默认开启

渲染上下文

笔记17

渲染上下文

前面的设计中我们也提过,我们要一步一步抽象出来,摆脱对平台和渲染API的依赖,所以这一集就抽象出了OpenGL的context(上下文),主要功能是在使用 GLFW 创建的窗口中初始化 OpenGL 并进行渲染。

目前默认都是使用glfw来管理窗口和状态,所以不做抽象分离。

为了应对后面多种接口,我们首先需要抽象出graphicscontext图形上下文。

目前就主要实现俩个功能

  • 初始化对应的渲染框架
    • 加载函数指针,创建上下文
  • 交换渲染缓冲区
    • 现在主要都是双重缓冲和三缓冲渲染,所以需要频繁交换。
class GraphicsContext
{
public:
    virtual void  Init() = 0;
    virtual void SwapBuffers() = 0;
};

我们可以看OpenGL具体的实现方式

//OpenGLContext.h
struct  GLFWwindow;		//不用在意这个,这个只是为了头文件使用到gl3w.h定义的类而声明的,具体实现在cpp里链接。

namespace Hazel
{
    class OpenGLContext :public GraphicsContext
    {
    public:
        OpenGLContext(GLFWwindow* windowHandle);

        virtual void  Init() override;
        virtual void SwapBuffers() override;
    private:
        GLFWwindow* m_WindowHandle;
    };
}
//OpenGLContext.cpp
    OpenGLContext::OpenGLContext(GLFWwindow* windowHandle)
        :m_WindowHandle(windowHandle)
    {
        HZ_CORE_ASSERT(windowHandle, "windowHandle is null");
    }
    void OpenGLContext::Init()
    {
        glfwMakeContextCurrent(m_WindowHandle);
        int status = gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);
        HZ_CORE_ASSERT(status, "Failed to initialize Glad");

        //这个是glad里面可以查看平台显卡等配置的函数没啥
        HZ_CORE_INFO("Vendor :{}", reinterpret_cast<const char*>(glGetString(GL_VENDOR)));
        HZ_CORE_INFO("Renderer :{}", reinterpret_cast<const char*>(glGetString(GL_RENDERER)));
        HZ_CORE_INFO("Version :{}", reinterpret_cast<const char*>(glGetString(GL_VERSION)));
    }
    void OpenGLContext::SwapBuffers()
    {
        glfwSwapBuffers(m_WindowHandle);
    }

主要默认都是使用glfw来管理窗口。主要就是接受

  • 构造函数接受glfw的窗口句柄
  • 初始化加载opengl函数,为其创建上下文
  • 交换缓冲区

最后我们看一下在windowswindow.cpp中修改的步骤

  • 最下方m_Context的创建和初始化
image-20241130192212986
  • 更新中的帧交换
image-20241130192322970

最后我们暂且整理一下目前项目构成,大体是这么个思路。

image-20241130195421967 image-20241130195433124