每次换新电脑,我想搞openGL的时候,都会苦于一个问题,那就是环境搭配,虽然搭过很多次,但就是记不住,所以今天就把快速配置的过程写下来,方便下次使用,如果有人看到我这篇文章觉得说得太模糊了,不清楚,请告知

环境配置

1.先把需要的库下载好,版本可以和我不一样

assimp-3.3.1(加载模型)
glm-0.9.9.6(数学库)
stb_image.h(加载图片)
glutdlls37beta
glew-2.1.0-win32
glfw-3.3.bin.WIN32
glad

2.新建C++项目 选择项目属性 点击VC++目录选择包含目录 把上面的这些库的文件路径全部加进去

假设我把这些文件都放在E盘,如下:

则配置包含目录如下:

3.接着选择库目录 把上面的这些库的lib路径全部加进去

4.然后点击链接器 选择输入-附加依赖项 把

opengl32.lib
glut32.lib
glew32.lib
glfw3.lib
assimp-vc140-mt.lib

添加进去

5.运行项目的时候会报

可以这样解决

特殊说明

注:一些需要特殊注明的东西(必看 不然你项目跑不起来):

1:如果有用到glad 要把glad.c拉到项目里面去

2:GLM是OpenGLMathematics的缩写,它是一个只有头文件的库,也就是说我们只需包含对应的头文件就行了,不用链接和编译。GLM可以在它们的网站上下载。把头文件的根目录复制到你的includes文件夹,然后你就可以使用这个库了。 GLM库从0.9.9版本起,默认会将矩阵类型初始化为一个零矩阵(所有元素均为0),而不是单位矩阵(对角元素为1,其它元素为0)。如果你使用的是0.9.9或0.9.9以上的版本,你需要将所有的矩阵初始化改为 glm::mat4 mat = glm::mat4(1.0f)。如果你想与本教程的代码保持一致,请使用低于0.9.9版本的GLM,或者改用上述代码初始化所有的矩阵。

3:stb_image.h是Sean Barrett的一个非常流行的单头文件图像加载库,它能够加载大部分流行的文件格式,并且能够很简单得整合到你的工程之中。stb_image.h可以在这里下载。下载这一个头文件,将它以stb_image.h的名字加入你的工程,并另创建一个新的C++文件,输入以下代码:
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
通过定义STB_IMAGE_IMPLEMENTATION(一定不要忘了),预处理器会修改头文件,让其只包含相关的函数定义源码,等于是将这个头文件变为一个 .cpp 文件了。现在只需要在你的程序中包含stb_image.h并编译就可以了。

Assimp下载配置

其他插件你们直接去下载就行了,就加载模型的插件麻烦了点,这里特殊给它写一下
(1) 下载CMake:下载地址
下载Assimp:百度 assimp,第一个基本就是官网了,进入后点击 Download(页面上方有历史版本)


写这篇文章时最新版本是 3.3.1。点击 Download 时链接到了 GitHub,选择第三个:


下载VS2017


(2) CMake编译Assimp:打开CMake,分别选择好相应的文件夹之后,就可以进行第一步


点击左下角configure后,会看到弹出下面这个框


注意:如果你是vs2017,这里要选择第一个,我也不太清楚为什么,但是我用别的生成的lib文件出现了链接问题。


在configure后,你可能会遇到这个问题,红字部分只是警告,并不影响编译成功,想了解更多可以参考:https://github.com/liballeg/allegro5/issues/804;


之后就会看到以下界面,再依次点击generate和open project即可,点击open project之后生成解决方案。


到工程里之后,选择解决方案,然后右键生成解决方案,到此,我们的重编译就完成了(会有一个失败 吓死我了)。


构建Assimp时可能会出现一些问题,所以我会将它们的解决方案列在这里,便于大家排除错误:

  • CMake在读取配置列表时,不断报出DirectX库丢失的错误。报错如下:
Could not locate DirectX
CMake Error at cmake-modules/FindPkgMacros.cmake:110 (message):
Required library DirectX not found! Install the library (including dev packages)
and try again. If the library is already installed, set the missing variables
manually in cmake.

