opengl学习

工作在于总结,最近又读了些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 }

猜你喜欢

转载自www.cnblogs.com/yy-86/p/9766179.html