OpenGL / C++ 学习笔记(一) 搭设环境

OpenGL / C++ 学习笔记

汇总页

关于OpenGL

OpenGL属于较低层的图形渲染相关库,负责向显卡提供绘制画面所需的、从建模顶点到画面处理的数据信息和编程脚本(可编程渲染管线),但与其它底层的图形库不同,OpenGL实际上是一个底层的图形渲染规范\标准,由1992年成立的OpenGL架构评审委员会(ARB)维护【百度百科】,因此各显卡和平台的对它的具体实现可以是不同的。

学习路线

OpenGL是一个庞大且用途多样的图形库,涉及知识点和函数较多,对刚接触图形学的新手而言零基础直接啃《OpenGL超级宝典》(俗称蓝宝书)或《OpenGL编程指南》(又叫红宝书(虽然中文版是墨绿色的封皮=-=))其实是不太适合的。
这边推荐新手先食用相较下会简单点的learnopengl提供的入门教程【中文翻译的教程网址】(由于教程是放在gayhub上,所以可能需要魔法上网,或者食用官方英文版教程),或者EA小哥的导向引擎开发的C++和GL系列入门视频【比比汗丽丽上的搬运视频链接
等到看完上面两者之一后才食用书本是比较明智的选择。

关于库的介绍、下载和安装,以及环境配置

手动环境配置(示例编译器:vs2019)

第一步 下载相关文件

glfw官网下载(官网也有glfw的相关文档)(选择下载源文件(source package))
cmake官网下载(编译glfw源码用)
glad官网下载
freeglut和glew的网址我给忘了(毕竟之后用的glfw没用过glut),以后可能会补上吧

第二步 编译glfw

打开cmake之后在第一栏选择之前下好且解压后的glfw源码文件夹,第二栏选好编译目标文件夹
相关界面的操作
点击左下角的Configure按钮,会出来以下界面
在这里插入图片描述
第一栏选择对应的编译器,下面的不用管他,默认的就好,点击Finish
在这里插入图片描述
在这里插入图片描述
等待出现第二个界面之后不用勾选任何东西(通常情况下),点击Generate开始生成文件,读条结束后在我们一开始选择的第二栏(编译目标文件夹)中就会出现对应编译器版本的glfw库工程的文件了。(如下图所示)

在这里插入图片描述

然后我们点击打开上图文件夹中的.sln(解决方案)文件,点击生成>生成解决方案,待生成完毕,在项目文件夹的\src\Debug文件夹中可得到我们接下来需要的.lib(库)文件。
在这里插入图片描述
在这里插入图片描述

第三步 准备之后会常用到的OpenGL需要的开发文件夹include、lib

我们将一开始解压后拿去给cmake编译的GLFW-x.x.x文件夹中的include目录下的GLFW文件夹复制到新建的include中,下载好的glad所解压得到的文件夹中include目录下的两个文件夹glad和KHR复制,粘贴到这个新的include文件夹中;
将编译好的GLFW库(之前提到的debug和release文件夹)复制到lib文件夹下(由于我们刚刚只用debug模式对glfw进行了编译所以只有deubug文件夹,如果换作release再进行一次编译之前glfw项目的\src文件夹下就会有debug和release两个文件夹了)。
操作完成后的include文件夹
操作完成后的lib文件夹

第四步 新建项目

在vs2019中新建c/c++的空项目,点击项目—>属性
在这里插入图片描述
然后在vc++这栏找到包含目录(include)
在这里插入图片描述
选择自己刚刚整理好的include文件夹(注:$(SolutionDir)是vs的特殊指令,指代项目目录,可用于不同电脑上的项目转移避免项目因为绝对地址问题打开失败)

然后选择库目录(lib)栏,选择自己刚刚整理好的lib文件夹(不同的配置(见下图左上角)(debug、release)选择对应的文件夹)
在这里插入图片描述
然后,点击链接器,选择输入标签,在附加依赖项中加入opengl32.lib;glfw3.lib;两项,Debug和Release模式下名字是一样的,因此和include一样,可以在左上角为所有配置选项下配置。
在这里插入图片描述
配置完成,点击应用以保存设置。

最后,将之前放在include中的glad.c文件包含在项目中(如果vs界面里的项目文件夹中出现了,就右键点击选择包含在项目中,如果没有,右键空白处选择添加现有项,选择glad.c)。

在这里插入图片描述

这样我们的项目设置就完成了。

第五步 测试环境是否配置成功

项目中新建cpp文件;

在文件中输入以下代码:

// OpenGL基本库
#include <glad/glad.h>
#include <GLFW/glfw3.h>