这个问题的解决方案是安装DirectX SDK,如果你之前没安装过的话。你可以从这里下载SDK。

  • 安装DirectX SDK时,可能遇到一个错误码为s1023的错误。这种情况下,请在安装SDK之前根据这个先卸载C++ Redistributable package(s)。
  • 一旦配置完成,你就可以生成解决方案文件了,打开解决方案文件并编译Assimp库(可以编译为Debug版本也可以编译为Release版本,只要能工作就行)。
  • 使用默认配置构建的Assimp是一个动态库(Dynamic Library),所以我们需要包含所生成的assimp.dll文件以及程序的二进制文件。你可以简单地将DLL复制到我们程序可执行文件的同一目录中。
  • Assimp编译之后,生成的库和DLL文件位于code/Debug或者code/Release文件夹中。
  • 接着把编译好的LIB文件和DLL文件拷贝到工程的相应目录下,并在解决方案中链接它们。并且记得把Assimp的头文件也复制到你的include目录中(头文件可以在从Assimp中下载的include目录里找到)。
  • 之后配置 头文件,lib文件,以及.dll文件。头文件在文件目录的inlude下 如:E:OpenGLassimp-3.3.1assimp-3.3.1include
  • lib文件在你编译好的bulid文件下 E:OpenGLassimp-3.3.1assimp-3.3.1bulidcodeDebug 添加依赖项写:assimp-vc140-mt.lib 然后assimp-vc140-mt.dll还需要放到系统盘里面去 如:C:WindowsSysWOW64

最后放段代码,直接复制到工程运行,可快速查看是否配置好

