OpenGL-关于创建窗口的解释

我们首先需要明白,OpenGL这个玩意只管一件事,就是画图,除了画图之外这玩意什么都不管。包括创建窗口,事件响应,甚至包括图像的旋转和平移什么的都不会去管,他只会画图。 那么问题就来了,我们Hello world里面的窗口是哪里来的呢?

先来看看Hello world里面的代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
using namespace std;

int main(int argc, const char * argv[]) {
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    
    GLFWwindow* window = glfwCreateWindow(400, 400, "Hello World", nullptr, nullptr);
    if(window == nullptr){
        glfwTerminate();
        cout<<"window create failed"<<endl;
    }
    glfwMakeContextCurrent(window);
    
    if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
        cout<<"glad load failed"<<endl;
    }
    glViewport(0, 0, 400, 400);
    
    while(!glfwWindowShouldClose(window)){
        glClearColor(0.2f, 0.3f, 0.3f, 0.1f);
        glClear(GL_COLOR_BUFFER_BIT);
        
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    
    glfwTerminate();
    return 0;
}

这些代码只是创建了一个空白的窗口(我没有把自适应窗体大小的代码贴上去,那个在这里不重要)。其实这里面的OpenGL函数只有如下几个:

  • glViewport()
  • glClearColor()
  • glClear()

没错只有三个,那么你看到的这么多代码是做什么的呢?这些其他的代码,除了

1
2
3
if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
        cout<<"glad load failed"<<endl;
    }

这几行是glad库用于找到OpenGL函数的函数入口之外,其他的所有代码都是glfw库用来配置OpenGL环境和产生一个供OpenGL绘图的窗口的。所以我说OpenGL这个玩意只会画图,窗口什么的是glfw来做的。也就是说glfw其实不是OpenGL函数库里面的东西。他其实是一个GUI库。

但是一到绘图部分,就完全是OpenGL的函数了,包括清除屏幕的glClearColor(),glClear()函数都是OpenGL函数。

所以这一部分还是很迷惑人的。如果你使用SDL为OpenGL产生一个窗口的话,一样需要先配置OpenGL(指定版本号),然后创建一个兼容OpenGL的窗口,然后所有的绘图都交给OpenGL来处理。

所以说,OpenGL这个玩意其实不能单独使用,它必须有一个GUI库或者游戏引擎的支持才可以发挥它的实力(不然哪有地方给他绘图呢?)

注意:在使用gladLoadGLLoader之前你必须通过glfwMakeContextCurrent函数指定窗口。不然galdLoadGLLoader函数会返回错误。

updatedupdated2023-06-082023-06-08