工作在于总结,最近又读了些openGL相关的内容,在此做些总结。
学习的教程见这个网站https://learnopengl-cn.github.io/intro/,其中的内容非常经典。
对于第一章节,主要是讲环境的配置。我这里按照文档所述,使用glfw和glad库进行窗口及OpenGL库函数的管理。配置部分原教程中已经足够详细,在这里略过。
作为调用OpenGL绘制,或者任何窗口相关的应用,一般都可粗略的大致分为环境初始化,外部事件响应,内部逻辑处理,窗口及其它外部输出 ,退出这几部分。
对于这个示例中的OpenGL来说,其接口使用glfw和glad库协助管理,相应的初始化部分相对来说较为简单。
调用glfw进行窗口初始化:
glfwInit();/*初始化glfw库*/
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);/*设置OpenGL主版本*/
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);/*设置OpenGL副版本*/
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);/*设置OpenGL工作在核心模式*/
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);/*设置窗口大小不可变*/
函数含义详见注释。
接着创建窗口,
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
if (window == nullptr)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwCreateWindow为创建窗口,设置窗口的长、宽、标题及显示器等,这里没有对于显示器等做高级设置。
glfwMakeContextCurrent(Window)
设置OpenGL的context为当前窗口区域
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
glfwGetProcAddress函数获取当前窗口的OpenGL渲染环境,将地址传递给glad
gladLoadGLLoader函数对当前窗口区域进行OpenGL函数集的初始化。
glfwSetKeyCallback(window, key_callback);
类似windows的事件处理,这里将key_callback函数挂接至window的按键事件处理回调函数中。
glfwGetFramebufferSize(window, &width, &height);获取窗体的宽和高
至此,我们可以真正调用OpenGL函数了。
glViewport(0, 0, width, height);
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
}
最后,退出的时候需要调用glfwTerminate();函数
其实,对于应用开发者来说,主要工作在于中间的绘图部分。不是其它不重要,而是这段时间决定死磕OpenGL了。所以后面将主要学习中间的绘图部分。这部分主要代码如下。
1 #include <glad/glad.h> 2 #include <GLFW/glfw3.h> 3 4 #include <iostream> 5 6 void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) { 7 if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) 8 { 9 glfwSetWindowShouldClose(window, GL_TRUE); 10 } 11 } 12 13 int main() { 14 int width = 0, height = 0; 15 16 glfwInit(); 17 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 18 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 19 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 20 glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); 21 22 23 24 GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr); 25 if (window == nullptr) 26 { 27 std::cout << "Failed to create GLFW window" << std::endl; 28 glfwTerminate(); 29 return -1; 30 } 31 32 glfwMakeContextCurrent(window); 33 34 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) 35 { 36 std::cout << "Failed to initialize GLAD" << std::endl; 37 return -1; 38 } 39 40 //glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); 41 42 glfwSetKeyCallback(window, key_callback); 43 44 glfwGetFramebufferSize(window, &width, &height); 45 glViewport(0, 0, width, height); 46 47 48 while (!glfwWindowShouldClose(window)) { 49 glfwPollEvents(); 50 glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 51 glClear(GL_COLOR_BUFFER_BIT); 52 glfwSwapBuffers(window); 53 } 54 55 glfwTerminate(); 56 return 0; 57 }