记录学习OpenGL的过程,写的第一个工程。
#include <stdio.h>
#include "glad/glad.h"
#include "GLFW/glfw3.h"
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
//设置窗口的尺寸大小
glViewport(0, 0, width, height);
}
//当按下ESC返回键时,窗口会退出
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
{
glfwSetWindowShouldClose(window, true);
}
}
int main()
{
printf("Hello OpenGL\n");
/* GLFW是一个轻量级的OpenGL框架,提供了一套用来管理窗口,读取输入,处理事件等操作的API */
/* GLAD专门加载OpenGL的函数指针的Loading Library,因为OpenGL驱动版本太多编译期无法确定使用的是哪个,
因此开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用,使用GLAD管理函数指针可以避免大量的查找函数指针这种重复性代码(实际上这些代码都存在,只是不需要我们再自己写了)。 */
/* 初始化GLFW库 */
glfwInit();
/* 配置GLFW窗口 */
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//主版本号
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//次版本号
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); //设置窗口是否可拉伸
//使用openGL的核心
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
int windowWidth = 800;
int windowHeight = 600;
//创建窗口对象
GLFWwindow * window = glfwCreateWindow(windowWidth, windowHeight, "我的第一个OpenGL", NULL, NULL);
// OpenGL 运行模式--单线程,多个线程同时调用不被允许
//创建完窗口后,将窗口的上下文设置为当前线程的主上下文
glfwMakeContextCurrent(window);
//初始化GLAD库,GLAD是用来管理OpenGL的函数指针的,任何OpenGL API都必须在初始化GLAD库后才可以正常访问。
gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);
//设置回调函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//渲染循环,我们希望程序在我们主动关闭它之前不断绘制图像并能够接受用户输入,退出前移植保持运行。
while (!glfwWindowShouldClose(window))
{
//输入
processInput(window);
//窗口颜色状态使用函数
//渲染指令
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //设置清空屏幕所用的颜色,类似黑板的深蓝绿色,状态设置函数
glClear(GL_COLOR_BUFFER_BIT); //清空屏幕,状态使用函数
//交换缓冲区,交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上,
//双缓冲可以有效地避免渲染时的闪烁现象。
//我们应用双缓冲渲染窗口应用程序。前缓冲保存着最终输出的图像,它会在屏幕上显示;而所有的的渲染指令都会在后缓冲上绘制。
//当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,这样图像就立即呈显出来,之前提到的不真实感就消除了。
glfwSwapBuffers(window);
//检测GLFW窗口是否有触发事件,比如键盘输入、鼠标移动等
glfwPollEvents();
}
//是否GLFW已分配的资源,将销毁所有剩余的窗口和光标,并释放任何GLFW分配的资源。
glfwTerminate();
return 0;
}
学习OpenGL的官方网站:主页 - LearnOpenGL CN