Ubuntu20.04搭建OpenGL环境(glfw+glad)

这篇具有很好参考价值的文章主要介绍了Ubuntu20.04搭建OpenGL环境(glfw+glad)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Ubuntu20.04搭建OpenGL环境(glfw+glad)

Linux环境搭建

本文在VMware安装Ubuntu20.04桌面版的环境下搭建OpenGL,按照本文搭建完成后可以执行LearnOpenGL网站上的demo

关于VMware可自行到VMware Workstation Pro | CN下载

关于Ubuntu20.04桌面版可自行到官网或Index of /ubuntu-releases/20.04.6/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror下载

这里窗口系统是X11,如果最新版Ubuntu窗口系统应该是Wayland那配置方法可能有所差异,没有实测过。

Ubuntu20.04搭建OpenGL环境(glfw+glad),工具,数据库

啰嗦几句基操~

关于虚拟机和物理机的通信:

可以采用scp命令或建立共享文件夹的方式。

关于建立共享文件夹的几个步骤:

  • 在编辑虚拟机设置里选择一个共享文件夹

Ubuntu20.04搭建OpenGL环境(glfw+glad),工具,数据库

  • 在开启虚拟机的瞬间,不断点击选项栏的虚拟机,直到刷出安装VMware Tools是可以点击的状态,然后点击安装。
  • 进入虚拟机后/mnt/hgfs在这个目录下会发现和物理机的共享文件夹

正文开始

安装g++

sudo apt install g++

安装mesa工具

sudo apt install mesa-utils

查看opengl的版本

glxinfo -B | grep 'OpenGL version string'

得到  `OpenGL version string: 4.1 (Compatibility Profile) Mesa 21.2.6`  字样,我们记住自己的版本号,我的是4.1
安装xorg依赖(GLFW的依赖)

sudo apt install xorg-dev

下载glfw源码进行编译
git clone https://github.com/glfw/glfw
cd glfw
cmake -S . -B build
cd build
make
sudo make install
安装GLAD

登录到GLAD官网,点这里。只需要把API中gl的版本设置成我们刚才查看的版本即可(作者是4.1)。最后点击GENERATE

这时浏览器会跳至文件页,我们把glad.zip文件保存到本地并解压。

解压之后得到一个include目录,和一个src目录

