[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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/116404.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何看待Unity新的收费模式?

文章目录 背景Unity的论点开发者的担忧如何看待Unity新的收费模式&#xff1f;1. 理解Unity的立场2. 考虑小型开发者3. 探索替代方案4. 对市场变化保持敏感5. 提高游戏质量 结论 &#x1f389; 如何看待Unity新的收费模式&#xff1f; ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1…

194、SpringBoot -- 下载和安装 Erlang 、 RabbitMQ

本节要点&#xff1a; 一些命令&#xff1a; 小黑窗输入&#xff1a; rabbitmq-plugins enable rabbitmq_management 启动控制台插件 rabbitmq-server 启动rabbitMQ服务器 管理员启动小黑窗&#xff1a; rabbitmq-service install 添加rabbitMQ为本地服务 启动浏览器访问 ht…

Android 10.0 系统开启和关闭黑白模式主题功能实现

1. 概述 在10.0的rom系统开发定制化中,在系统SystemUI的下拉状态栏中,产品开发功能需求要求添加黑白模式功能开关的功能,就是打开黑白模式,系统颜色就会变成黑白颜色, 关闭黑白模式开关系统就会变成彩色模式,所以就需要了解下系统是怎么设置黑白模式和彩色模式的,然后添…

【【萌新的FPGA学习之初识ZYNQ】】

萌新的FPGA学习之初识ZYNQ 进入 21 世纪&#xff0c;FPGA 的发展进入了累积阶段。人们发现&#xff0c;FPGA 的发展此时遭遇了瓶颈&#xff0c;因此单纯的 提升 FPGA 的容量已经不能满足各类应用的需求。由于更多客户开始追求更高的性价比&#xff0c;FPGA 不得不从 单纯的可编…

【06】FISCOBCOS中的节点前置服务

WeBASE管理平台 微众银行开源的自研区块链中间件平台——WeBASE(WeBank Blockchain Application Software Extension) 是区块链应用和FISCO BCOS节点之间搭建的中间件平台。WeBASE屏蔽了区块链底层的复杂度,降低区块链使用的门槛,大幅提高区块链应用的开发效率,包含节点前置…

10.5 串联型稳压电路(1)

稳压管稳压电路输出电流较小&#xff0c;输出电压不可调&#xff0c;不能满足很多场合下的应用。串联型稳压电路以稳压管稳压电路为基础&#xff0c;利用晶体管的电流放大作用&#xff0c;增大负载电流&#xff1b;在电路中引入深度电压负反馈使输出电压稳定&#xff1b;并且&a…

【华为云云耀云服务器L实例评测|云原生】自定制轻量化表单Docker快速部署云耀云服务器

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

力扣刷题-链表-设计链表

题意&#xff1a; 在链表类中实现这些功能&#xff1a; get(index)&#xff1a;获取链表中第 index 个节点的值。如果索引无效&#xff0c;则返回-1。 addAtHead(val)&#xff1a;在链表的第一个元素之前添加一个值为 val 的节点。插入后&#xff0c;新节点将成为链表的第一个节…

基于MUSIC算法的二维超声波成像matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、基本原理 4.2、数学公式 4.3、实现过程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................................…

uniapp实现表格冻结

效果图如下&#xff1a; 思路&#xff1a; 1.由于APP项目需要&#xff0c;起初想去插件市场直接找现成的&#xff0c;结果找了很久没找到合适的&#xff08;有的不支持vue2有的不能都支持APP和小程序&#xff09; 2.后来&#xff0c;就只能去改uni-table源码了&#xff0c;因…

加速乐源码(golang版本)

一、分析 分析过程网上有很多,这里只说个大概,主要是提供golang源码 请求网站,发现前两次请求都会返回521,第三次请求成功,说明前两次请求肯定是干了什么事情;使用接口请求工具模拟请求分析该过程 使用postman工具请求 a. 第一次请求会在响应头返回jsluid,返回内容中拼接…

C++中的Template

模板的概念 建立通用的模具&#xff0c;大大提高复用性 模板不可直接使用 函数模板 函数模板语法 函数模板作用&#xff1a; 建立一个通用函数&#xff0c;其函数返回值类型和形参类型可以不具体制定&#xff0c;用一个虚拟的类型来代表。 语法&#xff1a; template&l…