1. 实例化glfw窗口
int main()
{
    glfwInit();//初始化glfw
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//配置glfw,第一个参数代表选项的名称,我们可以从很多以GLFW_开头的枚举值中选择;第二个参数接受一个整形,用来设置这个选项的值
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

    return 0;
}

    2. 创建窗口对象

GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);//窗口的宽和高作为它的前两个参数。第三个参数表示这个窗口的名称(标题)
if (window == NULL)
{
    std::cout << "Failed to create GLFW window" << std::endl;
    glfwTerminate(); //释放所有资源
    return -1;
}
glfwMakeContextCurrent(window);//通知glfw将该窗口的上下文设置为线程主上下文

    3. 初始化GLAD 管理OpenGL的函数指针

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
    std::cout << "Failed to initialize GLAD" << std::endl;
    return -1;
}

   glfwGetProcAddress 用来加载与系统相关的OpenGL函数指针地址的函数。

   4. 定义渲染窗口的尺寸大小

    glViewport(0,0,800,600); //设置窗口的维度 座标为(0,0)在左下角,宽度为800,高度为600 (单位为 像素)

    若要视口的大小随窗口的大小变化而变化,可通过注册一个回调函数(Callback Function)实现,函数原型如下“

void framebuffer_size_callback(GLFWwindow* window, int width, int height);

     这个帧缓冲大小函数需要一个GLFWwindow作为它的第一个参数,以及两个整数表示窗口的新维度。每当窗口改变大小,GLFW会调用这个函数并填充相应的参数供你处理。

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}

 

     注册函数:

    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    5.准备引擎

    渲染循环:

while(!glfwWindowShouldClose(window)) 
{//每次循环的开始前检查一次GLFW是否被要求退出
    glfwSwapBuffers(window);//检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)
    glfwPollEvents();    //检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)
}

    6. 输入

   

void processInput(GLFWwindow *window)
{
    if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)//一个窗口以及一个按键作为输入,函数将会返回这个按键是否正在被按下
        glfwSetWindowShouldClose(window, true);
}

  检查用户是否按下了返回键(Esc)(如果没有按下,glfwGetKey将会返回GLFW_RELEASE。如果用户的确按下了返回键,我们将通过glfwSetwindowShouldClose使用把WindowShouldClose属性设置为 true的方法关闭GLFW。下一次while循环的条件检测将会失败,程序将会关闭。

   7. 渲染

  • 我们要把所有的渲染(Rendering)操作放到渲染循环中,因为我们想让这些渲染指令在每次渲染循环迭代的时候都能被执行
// 渲染循环
while(!glfwWindowShouldClose(window))
{
    // 输入
    processInput(window);

    // 渲染指令
    ...

    // 检查并调用事件,交换缓冲
    glfwPollEvents();
    glfwSwapBuffers(window);
}

   glClear函数用来清空屏幕的颜色缓冲,它接受一个缓冲位(Buffer Bit)来指定要清空的缓冲,可能的缓冲位有GL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BITGL_STENCIL_BUFFER_BIT

glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//设置填充的颜色 
glClear(GL_COLOR_BUFFER_BIT);

 

 

 

posted on 2019-01-25 16:05  以奇渠  阅读(101)  评论(0)    收藏  举报