汇总页
OpenGL属于较低层的图形渲染相关库,负责向显卡提供绘制画面所需的、从建模顶点到画面处理的数据信息和编程脚本(可编程渲染管线),但与其它底层的图形库不同,OpenGL实际上是一个底层的图形渲染规范\标准,由1992年成立的OpenGL架构评审委员会(ARB)维护【百度百科】,因此各显卡和平台的对它的具体实现可以是不同的。
OpenGL是一个庞大且用途多样的图形库,涉及知识点和函数较多,对刚接触图形学的新手而言零基础直接啃《OpenGL超级宝典》(俗称蓝宝书)或《OpenGL编程指南》(又叫红宝书(虽然中文版是墨绿色的封皮=-=))其实是不太适合的。
这边推荐新手先食用相较下会简单点的learnopengl提供的入门教程【中文翻译的教程网址】(由于教程是放在gayhub上,所以可能需要魔法上网,或者食用官方英文版教程),或者EA小哥的导向引擎开发的C++和GL系列入门视频【比比汗丽丽上的搬运视频链接】
等到看完上面两者之一后才食用书本是比较明智的选择。
glfw官网下载(官网也有glfw的相关文档)(选择下载源文件(source package))
cmake官网下载(编译glfw源码用)
glad官网下载
freeglut和glew的网址我给忘了(毕竟之后用的glfw没用过glut),以后可能会补上吧
打开cmake之后在第一栏选择之前下好且解压后的glfw源码文件夹,第二栏选好编译目标文件夹
点击左下角的Configure按钮,会出来以下界面
第一栏选择对应的编译器,下面的不用管他,默认的就好,点击Finish
等待出现第二个界面之后不用勾选任何东西(通常情况下),点击Generate开始生成文件,读条结束后在我们一开始选择的第二栏(编译目标文件夹)中就会出现对应编译器版本的glfw库工程的文件了。(如下图所示)
然后我们点击打开上图文件夹中的.sln(解决方案)文件,点击生成>生成解决方案,待生成完毕,在项目文件夹的\src\Debug文件夹中可得到我们接下来需要的.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两个文件夹了)。
在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
#include
// 报告错误用
#include
// 窗口回调函数,每当窗口大小属性被修改时该函数被回调,参数即为该窗口新的大小
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++ 学习笔记(二)图形渲染相关概念