[wsl2] wsl2上安装使用cmake+OpenGL教程

一、前提

  1. 系统为windows11,并且使用wsl2(ubuntu);
  2. ubuntu中安装了基本的g++, cmake编译工具;
  3. 在windows中使用X-Server作为wsl2的显示GUI;

二、安装OpenGL

安装opengl的基本步骤为:安装glfw->安装glad->修改OpenGL渲染方式->编写C++代码运行。下面是详细步骤:

OpenGL, GLFW 和 GLAD 的简要说明(glfw和glad有什么区别呢-coskgid的回答):

  • OpenGL:是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。
  • GLFW:是一个专门针对OpenGL的C语言库,提供了一些渲染物体所需的最低限度的接口。它帮助用户创建OpenGL上下文、定义窗口参数以及处理用户键盘鼠标输入;
  • GLAD:是用来管理OpenGL的函数指针的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法因平台而异,代码非常复杂,而且很繁琐,我们需要对每个可能使用的函数都要重复这个过程。幸运的是,有些库能简化此过程,其中GLAD是目前最新,也是最流行的库。

1. 安装 GLFW

  1. GLFW官网下载glfw源代码,本文假设文件名为glfw-3.3.8.zip
  2. glfw-3.3.8.zip复制到ubuntu中,本文假设将文件复制到/home/user/目录下;
  3. /home/user/目录下解压glfw-3.3.8.zip
    unzip glfw-3.3.8.zip
    
  4. 编译并安装glfw
    # 进入 解压目录
    cd glfw-3.3.8
    # 新建build目录 用于存储编译glfw的文件
    mkdir build
    # 进入build目录
    cd build
    # 使用cmake生成Makefile文件用于编译glfw
    cmake ..
    # 编译安装 glfw
    sudo make install
    

若编译安装成功,在/usr/local/include/目录下应该存在GLFW头文件目录,在/usr/local/lib/目录下存在libglfw3.a链接库文件。

2. 安装 glad

  1. 查看系统的OpenGL版本
    glxinfo | grep "OpenGL version"
    

如果没有glxinfo命令需要先安装mesa-utils, 安装命令如下:

sudo apt-get install mesa-utils

可能的显示结果如下:

~$ glxinfo | grep "OpenGL version"
OpenGL version string: 4.1 (Compatibility Profile) Mesa 22.2.5-0ubuntu0.1~22.04.3

可以看到我的电脑OpenGL版本为4.1
2. 去glad官网gl下拉框中选择对应版本,本文中选择4.1。将profile设置为Core,其他不用边,点击最后的GENERATE按钮,会自动生成需要的glad.zip文件,点击下载glad.zip
3. glad.zip解压后文件结构如下:

.
├── include
│   ├── KHR
│   │   └── khrplatform.h
│   └── glad
│       └── glad.h
└── src
    └── glad.c

include/中的KHR/glad/目录复制到usr/local/include/目录下。
src/目录下的glad.c暂时不管(glad.c需要放到编写的C++代码工程中,在4.编写代码运行部分有示例)。

3. 修改渲染方式为direct render

OpenGL渲染方式改为direct render,如果不修改运行opengl程序时可能会出现Failed to create GLFW window报错。
修改方式如下:
将下面一句话写入~/.bashrc文件里

# 设置opengl 直接渲染, 用于使用 x-service 显示glfw窗口
LIBGL_ALWAYS_INDIRECT=0

使.bashrc文件生效

source .barshrc

4. 编写代码运行

wsl2下使用C++, cmake, OpenGL的示例代码如下:

  1. 将步骤2. 安装 glad中的glad.c文件复制到main.cpp同目录下;
  2. 代码内容:
    main.cpp文件:
    #include <glad/glad.h>
    #include <GLFW/glfw3.h>
    
    int main(void)
    {
        GLFWwindow* window;
    
        /* Initialize the library */
        if (!glfwInit())
            return -1;
    
        /* Create a windowed mode window and its OpenGL context */
        window = glfwCreateWindow(640, 480, "GLFW CMake starter", NULL, NULL);
        if (!window)
        {
            glfwTerminate();
            return -1;
        }
    
        /* Make the window's context current */
        glfwMakeContextCurrent(window);
    
        /* 使用 glad 管理函数地址 */
        gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
    
        glClearColor( 1.0f, 0.3f, 0.4f, 0.0f );
    
        /* Loop until the user closes the window */
        while (!glfwWindowShouldClose(window))
        {
            /* Render here */
            glClear(GL_COLOR_BUFFER_BIT);
    
            /* Swap front and back buffers */
            glfwSwapBuffers(window);
    
            /* Poll for and process events */
            glfwPollEvents();
        }
    
        glfwTerminate();
        return 0;
    }
    
    CMakeLists.txt文件:
    cmake_minimum_required(VERSION 3.10)
    set(CMAKE_C_STANDARD 11)
    set(CMAKE_CXX_STANDARD 14)
    project(test)
    find_package(glfw3 REQUIRED)
    file(GLOB project_file main.cpp glad.c)
    add_executable(${PROJECT_NAME} ${project_file})
    target_link_libraries(${PROJECT_NAME} glfw)
    
  3. 编译运行示例程序:
    mkdir build
    cd build
    cmake ..
    make
    # 运行示例程序
    ./test
    

运行结果如下:
glfw+glad+cmake运行示例

三、参考

1.Compiling GLFW-Generating files with CMake
2.Building applications-With CMake and GLFW source
3.Context guide-Loading extension with a loader library

posted on 2023-09-23 12:24  刘好念  阅读(155)  评论(0编辑  收藏  举报  来源