OpenGL学习笔记_03

文章只作学习使用,大部分内容来自LearnOpenGL CN你好,窗口 - LearnOpenGL CN (learnopengl-cn.github.io)https://learnopengl-cn.github.io/01%20Getting%20started/03%20Hello%20Window/#_1其中个人理解均为此颜色

目录

GLFW

​​​​​GLEW

游戏循环

最后一件事

输入

渲染


首先测试一下GLFW能不能正常工作,新建一个.cpp文件,把下面的代码粘贴到该文件的最前面。

#include <GL/glew.h>
#include <GLFW/glfw3.h>

我们要注意顺序,因为GLEW里包含了正确的OpenGL文件,所以它的头文件要在其它依赖OpenGL的头文件之前。 

GLFW

接下来我们创建main函数,在这个函数中我们将会实例化GLFW窗口:

int main()
{
    //初始化GLFW
    glfwInit(); 
    //设置OpenGL主版本号
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    //设置OpenGL副版本号
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    //设置OpenGL模式
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    //设置窗口是否可调整大小
    glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
 
    return 0;
}

//int glwfInit();
/*这个函数用于初始化GLFW,如果初始化成功将会返回GLFW_TRUE,否则返回GLFW_FALSE(GLFW_TRUE和 
  GLFW_FALSE是GLFW定义的常量,被定义为于1和0)*/

//void glfwWindowHint(int hint, int value);
/*​​​​​​​这个函数可以设置一些关于窗口的选项。glfwWindowHint()接受两个参数,第一个是我们要设置的hint的名 
  字,使用GLFW常量(以GLFW_开头)指定;第二个是我们要把该hint设置成的值,该值随要设置的hint而 
  异。*/

​​​​​接下来我们创建一个窗口对象,这个窗口对象存放了所有和窗口相关的数据,而且会被GLFW的其他函数频繁地用到。 

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);

//​GLFWwindow* glfwCreateWindow(int width, int height, const char *title, GLFWmonitor *monitor, GLFWwindow *share)
/*参数:前两个参数是窗口的宽和高,以像素为单位;第三个是窗口标题;第四个参数与是否全屏有关,NULL是窗口化;第五个参数先不考虑。
  返回:glfwCreateWindow()将会使用前面glfwWindowHint()所设置的hint创建窗口,返回一个GLFWwindow指针,我们把这个指针叫做窗口句柄(window handle)。简单说来,就是从此以后我们都用它来代表我们的窗口。如果创建窗口出现问题,将返回NULL。*/

//void glfwTerminate()
/*这个函数会销毁任何残留的窗口以及释放由GLFW分配的其他任何资源。在此调用之后,如果你想再次使用GLFW函数,需要再一次初始化GLFW。 */

//void glfwMakeContextCurrent(GLFWwindow *window)
/*使指定窗口的上下文成为当前线程上的上下文。*/

​

​​​​​GLEW

GLFW设置完毕后,还需要初始化GLEW:

glewExperimental = GL_TRUE;
if (glewInit())
{
    cout << "Failed to init GLEW!\n";
    return -1;
}

//glewInit() 用于初始化GLEW,成功返回0,失败返回1,与GLFW相反。

因为glewInit函数的返回值相反,所以我们要把glewExperimental的值改为GL_TRUE。

游戏循环

和控制台程序不同,我们希望这个程序可以一直运行,直到用户关闭窗口。这样我们就需要创建一个循环,叫做游戏循环(game loop)。

while (!glfwWindowShouldClose(window))
{
    glfwSwapBuffers(window);
    glfwPollEvents();
}

//int glfwWindowShouldClose(GLFWwindow *window)
/*返回指定的窗口有没有被关闭*/

//void glfwSwapBuffers(GLFWwindow *window)
/*交换指定窗口的前后缓冲区*/

//void glfwPollEvents()
/*用来检查是否有事件被触发,例如点击关闭按钮、点击鼠标、按下键盘等等。如果有,GLFW将会对这些事进行处理。*/

双缓冲:因为绘制一般不是一下子就绘制完毕的,所以一般会使用双缓冲。即程序在后缓冲上绘制,绘制完毕后,交换前后缓冲区。

GLFW自己会记录每个键、鼠标键的状态(按下/没有按下),但是GLFW不会自动更新状态,必须调用glfwPollEvents()才能更新。调用glfwPollEvents()时会检查状态是否有变化,如果有就会更新该状态。如果设置了回调函数,还会调用相应的回调函数。如果不调用这个函数,不仅无法检测输入,我们在点击窗口右上角的X时,GLFW也不会知道需要关闭窗口。所以必须在每一轮游戏循环中调用这个函数。

最后一件事

最后,当循环执行完毕后,我们需要释放前面所申请的资源:

glfwTerminate();
return 0;

glfwTerminate()将会释放所有GLFW资源,关闭当前窗口。然后程序就成功退出了。

现在运行你的程序,如果你得到了一个黑色窗口,恭喜你,成功了!

输入

我们同样也希望能够在GLFW中实现一些输入控制,这可以通过使用GLFW的几个输入函数来完成。我们创建一个processInput函数来让所有的输入代码保持整洁。

void processInput(GLFWwindow *window)
{
   //检测ESC是否被按下
   if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        //关闭GLFW
        glfwSetWindowShouldClose(window, true);
}

//int glfwGetKey(GLFWwindow *window, int Key)
/*检测特定窗口按键的状态,比如GLFW_PRESS和GLFW_RELEASE*/

我们接下来在渲染循环的每一个迭代中调用processInput:

while (!glfwWindowShouldClose(window))
{
    processInput(window);

    glfwSwapBuffers(window);
    glfwPollEvents();
}

这就给我们一个非常简单的方式来检测特定的键是否被按下,并在每一帧做出处理。

渲染

我们要把所有的渲染(Rendering)操作放到渲染循环中,因为我们想让这些渲染指令在每次渲染循环迭代的时候都能被执行。代码将会是这样的:

// 渲染循环
while(!glfwWindowShouldClose(window))
{
    // 输入
    processInput(window);

    // 渲染指令
    ...

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

渲染指令: 

//一个状态设置函数,给状态获得一个自定义的颜色
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
//清空缓冲,一个状态使用的函数,它使用了当前的状态来获取应该清除为的颜色。
glClear(GL_COLOR_BUFFER_BIT);


//glClear可以清除GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT类型的缓冲。

我们用glClearColor设置状态:设置了清除屏幕的时候使用的颜色。所以当我们用glClear清除颜色缓冲之后,状态的颜色变成了我们设置的颜色

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值