入门OpenGL教程EP2-Hello Window
回顾
上一部分中我们已经成功使用 OpenGL 创建一个窗口,那么现在我们来详细看看其中的原理与方法。
详解
1 |
|
头文件
1 |
其中的iostream
为 C++的 IO 头文件,而GLFW/glfw3.h
为glew提供的头文件
。
GLEW_STATIC
表明我们需要使用静态的glew
库,所以必须要在引入glew.h
前定义。
常数
1 | const GLint WINDOW_WEIGHT = 800; |
此处定义的是窗口的宽(weight)和高(height),也就是我们在屏幕上所看到的横向长度与纵向长度。
使用GLint
的原因主要由于在不同的平台(编译器)上对于int
所定义的容量可能会有不同,但GLint
在所有平台以及所有编译器中容量都相同。
初始化
1 | glfwInit(); |
初始化函数
int glfwInit(void)
为GLFW
的初始化函数,无需传入参数,常见用法如下:
1 | if (!glfwInit()) { |
当GLFW
初始化失败时会返回GLFW_FALSE
。我们在 OpenGL 创建窗口之前需要对GLFW
进行初始化。
窗口提示
void glfwWindowHint(int hint, int value)
提供了创建窗口时的提示。需要传入的参数为int hint
与int value
。必须在创建窗口之前使用提示。
所有提示可以在GLFW: Window guide找到,下面列举几个常见的。
提示(hint) | 代表内容 | 默认值 | 解释 |
---|---|---|---|
GLFW_RESIZABLE | 窗口可否由用户改变大小 | GLFW_TRUE | 窗口是否可以由用户拖动边缘更改大小 |
GLFW_CONTEXT_VERSION_MAJOR | 创建窗口的 OpenGL主版本号 | 1 | 建议使用 GPU 能够支持的最新版本或3 |
GLFW_CONTEXT_VERSION_MINOR | 创建窗口的 OpenGL次版本号 | 0 | 建议使用 GPU 能够支持的最新版本或3 |
GLFW_OPENGL_FORWARD_COMPAT | OpenGL 是否向前兼容 | GLFW_FALSE | 设置为GLFW_FALSE 时,在之前版本拥有而当前版本删除了的函数不能使用 |
GLFW_OPENGL_PROFILE | 创建窗口时选择的 OpenGL 配置文件 | GLFW_OPENGL_ANY_PROFILE | 建议使用GLFW_OPENGL_CORE_PROFILE |
创建窗口
1 | GLFWwindow* window = glfwCreateWindow(WINDOW_WEIGHT, WINDOW_HEIGHT, "OpenGL", nullptr, nullptr); |
GLFWwindow* glfwCreateWindow(int width, int height, const char *title, GLFWminotor *monitor, GLFWwindow *share)
创建了类型为GLFWwindow*
的指针,该指针指向创建的窗口内存位置。
当窗口创建失败时(内存不足等),返回的地址为nullptr
,所以我们应当防止此类情况发生。创建失败时使用void glfwTerminate()
来销毁所有创建的窗口等 OpenGL 文件。当使用了此函数后如需再次使用 GLFW 时需要再次进行glfwInit()
。
void glfwMakeContextCurrent(GLFWwindow *window)
为创建的window
创建当前线程。
初始化 GLEW
1 | glewExperimental = true; |
为了使用GLFW_OPENGL_CORE_PROFILE
,需要将glewExperimental
设置为true
,否则将导致程序崩溃。
和初始化GLFW
一样,但glewInit()
的返回值为GLEW_OK
。
获取窗口坐标
1 | GLint screenWidth, screenHeight; |
void glfwGetFramebufferSize(GLFWwindow *window, int *width, int *height)
用来获取窗口的宽和高,为了防止窗口坐标出错,我们实际获取一次宽与高来代替创建窗口时的宽与高。
接着就可以设置窗口的坐标void glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
。其中x, y
代表窗口左下角的像素坐标,width, height
可以近似认为窗口右上角的像素坐标。
侦测用户输入
1 | while (!glfwWindowShouldClose(window)) { |
当用户按下退出按钮或结束程序时,int glfwWindowShouldClose(GLFWwindow *window)
函数返回退出标识(1
),我们在此时终止循环,并于最后销毁 OpenGL 窗口及其附属文件。