【小沐学OpenGL】Ubuntu环境下glew的安装和使用

打印 上一主题 下一主题

主题 908|帖子 908|积分 2724

1、简介

1.1 OpenGL简介

Linux 体系中的 OpenGL 是一个跨语言、跨平台的应用程序编程接口(API),用于渲染2D和3D矢量图形。
这里体现 OpenGL 的版本信息:
  1. glxinfo| grep version
复制代码

   glxinfo:这是一个用于查询关于 OpenGL 图形体系的信息的命令行工具。它提供了关于图形硬件、驱动程序以及支持的 OpenGL 扩展的详细信息。
grep:这是一个文本搜刮工具,用于搜刮文本文件或输出中匹配特定模式的行。在这里,它用于搜刮包罗“version”这个词的行。
  glxinfo没有安装,执行如下命令进行安装:
  1. sudo apt install mesa-utils
复制代码

安装成功,继续上面的glxinfo命令如下:

使用 glxgears
命令来测试 OpenGL 的性能,它是一个简单的 OpenGL 程序,体现旋转的齿轮,可以用来测试图形硬件的渲染本领。
  1. glxgears
复制代码

eglinfo
:类似于 glxinfo,但是用于查询有关 EGL (嵌入式体系图形接口) 的信息。
  1. eglinfo
复制代码

1.2 glew简介

GLEW(OpenGL Extension Wrangler Library)是一个跨平台的开源 C/C++ 扩展加载库,用于确定目标平台支持哪些 OpenGL 扩展。它提供了高效的运行时机制,并且已颠末多种操作体系的测试,包罗 Windows、Linux、Mac OS X、FreeBSD、Irix 和 Solaris。GLEW 使得 OpenGL 核心和扩展功能的声明都包罗在单个头文件中,简化了 OpenGL 扩展的使用。

输入glew官方网址:
  1. https://glew.sourceforge.net/
复制代码

2、安装glew

2.1 命令安装glew

  1. sudo apt-cache search glew
复制代码

  1. # sudo apt-get install libglew-dbg libglew-dev libglew1.13 libglewmx-dbg libglewmx-dev libglewmx1.13 glew-utils
  2. sudo apt-get -y install glew-utils
复制代码

在 Linux 体系中安装 GLEW 可以通过包管理器进行。例如,在基于 Debian 的体系(如 Ubuntu)中,可以使用以下命令安装 GLEW:
  1. # sudo apt install libglew2.1 libglew-dev
  2. sudo apt-get install libglew-dev
  3. # /usr/lib/x86_64-linux-gnu/libGLEW.so
复制代码

这将安装 GLEW 的开发文件,包罗库文件和头文件。安装后,你可以在项目中包罗 GLEW 头文件,并链接到 GLEW 库以使用 OpenGL 扩展。
如果通过cmake编译,在CMakeLists.txt添加如下代码:
  1. find_package(GLEW REQUIRED)
  2. target_link_libraries(untitled1 GLEW::GLEW)
复制代码


  • 完整的CMakeLists.txt:
  1. cmake_minimum_required(VERSION 3.16)
  2. project(untitled1 LANGUAGES CXX)
  3. set(CMAKE_AUTOUIC ON)
  4. set(CMAKE_AUTOMOC ON)
  5. set(CMAKE_AUTORCC ON)
  6. set(CMAKE_CXX_STANDARD 17)
  7. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  8. find_package(GLEW REQUIRED)
  9. add_executable(untitled1
  10.   main.cpp
  11. )
  12. target_link_libraries(untitled1 GLEW::GLEW)
  13. include(GNUInstallDirs)
  14. install(TARGETS untitled1
  15.     LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  16.     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  17. )
复制代码


  • main.cpp:
  1. #include <GL/glew.h>
  2. #include <iostream>
  3. int main(int argc, char *argv[])
  4. {
  5.     std::cout << "hello yxy" << std::endl;
  6.     // 初始化 GLEW
  7.     glewExperimental = GL_TRUE;
  8.     if (glewInit() != GLEW_OK) {
  9.         std::cout << "glew init failed." << std::endl;
  10.     }
  11.     else {
  12.         std::cout << "glew init ok." << std::endl;
  13.     }
  14.     return 0;
  15. }
复制代码
编译测试项目代码如下:

