main()函数模板:
所有opengl程序main()函数内都有的操作有:
(a)初始化 GLFW库;
(b)实例化 GLFWwindow;
(c)初始化 GLEW 库;
(d)调用一次 init()函数;
(e)重复调用 display()函数。
下面在代码中进一步解释以上步骤:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
using namespace std;
void init(GLFWwindow* window) { }
void display(GLFWwindow* window, double currentTime) {
glClearColor(1.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
}
int main(void) {
// GLFW 和 GLEW 库先分别使用 glfwInit()和 glewInit()初始化。
if (!glfwInit()) { exit(EXIT_FAILURE); }
/*
glfwCreateWindow()命令负责创建 GLFW 窗口,同时其相关的 OpenGL 上下文由glfwCreateWindow() 命令创建,
其可选项由前面的WindowHint 设置。WindowHint 指定了计算机必须与OpenGL 版本 4.3 兼容(主版本号为 4,次版本号为 3)。
*/
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
/*
glfwCreateWindow 命令的参数指定了窗口的宽、高(以像素为单位)以及窗口顶部的标题(将这里没有用到的另外两个参数设为 NULL,这两个参数分别用来允许全屏显示和资源共享)。
*/
GLFWwindow* window = glfwCreateWindow(600, 600, "Chapter2 - program1", NULL, NULL);
/*
创建 GLFW 窗口并不会自动将它与当前 OpenGL 上下文关联起来,所以需要调用 glfwMakeContextCurrent()
*/
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK) { exit(EXIT_FAILURE); }
/*
glfwSwapInterval()命令和 glfwSwapBuffers()命令用来开启垂直同步,因为 GLFW 窗口默认是双缓冲的
*/
glfwSwapInterval(1);
init(window);
/*
main()函数包括一个简单的渲染循环,用来反复调用 display()。
它同时也调用了 glfwSwapBuffers()以绘制屏幕,以及 glfwPollEvents()以处理窗口相关事件(如按键事件)。
当 GLFW 探测到应该关闭窗口的事件(如用户单击了右上角的“×”)时,循环就会终止。
*/
while (!glfwWindowShouldClose(window)) {
display(window, glfwGetTime());
glfwSwapBuffers(window);
glfwPollEvents();
}
/*
我们将一个 GLFW窗口对象的引用传入了 init()和 display()调用。这些函数在特定环境下需要访问 GLFW 窗口对象。
同时我们也将当前时间传入了 display()调用,若要保证动画在不同计算机上以相同速度播放,这样做会很有用。
在这里,我们用了 glfwGetTime(),它会返回 GLFW 初始化之后经过的时间。
*/
glfwDestroyWindow(window);
glfwTerminate();
exit(EXIT_SUCCESS);
/*
当用户尝试关闭 GLFW 窗口时,程序将退出渲染循环。这时,main()会通过分别调用
glfwDestroyWindow()和 glfwTerminate()通知 GLFW 销毁窗口并终止运行
*/
}
glDrawArrays(GLenum mode, Glint first, GLsizei count);
// mode 参数表示图元的类型。对于三角形,我们使用 GL_TRIANGLES。
// first 参数表示从哪个顶点开始绘制(通常是顶点 0,即第一个顶点),
// count 表示总共要绘制的顶点数。