【笔记】跟着LearnOpenGL自说自话地学习OpenGL(二)

继续上一篇的笔记,教材中窗口创建部分还有两个东西延伸,一个是改变绘制窗口背景的颜色,一个是获取键盘输入,按下Esc键退出程序。OK,先把这部分过一遍,然后再结合起来做个小玩意,上下左右对应四个颜色对这个窗口程序的背景颜色进行切换

第一,获取键盘输入,Esc退出

在整个大循环的进行调用

void processInput(GLFWwindow *window)

{

if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)

{

glfwSetWindowShouldClose(window, true);

}

}

 

while (!glfwWindowShouldClose(window))

{

processInput(window);

 

glfwSwapBuffers(window);

glfwPollEvents();

}

 

 

第二,修改绘制的窗口背景颜色

在大循环中加入了两行代码

glClearColor(0.2f, 0.3f, 0.3f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

教程中对这两行有这样的描述,“除了glClear之外,我们还调用了glClearColor来设置清空屏幕所用的颜色。当调用glClear函数,清除颜色缓冲之后,整个颜色缓冲都会被填充为glClearColor里所设置的颜色”

嗯……设置颜色缓存然后填充颜色?(仔细读了两遍,看起来不太聪明的样子)

while (!glfwWindowShouldClose(window))

{

processInput(window);

 

glClearColor(0.2f, 0.3f, 0.3f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

 

glfwSwapBuffers(window);

glfwPollEvents();

}

 

添加了这一部分之后也达到了想要的效果了,一个墨绿色窗口就有了

 

截止目前,LearnOpenGL的《你好,窗口》章节我就看完了。

但是就这样完了吗?

NONONO,

还有想根据输入改变背景色的操作要做

 

从上文来看,设置颜色用的是这个glClearColor,百度了一下

使用红,绿,蓝以及AFA值来清除颜色缓冲区的,并且都被归一化在(0,1)之间的值,其实就是清空当前的所有颜色,红,绿,蓝和AFA值是在颜色缓冲区被清除之后使用的

于是乎上下左右四个按键分别对应一下吧

↑     glClearColor(1.0f, 1.0f, 1.0f, 1.0f);   白

↓     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);   红

←   glClearColor(0.0f, 1.0f, 0.0f, 1.0f);   绿

→   glClearColor(0.0f, 0.0f, 1.0f, 1.0f);   蓝

那这部分就以ifelse形式写入刚刚用过的获取键盘输入void processInput(GLFWwindow *window)增加分支,以此类推

if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)

{

glfwSetWindowShouldClose(window, true);

}

else if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS)

{

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

}

 

同时需要做一点调整,把最初的glClearColor(0.2f, 0.3f, 0.3f, 1.0f);墨绿色放到循环以外,让程序首次加载的时候就成为默认色,然后进入循环直到我们触发键盘按键的时候去把颜色缓存修改让glClear继续绘制,像这样

 

同时每次按键做一点打印看看效果

 

发现没有?虽然改变颜色的效果达到了,但是这玩意打印这么多次呀,说明我这个里面是多次调用了,那可不行,我只按了一下呀,接着百度看看有啥好办法

百度说要用回调函数,这样可以是监听回调事件而不是在while循环里逐帧执行,嗯,可以理解,这个while循环中实际是每秒执行N多次的,那就试试吧

上次改变窗口大小我用的是这个函数glfwSetFramebufferSizeCallback来实现回调,那关于键盘输入的回调,查了一下是这个,glfwSetKeyCallback(window,key_callback);

key_callback则是我需要自己定义的函数,那么这种函数的规则可以直接用IDE来查看一下

 

 

OK,那么这部分我自定义的函数需要满足这个GLFWkeyfun定义的结构,需要输入五个参数,这四个int我倒是没有用到啦,GLFWwindow本身就是现成的,于是就这样写一下吧,跑一下看看效果

 

 

嗯,感觉就是我想要的样子嘞

关于窗口部分的内容,差不多先写到这吧,下次开始真正的画图形了。

告辞!

参考资料:LearnOpenGL--你好,窗口

https://learnopengl-cn.github.io/01%20Getting%20started/03%20Hello%20Window/