更高版本的OpenGL已经发布(写作时最新版本为4.5),你可能会问:既然OpenGL 4.5 都出来了,为什么我们还要学习OpenGL 3.3?答案很简单,所有OpenGL的更高的版本都是在3.3的基础上,引入了额外的功能,并没有改动核心架构。新版本只是引入了一些更有效率或更有用的方式去完成同样的功能。因此,所有的概念和技术在现代OpenGL版本里都保持一致。当你的经验足够,你可以轻松使用来自更高版本OpenGL的新特性。
第一步:GLFW(管理窗口)下载与配置
GLFW下载地址
下面是编译好的,下载32位(不管系统是32还是64,都下载32位,因为64位的问题比较多)
打开VS2017,建立新项目,建立空白项,项目方案右键,打开项目资源所在文件夹。
在项目文件夹建立两个文件夹
Includes
Libs
解压下好的glfw
将相应的.lib和.h文件放到相应的文件夹中(没有文件夹自己创建),具体如下:
复制文件 | 复制到的目录 |
---|---|
./include/GLFW/中的glfw3.h | 放到我们刚创建好的Inlcudes文件夹中 |
./lib-vc2015/glfw3.lib和glfw3dll.lib | 放到Libs文件夹中 |
打开属性管理器的链接器-输入(跟配置opencv步骤一样)
包含目录和库目录(一次选择我们添加的includes和libs)
附加依赖项输入 opengl32.lib和glfw3.lib还有msvcrt.lib
第二步:下载GLAD(使用OpenGL函数)
GLAD链接
只改动图上选项,其他不变直接点GENERATE
选中最后的压缩包下载,打开压缩包,把include中所有的文件复制到我们的Includes中
把src中的文件复制到项目目录如下
回到VS,把glad.c添加到工程中
创建main.cpp测试代码
#include<iostream>
#include <glad/glad.h>
#include <glfw3.h>
void framebuffer_size_callback(GLFWwindow* window, int width, int height)//这个是窗口变化的回调函数。。注意输入参数
//是一个glfw的窗口,一个宽度和高度
{
glViewport(0, 0, width, height);//这个是回调函数内的内容
//这里是将视口改成变化后的的窗口大小
//注意需要的注册该回调函数
//glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//两个参数是,glfw的窗口以及回调函数
}
void processInput(GLFWwindow *window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)//获取按键,如果等于esc
glfwSetWindowShouldClose(window, true);//利用强制窗口应该关闭
}
int main()
{
glfwInit();//类似于之前的gluinit一般采用库都需要进行初始化
//版本号是opengl4.5
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置主版本号
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);//设置次版本号
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//在mac系统上需要设置该语句
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);//后面两个参数是设置显示屏和共享的,
//一般库函数的相关定义,
//可以配置好以后直接查看都有详细的定义
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
system("pause");
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))//在调用opengl函数之前初始化glad,
//glad的作用就是快速的将opengl函数映射到相关的显卡函数上
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
glViewport(0, 0, 800, 600);//设置视口大小
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//注册函数,该函数还可以注册其他相关硬件的回调函数
//
//渲染流程
while (!glfwWindowShouldClose(window))//检测glfw窗口是否被指令要求关闭,如果是的话,则会退出循环
{
//输入的相关操作
processInput(window);//
// 渲染的相关操作
glClearColor(1.0f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
//查看所有的事件,并且交换内存
glfwSwapBuffers(window);//交换颜色缓存,即glfw窗口内的内容。。。注意glfw开头的交换和后面gl开头的区别
glfwPollEvents();//检测是否有其他的触发时间,例如上述的窗口大小变化,需要调用相关的回调函数
}
glfwTerminate();//清除退出
return 0;
}