当前位置: 首页 > news >正文

[openGL]在ubuntu20.06上搭建openGL环境

就在刚刚, 我跑上了一个6小时后出结果的测试程序. 离下班还有很久, 于是我打开了接单群 , 发现了很多可以写的openGL项目. 但是!!我的电脑现在是ubuntu呀, 但是不要慌!!!接下来我一步一步教你如何完美搭建一个ubuntu上的openGL环境. 保证一个坑也不会踩!

文章目录

  • 创建项目工作区
  • 工作区配置依赖
    • 1. glad
    • 2. glfw
      • 1. 安装依赖
      • 2. 下载源码, 编译
  • 编写opengl程序, 构建运行

创建项目工作区

在windows中开发opengl程序, 我们直接用visualStudio生成项目然后用GUI配置包含路径就行, 但是ubuntu没有那么方便的IDE, 所以我们手动来创建工作区. 假设咱的程序计划放在目录~/openGL下

  1. cd ~
  2. mkdir openGL
    我习惯将程序源码放到src下, 头文件放在include中, 所以建俩文件夹先(当然你也可以根据你喜欢的习惯配置路径)
  3. cd openGL
  4. mkdir src
  5. mkdir include
    初步建立好了工程代码的位置, 配置一下第三方依赖. 我们知道opengl主要依赖glfw, glad, 所以接下来主要配置这俩玩意儿. 为了保持项目文件的整洁, 我再新建一个目录叫3rdparty; 最后建一个文件夹用来放build相关的东西
  6. mkdir 3rdparty
  7. mkdir build

工作区配置依赖

接下来正式地配置依赖.

#0、安装查看OpenGL版本支持的工具
sudo apt-get install mesa-utils
glxinfo | grep OpenGL#1、安装opengl的核心库sudo apt-get install libgl1-mesa-dev*
sudo apt-get install build-essential#2、安装OpenGL Librarysudo apt-get install libgl1-mesa-dev#3、安装OpenGL Utilities,sudo apt-get install libglu1-mesa-dev
sudo apt-get install libegl1-mesa-dev#4、安装OpenGL Utility Toolkitsudo apt-get install libglut-dev

然后单独配置glad和glew

1. glad

首先配置glad, 它是一个开源库, 提供了在线配置的服务, 咱访问这个服务, 指定需要的版本就能让它自动加载所有相关opengl函数

  1. 首先到官网: https://glad.dav1d.de/
  2. 设置语言为c/c++, 选择你需要的gl版本,譬如我选最新的4.6, 然后选择core模式(如果你需要的是立即渲染模式, 也可以保持默认), 勾选Generate a loader, 然后generate!
    在这里插入图片描述

下载下来之后是个压缩包, 我们先在咱的项目文件夹的第三方依赖中新建一个叫glad的文件夹, 然后把压缩包解压到那里面.

  1. cd ~/openGL/3rdparty
  2. mkdir glad
  3. 找到刚才下载的glad压缩包->右键提取到->解压到~/openGL/3rdparty/glad
    最后咱这个~/openGL/3rdparty目录下是这样的
    在这里插入图片描述

2. glfw

1. 安装依赖

据我所知ubuntu20.04有两种桌面环境: X11和Wayland, 这两种需要安装的东西不一样, 先看一下自己的是哪一种, 再分别安装
查看的命令:

echo $XDG_SESSION_TYPE

如果是X11,执行这个:

sudo apt install xorg-dev

如果是Wayland, 执行这个:

sudo apt install libwayland-dev libxkbcommon-dev wayland-protocols extra-cmake-modules

