Hazel游戏引擎(014)现代OpenGL和GLAD

文中若有代码、术语等错误,欢迎指正

前言

  • 此节目的

    为了使用OpenGL,而OpenGL的函数定义在显卡中,大多数函数的定义位置都无法在编译时确定下来,所以需要在运行时查询,需要使用GLAD库在运行时获取OpenGL函数地址并将其保存在函数指针中供程序运行时使用。

  • Glad在线服务网址

    https://glad.dav1d.de/

Glad解读

Glad作用:运行时获取OpenGL函数地址并将其保存在函数指针中供以后使用(一个函数对应一个函数指针)。

  • glad.h

    以OpenGL的一个glGenBuffers函数举例

    声明函数指针,并用宏定义重命名函数指针

    PFNGLGENBUFFERSPROC是函数指针名称

  • glad.C

    获取OpenGL函数地址来定义函数指针

    请添加图片描述

    请添加图片描述

  • 所以使用宏定义glGenBuffers,就相当于调用了在显卡里相对应定义的OpenGL函数

步骤

Glad作为项目配置

  • 在线glad选项

  • 下载zip

  • 解压到Hazel/vendor/Glad中

  • 给Glad添加premake

    project "Glad"
    	kind "StaticLib"
    	language "C"
    	staticruntime "off"
    
    	targetdir ("bin/" .. outputdir .. "/%{prj.name}")
    	objdir ("bin-int/" .. outputdir .. "/%{prj.name}")
    
    	files{
          
          
    		"include/glad/glad.h",
    		"include/KHR/khrplatform.h",
    		"src/glad.C",
    	}
    	includedirs{
          
          
    		"include" -- 为了glad.c直接#include <glad/glad.h>,而不用#include <include/glad/glad.h>
    	}
    
        filter "system:windows"
            systemversion "latest"
            staticruntime "On"
    
        filter {
          
           "system:windows", "configurations:Release" }
            buildoptions "/MT"
    
    
  • 修改解决方案的premake

    -- 包含相对解决方案的目录
    IncludeDir = {
          
          }
    IncludeDir["GLFW"] = "Hazel/vendor/GLFW/include"
    IncludeDir["Glad"] = "Hazel/vendor/Glad/include"
    
    include "Hazel/vendor/GLFW"
    include "Hazel/vendor/Glad"
    project "Hazel"		--Hazel项目
        -- 包含目录
    	includedirs{
          
          
    		"%{prj.name}/src",
    		"%{prj.name}/vendor/spdlog/include",
    		"%{IncludeDir.GLFW}",
    		"%{IncludeDir.Glad}"
    	}
    	links {
          
           
    		"GLFW",
    		"Glad",-- Glad.lib库链接到Hazel项目中
    		"opengl32.lib"
    	}
    	-- 如果是window系统
    	filter "system:windows"
    		-- 预处理器定义
    		defines{
          
          
    			"HZ_PLATFORM_WINDOWS",
    			"HZ_BUILD_DLL",
    			"HZ_ENABLE_ASSERTS",
    			"GLFW_INCLUDE_NONE" -- 让GLFW不包含OpenGL
    		}
    

更改项目

  • Application

    // #include <GLFW/glfw3.h>
    #include <glad/glad.h>
    ......
    // run中使用了opengl函数
    glClearColor(1, 0, 1, 1);
    glClear(GL_COLOR_BUFFER_BIT);
    ......
    
  • WindowsWindow.cpp

    #include <glad/glad.h>
    static bool s_GLFWInitialized = false;
    void WindowsWindow::Init(const WindowProps& props)
    {
          
          
        ......
        // 2.1window创建窗口
        m_Window = glfwCreateWindow((int)props.Width, (int)props.Height, m_Data.Title.c_str(), nullptr, nullptr);
        // 设置glfw当前的上下文
        glfwMakeContextCurrent(m_Window);
        ///
        // 重点在这,在运行时获取OpenGL函数地址并将其保存在函数指针中供以后使用//
        int status = gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);
        HZ_CORE_ASSERT(status, "初始化Glad失败");
        // 测试使用OpenGL函数
        unsigned int id;
        glGenBuffers(1, &id);
    
  • 使用OpenGL函数效果

猜你喜欢

转载自blog.csdn.net/qq_34060370/article/details/131277887