一、前提
- 系统为windows11,并且使用wsl2(ubuntu);
- ubuntu中安装了基本的
g++
,cmake
编译工具; 在windows中使用X-Server作为wsl2的显示GUI;最新版本的wsl已经支持自带的窗口显示,不需要额外自己安装X Server了。
二、安装OpenGL
安装OpenGL的基本步骤为:
1. 安装GLFW-> 2.安装GLAD-> 3.修改wsl渲染方式-> 4.编写C++代码运行
OpenGL, GLFW 和 GLAD 的简要说明(glfw和glad有什么区别呢-coskgid的回答):
- OpenGL:是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。
- GLFW:是一个专门针对OpenGL的C语言库,提供了一些渲染物体所需的最低限度的接口。它帮助用户创建OpenGL上下文、定义窗口参数以及处理用户键盘鼠标输入;
- GLAD:是用来管理OpenGL的函数指针的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法因平台而异,代码非常复杂,而且很繁琐,我们需要对每个可能使用的函数都要重复这个过程。幸运的是,有些库能简化此过程,其中GLAD是目前最新,也是最流行的库。
简而言之:OpenGL 是一种调用显卡进行显示的规范。GLFW是一种管理窗口、鼠标键盘的库。glad是一种帮助用户管理OpenGL函数指针的库(即使不安装glad也可以使用OpenGL,但是代码写起来很复杂)。
下面是详细步骤:
1. 安装 GLFW
a. 去GLFW官网下载glfw源代码,本文假设文件名为glfw-3.3.8.zip
;
b. 将glfw-3.3.8.zip
复制到ubuntu
中,本文假设将文件复制到/home/user/
目录下;
c. 在/home/user/
目录下解压glfw-3.3.8.zip
:
unzip glfw-3.3.8.zip
d. 编译并安装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
a. 查看系统的OpenGL
版本
glxinfo | grep "OpenGL version"
如果没有
glxinfo
命令需要先安装mesa-utils
, 安装命令如下:sudo apt-get install mesa-utils
可能的显示结果如下:
OpenGL version string: 4.1 (Compatibility Profile) Mesa 22.2.5-0ubuntu0.1~22.04.3
可以看到我的电脑OpenGL
版本为4.1
,profile
为Compatibility
(兼容模式)。
b. 去glad官网在gl
下拉框中选择对应版本,本文中选择4.1
。将profile
设置为Compatibility
(跟上面查询的结果一致即可),其他不用变。点击最后的GENERATE
按钮,会自动生成需要的glad.zip
文件,点击下载glad.zip
。
c. 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. 修改wsl渲染
将wsl中的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
的示例代码如下:
a. 将步骤2. 安装 glad
中的glad.c
文件复制到main.cpp
同目录下;
b. 代码内容:
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)
c. 编译运行示例程序:
mkdir build
cd build
cmake ..
make
# 运行示例程序
./test
运行结果如下:
三、注意事项
若你的电脑显卡是英特尔显卡,在wsl
中运行 glxgears
不能正确显示3D齿轮转动的结果,而是显示黑屏,那么在使用OpenGL绘制2D图案时没问题,但是绘制3D的结果就会出现错误。
解决方案是更新显卡驱动,请参考glxgears displays black screen, no gears。
四、OpenGL 版本升级
wsl 中的 OpenGL 可以通过更新 mesa实现,但是官方仓库中的 mesa 版本较旧,可以通过添加第三方仓库,再更新 mesa 的方式实现。
更新mesa,升级OpenGL版本的命令如下:
sudo add-apt-repository ppa:kisak/kisak-mesa
sudo apt update
sudo apt upgrade
五、参考
1.Compiling GLFW-Generating files with CMake
2.Building applications-With CMake and GLFW source
3.Context guide-Loading extension with a loader library
4.glxgears displays black screen, no gears