我们首先把include这个目录里的内容移动到标准头目录下,sudo mv include/* /usr/local/include

src目录下有个glad.c文件我们需要把他放到项目文件中,一会再弄!

创建项目
mkdir opengl_code
cd opengl_code
  • glad.c文件copy过来
  • 创建一个build目录 mkdir build
  • 创建CMakeLists.txt文件,并添加以下内容
cmake_minimum_required(VERSION 2.8)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 14)
 
project(test)
 
find_package(glfw3 REQUIRED)
find_package( OpenGL REQUIRED )
include_directories( ${OPENGL_INCLUDE_DIRS} )
file(GLOB project_file glad.c main.cpp)
add_executable(${PROJECT_NAME} ${project_file})
 
target_link_libraries(${PROJECT_NAME}  ${OPENGL_LIBRARIES} glfw)
  • 创建main.cpp文件,并添加以下内容
#include <glad/glad.h>
#include <GLFW/glfw3.h>
 
#include <iostream>
 
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
 
const char *vertexShaderSource = "#version 330 core\n" 
    "layout (location = 0) in vec3 aPos;\n"
    "void main()\n"
    "{\n"
    "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" 
    "}\0";
const char *fragmentShaderSource = "#version 330 core\n"
    "out vec4 FragColor;\n"
    "void main()\n"
    "{\n"
    "   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
    "}\n\0";
 
int main()
{
    // glfw: initialize and configure
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
 
    // glfw window creation
    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
 
    // glad: load all OpenGL function pointers
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }
 
 
    // build and compile our shader program
    // ------------------------------------
    // vertex shader
    int vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); 
    glCompileShader(vertexShader);
    // check for shader compile errors
    int success;
    char infoLog[512];
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
    }
    // fragment shader
    int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);
    // check for shader compile errors
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
    }
    // link shaders
    int shaderProgram = glCreateProgram(); 
    glAttachShader(shaderProgram, vertexShader); 
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
    // check for linking errors
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
    if (!success) {
        glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
    }
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
 
 
    float vertices[] = {
        -0.5f, -0.5f, 0.0f, // left  
         0.5f, -0.5f, 0.0f, // right 
         0.0f,  0.5f, 0.0f  // top   
    }; 
 
    unsigned int VBO, VAO;
    glGenVertexArrays(1, &VAO);
	glBindVertexArray(VAO);
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 
 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); 
    glEnableVertexAttribArray(0);
 
	glBindVertexArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
 
    // render loop
    // -----------
    while (!glfwWindowShouldClose(window))
    {
        // input
        // -----
        processInput(window);
 
        // render
        // ------
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
 
        // draw our first triangle
        glUseProgram(shaderProgram); 
        glBindVertexArray(VAO); 
        glDrawArrays(GL_TRIANGLES, 0, 3); 
 
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
 
    // optional: de-allocate all resources
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    glDeleteProgram(shaderProgram);
    glfwTerminate();
    
    return 0;
}
 
void processInput(GLFWwindow *window)
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}
 
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}
  • 创建run.sh文件,并添加以下内容
cd build
cmake ..
make
./test
cd ..
完成

现在运行bash run.sh 即可执行OpneGL程序,效果如下:

Ubuntu20.04搭建OpenGL环境(glfw+glad),工具,数据库

PS

如果想通过gdb调试的话,那需要手动进行编译。

  • sudo apt-get install libglfw3-dev libgl1-mesa-dev

  • g++ -O0 -g glad.c main.cpp -lglfw3 -ldl -lGL -lpthread

这样就可以gdb a.out文章来源地址https://www.toymoban.com/news/detail-661618.html

到了这里,关于Ubuntu20.04搭建OpenGL环境(glfw+glad)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ubuntu 20.04 搭建crash dump问题分析环境

    主机环境和内核版本信息: 参考了Ubuntu Kernel crash dump这篇文章 如果通过上面的命令安装ubuntu内核调试符号,则需要通过下面的方法去安装,参考文章:安装ubuntu内核调试符号 1.5.1 GPG 秘钥导入 确保您拥有系统的 GPG 密钥。适用于16.04 及更高版本的 Ubuntu : 对于旧的发布版本

    2024年02月05日
    浏览(45)
  • 从头搭建Android源码编译环境(Ubuntu 18.04 / 20.04 / 22.04)

    在新安装的Ubuntu上(版本20.04LTS),完成搭建Android源码编译环境步骤如下。 顺带说一句,当前用的比较多的Ubuntu是18.04和20.04,在实际项目中一直在用,可用性和稳定性都没问题。 最新的Ubuntu22.04版本,系统默认的二进制库变化比较大,编译Android源码有问题(实测过,没细研

    2024年02月06日
    浏览(161)
  • ubuntu20.04一键安装VScode搭建ROS编程环境

    VSCode 全称 Visual Studio Code,是微软出的一款轻量级代码编辑器,免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、GIT 等特性,支持插件扩展,并针对网页开发和云端应用开发做了优化。

    2023年04月24日
    浏览(50)
  • RK356x基于Ubuntu20.04搭建ROS开发环境

    CPU:RK356x 操作系统:arm64 Ubuntu20.04 1、首先确保开发板是可以联网的。

    2024年01月20日
    浏览(44)
  • ubuntu20.04搭建ROS+UE4+airsim环境

    前两天搭建了ubuntu20.04下ue4+ROS+airsim环境,在这里记录一下,方便后面自己查阅。 主要过程参见链接:Ubuntu18.04搭建AirSim+ROS仿真环境_我只是一只自动小青蛙的博客-CSDN博客_airsim ros 我遇到的问题(根据引文中的标题): 1、github于epic账号绑定问题:需要在epic账号设置中绑定

    2024年02月10日
    浏览(50)
  • fabric 环境快速搭建--Ubuntu20.04系统下使用fabric官方脚本搭建

    由于是初识hyper ledger fabric在安装的时候遇到了很多的问题,最后在师兄的帮助下终于删了从头到尾安装了一遍,因此想记录一下,并且给和我遇到相同问题的小伙伴提供一些帮助。如果你是萌新,找我就对啦! 直接去官方下载即可 其他帖子上面有很多详细步骤,这里不多赘

    2024年02月14日
    浏览(44)
  • Ubuntu20.04 搭建L2TP+IPsec环境

    安装l2tp和strongswan。 sudo apt install xl2tpd sudo apt install strongswan 1)编辑**/etc/ipsec.conf** 2)编辑**/etc/ipsec.secrets** , 设置ipsec的预共享秘钥 编辑**/etc/xl2tpd/xl2tpd.conf** 1) 编辑PPP配置文件(例如上文中的**/etc/ppp/options.xl2tpd**)。 2)编辑**/etc/ppp/chap-secrets**,添加VPN访问用户密码 # 重启服

    2024年02月04日
    浏览(52)
  • 基于Ubuntu20.04搭建OpenHarmony v3.0.6的qemu仿真环境

    出于个人兴趣,也出于对国产操作系统的好奇,想尝试一下以LiteOS为内核的Openharmony。但过程相当不顺利,主要原因是官方文档内容组织的不敢恭维。挺好的东西,不把说明书写好,让用户怎么用?我研究的核心问题就一个:如何在基于Qemu仿真的Openharmony中输出一个hello worl

    2024年02月09日
    浏览(40)
  • EAP-TLS实验之Ubuntu20.04环境搭建配置(FreeRADIUS3.0)(一)

            年后开始准备EAP-TLS 802.1x认证的事情,年前搭建了Windows Server 2019预为认证服务器,参考了《在 Windows Server 上搭建 AD 域控制器 - KOBIN 技术随笔》及《Windows Server 搭建 RADIUS 认证服务器 - 知乎》及《WINDOWS SERVER 2012证书服务安装配置_cep的身份验证类型-CSDN博客》及《W

    2024年02月22日
    浏览(34)
  • Ubuntu20.04搭建PX4仿真环境及XTDrone开发平台(最详细最明白)

    PX4-Autopilot仿真平台是由PX4官方提供的集虚拟px4固件、真机烧录固件、gazebo环境及模型于一体的平台,用户可以自己编写程序,通过mavros接口与虚拟px4固件进行mavlink协议的通讯,并在gazebo中显示虚拟世界和模型。因此PX官方手册里给了一个经典的例程:offboard.cpp和offboard.py,让

    2024年02月04日
    浏览(146)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包