再给一个glew测试的例子:


  • main.cpp:
  1. #include <GL/glew.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define S(x) SS(x)
  5. #define SS(x) #x
  6. int main(int argc, char* argv[]) {
  7.     printf("GLEW CMake test, %s build\n",
  8.            S(GLEW_CMAKE_TEST_CONFIG));
  9.     printf("-- linked to %s which is %s\n",
  10.            S(GLEW_CMAKE_TEST_TARGET_FILE_NAME),
  11.            S(GLEW_CMAKE_TEST_TARGET_TYPE));
  12.     const GLubyte* v = glewGetString(GLEW_VERSION);
  13.     if(v) {
  14.         printf("-- glewGetString(GLEW_VERSION) returns %s\n-- test passed.\n", v);
  15.         return EXIT_SUCCESS;
  16.     } else {
  17.         printf("-- glewGetString(GLEW_VERSION) returns NULL\n-- test failed.\n");
  18.         return EXIT_FAILURE;
  19.     }
  20. }
复制代码

卸载libglew-dev库后运行如下:
  1. sudo apt autoremove libglew-dev
复制代码

再编译上面的测试项目代码如下:

2.2 直接代码安装glew

https://glew.sourceforge.net/

如果你需要从源代码编译 GLEW,可以访问 GLEW 的官方网站或其 GitHub 堆栈获取源代码。编译 GLEW 通常需要安装一些构建工具,如 make、gcc、git 等。在 Linux 体系上,可以使用以下命令安装这些工具:
  1. sudo apt-get install build-essential libxmu-dev libxi-dev libgl-dev
复制代码
GLEW(OpenGL Extension Wrangler)的官方网站是 http://glew.sourceforge.net/,可以在这个网站上下载GLEW的源代码并进行安装。
wget下载源码如下:
  1. wget https://jaist.dl.sourceforge.net/project/glew/glew/2.1.0/glew-2.1.0.tgz
复制代码

大概使用curl命令下载:
  1. curl https://jaist.dl.sourceforge.net/project/glew/glew/2.1.0/glew-2.1.0.tgz -o glew-2.1.0.tgz
复制代码

执行如下命令进行解压和编译。
  1. tar -zxvf glew-2.1.0.tgz
  2. cd glew-2.1.0
  3. #cmake ../cmake -DCMAKE_INSTALL_PREFIX=./install
  4. make
  5. sudo make install
复制代码
解压glew-2.1.0.tgz如下:

通过make编译源代码如下:

安装编译后文件到体系目次:
  1. sudo make install
  2. make clean
复制代码

查看一下本机上glew被安装的文件夹:
  1. find / -name libGLEW.so
复制代码

使用如下代码,静态链接到特定位置的自定义编译 GLEW 库:
  1. #GLEW libraries
  2. add_library(glew_static STATIC IMPORTED)
  3. # add_library(glew_static SHARED IMPORTED)
  4. set_target_properties(glew_static PROPERTIES
  5.     IMPORTED_LOCATION /usr/lib64/libGLEW.a)
  6.    
  7. target_link_libraries(testglew glew_static)
复制代码
也可以将它与共享库一起使用,只需从 add_library 中删除 STATIC 关键字。
如果通过cmake编译,在CMakeLists.txt添加如下代码:


  • CMakeLists.txt
  1. cmake_minimum_required(VERSION 3.16)
  2. project(untitled1 LANGUAGES CXX)
  3. set(CMAKE_AUTOUIC ON)
  4. set(CMAKE_AUTOMOC ON)
  5. set(CMAKE_AUTORCC ON)
  6. set(CMAKE_CXX_STANDARD 17)
  7. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  8. #####################
  9. # glew
  10. add_library(glew_static STATIC IMPORTED)
  11. set_target_properties(glew_static PROPERTIES
  12.     IMPORTED_LOCATION /usr/lib64/libGLEW.a)
  13. #####################
  14. # opengl
  15. find_package(OpenGL REQUIRED)
  16. add_executable(untitled1
  17.   main.cpp
  18. )
  19. target_link_libraries(untitled1 glew_static OpenGL::GL)
  20. include(GNUInstallDirs)
  21. install(TARGETS untitled1
  22.     LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  23.     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  24. )
复制代码


  • main.cpp
  1. #include <GL/glew.h>
  2. #include <iostream>
  3. int main(int argc, char *argv[])
  4. {
  5.     std::cout << "hello yxy" << std::endl;
  6.     // 初始化 GLEW
  7.     glewExperimental = GL_TRUE;
  8.     if (glewInit() != GLEW_OK) {
  9.         std::cout << "glew init failed." << std::endl;
  10.     }
  11.     else {
  12.         std::cout << "glew init ok." << std::endl;
  13.     }
  14.     return 0;
  15. }
复制代码
编译测试项目如下:

2.3 cmake代码安装glew

  1. tar -zxvf glew-2.1.0.tgz
  2. cd glew-2.1.0
  3. cd build
  4. mkdir linux
  5. cd linux
  6. cmake ../cmake -DCMAKE_INSTALL_PREFIX=./install
  7. # cmake ../cmake -DCMAKE_INSTALL_PREFIX=/usr/local/thirdparty
  8. make
  9. make install