// 报告错误用
#include <iostream>

// 窗口回调函数,每当窗口大小属性被修改时该函数被回调,参数即为该窗口新的大小
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
 // 未来会添加内容
}

// 事件检测函数
void process_Input(GLFWwindow* window)
{
 // 未来会添加内容
 if (glfwGetKey(window,GLFW_KEY_ESCAPE) == GLFW_PRESS) // 按键检测,检测esc键是否按下
 {
  glfwSetWindowShouldClose(window,true);    // 设置对应窗口应该被关闭
 }
}

int main()
{
 // !初始化glfw窗口
 glfwInit();
 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);     // 指定OnencL的主版本号(和glad版本对应)
 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);     // 指定OpenGL的子版本号(和glad版本对应)
 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 设置使用OpenCL的核心模式(可编程渲染管道的模式)
 //创建窗口
 GLFWwindow* window = glfwCreateWindow(720, 720, "LearnOpenGL", NULL, NULL); // 参数含义:窗口宽,窗口高,窗口名称,窗口附加,窗口依赖,如果新建窗口失败返回NULL指针
 if (window == NULL)            // 如果出错,则退出程序
 {
  std::cout << "Failed to create GLFW window" << std::endl; // 报错信息
  glfwTerminate();           // 终止窗口进程
  return -1;
 }
 glfwMakeContextCurrent(window); // 将窗口的上下文环境设置为当前主线程的上下文环境 
 // !初始化glad
 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))  // 如果加载失败,退出程序
 {
  std::cout << "Failed to initialize GLAD" << std::endl;  // 报错信息
  return -1;
 }
 // 注册窗口回调函数
 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

 glClearColor(1.0f, 1.0f, 0.0f, 1.0f); // 设置清屏颜色为黄色

 // 渲染循环
 while (!glfwWindowShouldClose(window)) // 检测窗口是否该关闭
 {
  process_Input(window);    // 处理输入事件

  glClear(GL_COLOR_BUFFER_BIT);  // 清屏
  glfwSwapBuffers(window);   // 将显示缓存和离屏缓存交换(显示离屏缓存中的内容)
  glfwPollEvents();     // 检查是否有事件触发(例如鼠标输入和键盘输入事件)
 }
 glfwTerminate();      // 终止进程
 return 0;
}

如果环境配置成功则上述代码能成功运行,就会打开一个赛博朋克2077标配(大误) 黄色的图形界面窗口
(此时按下esc键就会被检测到并退出程序)

恭喜你现在成功进入了OpenGL无限可能的世界

在这里插入图片描述

环境变量设置

有的人可能觉得每次新建OpenGL项目都得配置项目环境很麻烦,想要通过给系统配置环境变量来一步到位,在这篇文章里我就不赘述这些方法了,可以移步百度(bushi

(PS:我个人推荐把include和lib扔到每一个项目里通过“”调用,这样保证换不同电脑上时能快速运行,不需要再次配置环境或者环境(比如GLFW或者GLAD的版本)不一样导致项目打不开

下一篇: OpenGL/C++ 学习笔记(二)图形渲染相关概念

  • 27
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
课程解决的问题: 作为游戏行业或者图形学从业者,你是否面临以下问题: 到底openGL底层如何实现的? 到底矩阵操作变换是怎么做到的? 到底光栅化的算法以及原理是什么? 到底如何才能从3D世界投射到2D屏幕呢? 图形学有这么多的矩阵操作,到底如何推导如何应用呢? 学完这门课程,你应该就可以从底层了解一个初级的openGL图形接口如何实现,图形学最底层的封装到底面临哪些挑战;跟随我们一行一行写完代码,你就会得到一个迷你版本的openGL图形库,你可以深度体会图形从模型变换,观察矩阵变换,投影矩阵变换一直到光栅化纹理操作的全套模拟流程。 课程介绍: 本课程将带领学员不使用任何图形库,实现从0到1的图形学接口封装以及算法讲解,并且带领大家手敲代码,一行一行进行实现。 涵盖了(环境搭建,绘制点,Bresenham算法绘制完美直线,三角形拆分绘制算法,颜色插值算法,图片操作,图片二次插值放缩算法,纹理系统接口搭建及封装,矩阵操作理论以及实践,openGL类似接口封装,3D世界的图形学理论及接口封装等) 最终将带领大家通过C++实现一个3D世界的图形接口,方便所有人入门图形学,进行接下来的openGL接口以及GPU编程的学习   本课程为系列课程的第一步入门,且带领所有人进行实现,更加实用,可以让大家打牢图形学的基础知识及编程技能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值