如何配置OPENGL可以参考:https://www.cnblogs.com/hjd21/p/12431381.html;
另外强烈推荐一个从入门到入土的教程:https://learnopengl-cn.github.io/
笔记在代码注释里。
#include"includes/glad.h" #include "includes/glfw3.h" #include<ctime> #include <iostream> void framebuffer_size_callback(GLFWwindow* window, int width, int height); void processInput(GLFWwindow* window); // settings const unsigned int SCR_WIDTH = 800; const unsigned int SCR_HEIGHT = 600; int main() { srand((int)(time(NULL))); // glfw: 对glfw的初始化 glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //告诉glfw使用的opgl(glad)主版本是3 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//告诉glfw使用的opgl(glad)次版本是3 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//告诉glfw我们使用的是核心模式,意味着我们只能使用OpenGL功能的一个子集 //创建窗口对象(本质为一typedef struct),函数参数分别是宽、高(不是像素)、窗口名称、?、?,返回对象的指针地址,后者是函数。 GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "dawn666", NULL, NULL); //看窗口是否创建失败。 if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window);//真正设置窗口的函数,window只是定义的结构体。 //我们还需要注册window这个窗口的回调(视口)函数,使得实现窗口大小改变,视口同调。 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//使用window的宽高并调用回调函数。 //GLAD是用来加载管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLAD,初始化失败就会终止。 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } // 渲染循环render loop // ----------- while (!glfwWindowShouldClose(window)) { // 通过函数调用判断用户是否按下ESC,按下则设置参数为该窗口可以关闭。 // ----- processInput(window); // render渲染循环 // ------ glClearColor((float)(rand()%500)/500, (float)(rand() % 500) / 500, (float)(rand() % 500) / 500, (float)(rand() % 500) / 500);//清空窗口的后缓冲,并设置后缓冲所用的颜色值。 glClear(GL_COLOR_BUFFER_BIT);//清空窗口前缓冲缓冲。 //glfwWindowShouldClose函数在我们每次循环的开始前检查一次GLFW是否被要求退出,如果是的话该函数返回true然后渲染循环便结束了,之后为我们就可以关闭应用程序了。 //glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)。 //glfwSwapBuffers函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上。 glfwSwapBuffers(window);//交换前后缓冲 glfwPollEvents(); } //当渲染循环结束后我们需要正确释放/删除之前的分配的所有资源。我们可以在main函数的最后调用glfwTerminate函数来完成。 //---------------------------------------------------------------------------- glfwTerminate(); return 0; } void processInput(GLFWwindow* window)//是否退出窗口 { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); } //当用户改变窗口的大小的时候,视口也应该被调整。我们可以对窗口注册一个回调函数(Callback Function),它会在每次窗口大小被调整的时候被调用。 void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height);//glViewport函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)。 //*我们实际上也可以将视口的维度设置为比GLFW的维度小,这样子之后所有的OpenGL渲染将会在一个更小的窗口中显示,这样子的话我们也可以将一些其它元素显示在OpenGL视口之外。 }
posted on
浙公网安备 33010602011771号