复制代码

执行make install后安装到当前文件夹的install子文件夹里:

3、测试glew

3.1 测试glew+freeglut



  • CMakeLists.txt:
  1. cmake_minimum_required(VERSION 3.16)
  2. project(testglew LANGUAGES CXX)
  3. set(CMAKE_AUTOUIC ON)
  4. set(CMAKE_AUTOMOC ON)
  5. set(CMAKE_AUTORCC ON)
  6. set(CMAKE_CXX_STANDARD 17)
  7. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  8. #####################
  9. # glew
  10. find_package(GLEW REQUIRED)
  11. #####################
  12. # glut
  13. find_package(OpenGL REQUIRED)
  14. find_package(GLUT REQUIRED)
  15. include_directories(${OPENGL_INCLUDE_DIRS})
  16. include_directories(${GLUT_INCLUDE_DIRS})
  17. add_executable(testglew
  18.   main.cpp
  19. )
  20. target_link_libraries(testglew
  21.     GLEW::GLEW
  22.     ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES}
  23. )
  24. include(GNUInstallDirs)
  25. install(TARGETS testglew
  26.     LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  27.     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  28. )
复制代码


  • main.cpp
  1. #include <iostream>
  2. // GLEW
  3. #define GLEW_STATIC
  4. #include <GL/glew.h>
  5. #include <GL/glut.h>
  6. void init(void)
  7. {
  8.     glClearColor(1.0, 1.0, 1.0, 0.0);
  9.     glMatrixMode(GL_PROJECTION);
  10.     gluOrtho2D(0.0, 200.0, 0.0, 160.0);
  11. }
  12. void lineSegment(void)
  13. {
  14.     glClear(GL_COLOR_BUFFER_BIT);
  15.     glColor3f(1.0, 0.0, 0.0);
  16.     glBegin(GL_LINES);
  17.     glVertex2i (180, 15);
  18.     glVertex2i (10, 145);
  19.     glEnd();
  20.     glFlush();
  21. }
  22. int main(int argc, char **argv)
  23. {
  24.     glutInit(&argc, argv);
  25.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  26.     glutInitWindowPosition(50, 100);
  27.     glutInitWindowSize(400, 300);
  28.     glutCreateWindow("Example OpenGL Program");
  29.     // Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions
  30.     glewExperimental = GL_TRUE;
  31.     // Initialize GLEW to setup the OpenGL Function pointers
  32.     if(glewInit() != GLEW_OK) {
  33.          std::cout << "Failed to initialize GLEW" << std::endl;
  34.          return -1;
  35.     }
  36.     else {
  37.          std::cout << "GLEW is ok!" << std::endl;
  38.     }
  39.     init();
  40.     glutDisplayFunc(lineSegment);
  41.     glutMainLoop();
  42.     return 0;
  43. }
复制代码

3.2 测试glew+glfw



  • CMakeLists.txt:
  1. cmake_minimum_required(VERSION 3.16)
  2. project(untitled1 LANGUAGES CXX)
  3. set(CMAKE_AUTOUIC ON)
  4. set(CMAKE_AUTOMOC ON)
  5. set(CMAKE_AUTORCC ON)
  6. set(CMAKE_CXX_STANDARD 17)
  7. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  8. #####################
  9. # glfw
  10. find_package(glfw3 REQUIRED)
  11. #####################
  12. # glew
  13. add_library(glew_static STATIC IMPORTED)
  14. set_target_properties(glew_static PROPERTIES
  15.     IMPORTED_LOCATION /usr/lib64/libGLEW.a)
  16. #####################
  17. # opengl
  18. find_package(OpenGL REQUIRED)
  19. add_executable(untitled1
  20.   main.cpp
  21. )
  22. target_link_libraries(untitled1 glew_static OpenGL::GL glfw)
  23. include(GNUInstallDirs)
  24. install(TARGETS untitled1
  25.     LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  26.     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  27. )