2. 下载源码, 编译

  1. 下载源码: https://github.com/glfw/glfw/releases/download/3.3.9/glfw-3.3.9.zip
  2. 在你喜欢的位置新建一个文件夹叫glfw, 之后咱对glfw的编译就在这个文件夹下: mkdir ~/glfw && cd ~/glfw
  3. 我们把glfw这个文件夹分为两个部分来看: 第一部分放glfw的源码, 剩下的部分放源码build之后的结果; 因此, 我在glfw中新建一个文件夹叫src, 另一个叫build: mkdir src && mkdir build
  4. 我们把第一步下载的源码解压到刚才新建的src文件夹, 然后执行cmake构建命令: cmake -S ~/glfw/src -B ~/glfw/build
  5. 最后build一下就成功了: cd ~/glfw/build && make

编写opengl程序, 构建运行

现在依赖配好了, 咱浅写一个能跑就行的程序让它编译运行一下.
回到我们的工作区

  1. cd ~/openGL/src && vim main.cpp
  2. 写个测试程序 ~/openGL/src/main.cpp
#include <iostream>#include <glad/glad.h>
#include <GLFW/glfw3.h>void framebufer_size_callback(GLFWwindow *_window, int _width, int _height);int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);GLFWwindow *win_handle = glfwCreateWindow(600, 600, "终于配好环境了感动+10086", NULL, NULL);if (win_handle == NULL){std::cout << "Failed to crate GLFW Window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(win_handle);if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}glViewport(0, 0, 600, 600);glfwSetFramebufferSizeCallback(win_handle, framebufer_size_callback);while (!glfwWindowShouldClose(win_handle)){glfwSwapBuffers(win_handle);glfwPollEvents();}glfwTerminate();return 0;
}void framebufer_size_callback(GLFWwindow *_window, int _width, int _height)
{glViewport(0, 0, _width, _height);
}
  1. 写完了之后咱写一下编译配置文件~/openGL/CMakeList.txt
    1. cd ~/openGL && vim CMakeList.txt
cmake_minimum_required(VERSION 2.8)project(opengl_test)# Include files
#glad
include_directories(${PROJECT_SOURCE_DIR}/3rdparty/glad/include/)add_executable(main ${PROJECT_SOURCE_DIR}/src/main.cpp${PROJECT_SOURCE_DIR}/3rdparty/glad/src/glad.c)target_link_libraries(main glfw GL dl)
  1. 开编! cd ~/openGL/build && cmake .. && make
  2. 编完了运行: ./main
    在这里插入图片描述

大功告成!

相关文章:

  • ubuntu卸载docker
  • ZZULIOJ 1126: 布尔矩阵的奇偶性
  • django项目基础后端功能使用
  • robot_sim配置
  • C语言实现双向链表
  • Linux下编写zlg7290驱动(1)
  • zustand状态管理工具(react)
  • python桶排序
  • 江山易改本性难移之ZYNQ SDK QSPI固化bug及其解决方法
  • C#灵活的任务调度组件FluentScheduler
  • 「Movie-web」一个非常简洁独特的电影网站开源项目
  • 【Flutter 开发实战】Dart 基础篇:最基本的语法内容
  • 华为路由器及交换机基础配置命令大全
  • element plus自定义组件表单校验
  • 视频做成二维码查看?多格式视频二维码生成器的使用方法
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [Vue CLI 3] 配置解析之 css.extract
  • Android开源项目规范总结
  • Electron入门介绍
  • ES6核心特性
  • LeetCode29.两数相除 JavaScript
  • Objective-C 中关联引用的概念
  • Python学习之路13-记分
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 从重复到重用
  • 利用jquery编写加法运算验证码
  • 浏览器缓存机制分析
  • 配置 PM2 实现代码自动发布
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 第二十章:异步和文件I/O.(二十三)
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #includecmath
  • #Java第九次作业--输入输出流和文件操作
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (LeetCode) T14. Longest Common Prefix
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十一)手动添加用户和文件的特殊权限
  • (四)汇编语言——简单程序
  • (原)本想说脏话,奈何已放下
  • *2 echo、printf、mkdir命令的应用
  • ./和../以及/和~之间的区别
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Project Open Day(2011.11.13)
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET 中 GetProcess 相关方法的性能
  • .net/c# memcached 获取所有缓存键(keys)