继续上一篇的笔记,教材中窗口创建部分还有两个东西延伸,一个是改变绘制窗口背景的颜色,一个是获取键盘输入,按下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/