复制代码


  • main.cpp
  1. #include <GL/glew.h>
  2. #include <GLFW/glfw3.h>
  3. #include <iostream>
  4. void framebuffer_size_callback(GLFWwindow* window, int width, int height);
  5. void processInput(GLFWwindow *window);
  6. const unsigned int SCR_WIDTH = 800;
  7. const unsigned int SCR_HEIGHT = 300;
  8. // 顶点着色器,GLSL语言
  9. const char *vertexShaderSource = "#version 330 core\n"
  10.                                  "layout (location = 0) in vec3 aPos;\n"
  11.                                  "void main()\n"
  12.                                  "{\n"
  13.                                  "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
  14.                                  "}\0";
  15. // 片元着色器
  16. const char *fragmentShaderSource = "#version 330 core\n"
  17.                                    "out vec4 FragColor;\n"
  18.                                    "void main()\n"
  19.                                    "{\n"
  20.                                    "   FragColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);\n"
  21.                                    "}\n\0";
  22. int main()
  23. {
  24.     // glfw: initialize and configure
  25.     glfwInit();
  26.     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  27.     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  28.     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  29. #ifdef __APPLE__
  30.     glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
  31. #endif
  32.     // glfw window creation
  33.     GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Ubuntu Opengl, yxy", NULL, NULL);
  34.     if (window == NULL)
  35.     {
  36.         std::cout << "Failed to create GLFW window" << std::endl;
  37.         glfwTerminate();
  38.         return -1;
  39.     }
  40.     glfwMakeContextCurrent(window);
  41.     glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  42.     // glad: load all OpenGL function pointers
  43.     // if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
  44.     // {
  45.     //     std::cout << "Failed to initialize GLAD" << std::endl;
  46.     //     return -1;
  47.     // }
  48.     if(glewInit() != GLEW_OK) {
  49.         std::cout << "Failed to initialize GLEW" << std::endl;
  50.         return -1;
  51.     }
  52.     // build and compile our shader program
  53.     // ------------------------------------
  54.     // vertex shader
  55.     int vertexShader = glCreateShader(GL_VERTEX_SHADER);
  56.     glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
  57.     glCompileShader(vertexShader);
  58.     // check for shader compile errors
  59.     int success;
  60.     char infoLog[512];
  61.     glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
  62.     if (!success)
  63.     {
  64.         glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
  65.         std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
  66.     }
  67.     // fragment shader
  68.     int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  69.     glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
  70.     glCompileShader(fragmentShader);
  71.     // check for shader compile errors
  72.     glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
  73.     if (!success)
  74.     {
  75.         glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
  76.         std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
  77.     }
  78.     // link shaders
  79.     int shaderProgram = glCreateProgram(); // shaderProgram 是多个着色器合并之后并最终链接完成的版本
  80.     glAttachShader(shaderProgram, vertexShader);
  81.     glAttachShader(shaderProgram, fragmentShader);
  82.     glLinkProgram(shaderProgram);
  83.     // check for linking errors
  84.     glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
  85.     if (!success) {
  86.         glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
  87.         std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
  88.     }
  89.     glDeleteShader(vertexShader);
  90.     glDeleteShader(fragmentShader);
  91.     float vertices[] = {
  92.         -0.5f, -0.5f, 0.0f, // left
  93.         0.5f, -0.5f, 0.0f, // right
  94.         0.0f,  0.5f, 0.0f  // top
  95.     };
  96.     unsigned int VBO, VAO;
  97.     //创建VAO对象
  98.     glGenVertexArrays(1, &VAO);
  99.     glBindVertexArray(VAO);
  100.     //创建VBO对象,把顶点数组复制到一个顶点缓冲中,供OpenGL使用
  101.     glGenBuffers(1, &VBO);
  102.     glBindBuffer(GL_ARRAY_BUFFER, VBO); // 缓冲绑定到GL_ARRAY_BUFFER
  103.     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 顶点数据复制到缓冲的内存中
  104.     //解释顶点数据方式
  105.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); // 顶点数据的解释
  106.     glEnableVertexAttribArray(0);
  107.     // 解绑VAO
  108.     glBindVertexArray(0);
  109.     // 解绑VBO
  110.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  111.     // render loop
  112.     while (!glfwWindowShouldClose(window))
  113.     {
  114.         // input
  115.         processInput(window);
  116.         // render
  117.         glClearColor(1.0f, 0.7f, 0.7f, 1.0f);
  118.         glClear(GL_COLOR_BUFFER_BIT);
  119.         // draw our first triangle
  120.         glUseProgram(shaderProgram);
  121.         glBindVertexArray(VAO);
  122.         glDrawArrays(GL_TRIANGLES, 0, 3);
  123.         glfwSwapBuffers(window);
  124.         glfwPollEvents();
  125.     }
  126.     // optional: de-allocate all resources
  127.     glDeleteVertexArrays(1, &VAO);
  128.     glDeleteBuffers(1, &VBO);
  129.     glDeleteProgram(shaderProgram);
  130.     glfwTerminate();
  131.     return 0;
  132. }
  133. //键盘按键回调函数
  134. void processInput(GLFWwindow *window)
  135. {
  136.     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
  137.         glfwSetWindowShouldClose(window, true);
  138. }
  139. //调整窗口大小回调函数
  140. void framebuffer_size_callback(GLFWwindow* window, int width, int height)
  141. {
  142.     glViewport(0, 0, width, height);
  143. }
复制代码

结语

如果您以为该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相干功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表