#include <glad/glad.h>
#include <GLFW/glfw3.h>#include <iostream>void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;const char *vertexShaderSource = "#version 330 coren"
"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 coren"
"out vec4 FragColor;n"
"void main()n"
"{n"
"   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);n"
"}n0";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); // uncomment this statement to fix compilation on OS X
#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 shaderint vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);// check for shader compile errorsint success;char infoLog[512];glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILEDn" << infoLog << std::endl;}// fragment shaderint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);// check for shader compile errorsglGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILEDn" << infoLog << std::endl;}// link shadersint shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// check for linking errorsglGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILEDn" << infoLog << std::endl;}glDeleteShader(vertexShader);glDeleteShader(fragmentShader);// set up vertex data (and buffer(s)) and configure vertex attributes// ------------------------------------------------------------------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);glGenBuffers(1, &VBO);// bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s).glBindVertexArray(VAO);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);// note that this is allowed, the call to glVertexAttribPointer registered VBO as the vertex attribute's bound vertex buffer object so afterwards we can safely unbindglBindBuffer(GL_ARRAY_BUFFER, 0);// You can unbind the VAO afterwards so other VAO calls won't accidentally modify this VAO, but this rarely happens. Modifying other// VAOs requires a call to glBindVertexArray anyways so we generally don't unbind VAOs (nor VBOs) when it's not directly necessary.glBindVertexArray(0);// uncomment this call to draw in wireframe polygons.//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);// 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 triangleglUseProgram(shaderProgram);glBindVertexArray(VAO); // seeing as we only have a single VAO there's no need to bind it every time, but we'll do so to keep things a bit more organizedglDrawArrays(GL_TRIANGLES, 0, 3);// glBindVertexArray(0); // no need to unbind it every time // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)// -------------------------------------------------------------------------------glfwSwapBuffers(window);glfwPollEvents();}// optional: de-allocate all resources once they've outlived their purpose:// ------------------------------------------------------------------------glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);// glfw: terminate, clearing all previously allocated GLFW resources.// ------------------------------------------------------------------glfwTerminate();return 0;
}// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
// ---------------------------------------------------------------------------------------------------------
void processInput(GLFWwindow *window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{// make sure the viewport matches the new window dimensions; note that width and // height will be significantly larger than specified on retina displays.glViewport(0, 0, width, height);
}

c++ 怎么配置头文件路径_OpenGL环境配置相关推荐

  1. 5.CCS 配置头文件路径

    在CCS工程中,建议在工程属性中添加头文件相对路径,以便程序的移植程序在打包发送给其他人后,工程存放位置不一致时也不需要重新设置头文件路径.在MDK里面通过资源管理器设定好包含头文件的文件夹为头文件路 ...

  2. 【错误记录】Visual Studio 中配置 NDK 头文件路径 ( NDK 的三个头文件路径 | 与 CPU 架构相关 asm 头文件路径选择 )

    文章目录 一.报错信息 二.解决方案 1.NDK 的三个头文件路径 2.与 CPU 架构相关 asm 头文件路径选择 一.报错信息 参考 [Android 逆向]Android 进程注入工具开发 ( ...

  3. linux vim配置头文件搜索路径

    linux vim配置头文件搜索路径 根目录下 修改 etc/profile 文件结尾处加 set path=.,/usr/include,,/usr/include/c++/** //**搜索子目录 ...

  4. ++项目 cmake头文件路径_CMAKE入门实战

    0.导语 最近做的项目使用CLION构建,而这个采用CMakeLists.txt管理,因此为了更好的学习,故找到了一篇大牛级别的入门文章,有文章有代码,本文是花了一点时间把这篇文章学习后的重要点记录吧 ...

  5. 【Android 内存优化】libjpeg-turbo 函数库交叉编译与使用 ( 交叉编译脚本编写 | 函数库头文件拷贝 | 构建脚本配置 | Android Studio 测试函数库 )

    文章目录 一.交叉编译 Shell 脚本参考 二.NDK r16b 版本配置 三.libjpeg-turbo 交叉编译 Shell 脚本 四.执行 libjpeg-turbo 交叉编译 Shell 脚 ...

  6. vs2008 添加头文件路径

    在vc6中tools->options->directory可以设置 vs2008怎么设置添加编译的头文件路径的?以下两种途径任选一种 1)在解决方案上点右键打开解决方案属性页,通用属性, ...

  7. linux eclipse 头文件路径,Eclipse CDT标准库头文件设置

    使用eclipse cdt开发C/C++项目的时候,从eclipse官网下的linux下的专门版本在Fedora上能自动Discovery机器上的gcc/g++头文件.符号之类的,但是在我用的slac ...

  8. vscode新手注意事项(字体间隔,报错提示波浪线,头文件路径,opencv头文件路径)

    一.字体空格 刚安装vscode,不设置字体的话,字体间的间隔会很难受,需要进行如下配置. 在 设置->首选项 选择 文本编辑器->字体 ,将"FONT Family " ...

  9. KEIL5 头文件路径设置摸索和总结

    KEIL5 头文件路径设置摸索和总结 1.常识 1.1绝对路径和相对路径的认知: 绝对路径:是从盘符开始的路径,形如 C:\windows\system32\cmd.exe 相对路径:是从当前路径开始 ...

最新文章

  1. 2022-2028年中国羧基丁腈胶乳行业市场发展调研及投资前景分析报告
  2. msdn 上的关于delegate和event的一个例子,理解后加点评论
  3. vscode从原有分支上新建_GitHub+VSCode 打造稳定、快速、高效、免费图床
  4. Druid详细配置信息
  5. 关于投稿 LaTeX 的使用
  6. 《PHP求职宝典》--Web设计页面笔记
  7. App设计灵感之十二组精美的旅行App设计案例
  8. python数据可视化的特点_Python数据可视化 pyecharts实现各种统计图表过程详解
  9. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_08-新增页面-前端-Api调用...
  10. Flutter:布局
  11. Nod32的内网升级方案
  12. 计算机pe启动蓝屏怎么办,进pe蓝屏解决方法
  13. linux离线安装sails,关于sails 初学者常见问题汇总(示例代码)
  14. PDF文件格式转换工具 迅捷PDF转换成Word转换器
  15. 你值得拥有!-阿里P8架构师荣耀典藏:Java多线程与Socket实战微服务框架笔记
  16. c语言编程实现简单三子棋游戏
  17. 最多只需三步,彻底解决VB6中不能加载MSCOMCTL.OCX的提示
  18. SQL注入-01-什么是SQL注入?
  19. Javascript:谈谈JS的全局变量跟局部变量(转zyz511919766)
  20. ESP32开发板连接TFT屏幕

热门文章

  1. 编程面试问题越难越好?!
  2. @Python 程序员,如何最大化提升编码效率?
  3. mysql 5.7.19 rpm下载_centos6.8 mysql5.7 rpm安装与完全卸载
  4. Java程序员春招三面蚂蚁金服,丹丹丹学妹哭着对我说:学长
  5. Java高级进阶学习资料!Java虚拟机的垃圾回收机制
  6. 第 9 章 适配器设计模式
  7. sqlserver 如何把一列分为一行显示_EXCEL神乎其技 多列追加为一列
  8. php如何打印png文件,我的php生成的png文件有什么问题?
  9. mysql rds 定时执行_RDS下执行SQL小脚本
  10. js实现sqrt开方函数(二分法)