OpenGL学习之路之窗口的建立

OpenGL学习之路之窗口的建立

十一月 02, 2021

环境配置

先建立一个空项目,建立一个c++文件,然后设置解决方案的属性设置三个位置
第一是c/c++\常规\附加包含目录加入include的文件夹,glfw和glew都需要,第二,链接器\常规\附加库目录,lib文件夹,第三,链接器\输入\附加依赖库,opengl32.lib glfw3.lib glew32s.lib

创建自己的引擎

将文件修改为main作为主函数

1
#define GLEW_STATIC

这个注意小心拼写错误,本人搞了几小时

初始化

声明版本号

1
2
3
4
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
1
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

MacOSX系统加上这一句
以上是初始化Glfw,说明我们要使用的OPENGL版本是3.3,我们同样明确告诉GLFW我们使用的是核心模式(Core-profile)。明确告诉GLFW我们需要使用核心模式意味着我们只能使用OpenGL功能的一个子集。

创建窗口指针

1
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOPENGL", NULL, NULL);//前两个参数代表生成窗口大小

接下来进行GLFW的初始化

1
2
3
4
5
6
7
if (window == NULL)
{
std::cout << "GLFW窗口初始化失败" << std::endl;
glfwTerminate();//程序终止函数
return -1;
}
glfwMakeContextCurrent(window);

然后是GLEW的初始化

1
2
3
4
5
6
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
std::cout << "GLEW初始化失败" << std::endl;
return -1;
}

确定渲染窗口

1
2
3
4
5
6
glViewport(0, 0, 800, 600);//渲染窗口大小
glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);//注册函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}

framebuffer_size_callback自定义函数注册到当窗口大小改变的事件中能及时反映

确定基本架构

1
2
3
4
5
6
7
while(!glfwWindowShouldClose(window)){
//输入
//渲染指令
//检查并调用事件,交换缓冲
glfwSwapBuffers(window);//进行屏幕缓冲
glfwPollEvents();//检查函数有没有触发事件
}

清理缓冲区颜色

1
2
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//来设置清空屏幕所用的颜色,表示清除板的颜色
glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓冲之后

输入

1
2
3
4
5
6
7
processInput(window)
void processInput(GLFWwindow* window) {
//输入
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
glfwSetWindowShouldClose(window, GLFW_TRUE);
}
}

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#define GLEW_STATIC
#include<GL/glew.h>
#include<GLFW/glfw3.h>
#include<iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);MacOSX系统加上这一句
//以上是初始化Glfw,说明我们要使用的OPENGL版本是3.3,我们同样明确告诉GLFW我们使用的是核心模式(Core-profile)。明确告诉GLFW我们需要使用核心模式意味着我们只能使用OpenGL功能的一个子集。

GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOPENGL", NULL, NULL);//前两个参数代表生成窗口大小
if (window == NULL)
{
std::cout << "GLFW窗口初始化失败" << std::endl;
glfwTerminate();//程序终止函数
return -1;
}
glfwMakeContextCurrent(window);
//GLFW初始化
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
std::cout << "GLEW初始化失败" << std::endl;
return -1;
}
//Glew的初始化
glViewport(0, 0, 800, 600);//渲染窗口大小
glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);//注册函数
while(!glfwWindowShouldClose(window))
{
//输入
processInput(window);

//渲染指令
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//来设置清空屏幕所用的颜色,表示清除板的颜色
glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓冲之后


//检查并调用事件,交换缓冲
glfwSwapBuffers(window);//进行屏幕缓冲
glfwPollEvents();//检查函数有没有触发事件

}
glfwTerminate();

return 0;
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
void processInput(GLFWwindow* window) {
//输入
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
glfwSetWindowShouldClose(window, GLFW_TRUE);
}
}