Horde3D是基于 opengl的 次世代,轻量级渲染引擎。
glfw 这个开源库是一个很好便捷 opengl创建窗口的库, 它创建一个 opengl 上下文的窗口,并可以接收窗口输入事件
关于 glfw 创建窗口的demo,可以参考:http://www.glfw.org/documentation.html
首先,分析Horde3D 用glfw创建窗口的方式
1
头文件添加, #include "glfw.h"
2
初始化 glfw库
glfwInit();
3
设置输入模式为 STICK 模式
glfwEnable(GLFW_STICKY_KEYS);
功能:
这种模式能检测到最新输入状态,并立即更新。 在glfw3版本中,这种方法被 替换为 glfwSetInputMode(window, GLFW_STICKY_KEYS, 1)
它防止了一些即时状态的丢失
4
创建窗口
bool
setupWindow(int width, int height, bool fullscreen);
该函数里封装了 创建窗口,设置窗口事件监听事件等 功能:
4.1
glfwOpenWindow(width, height, 8, 8, 8, 8, 24, 8, fullscreen?GLFW_FULLSCREEN:GLFW_WINDOW)
参数1-2: 窗口的宽高
参数3-8: 颜色rgba的bit大小,以及depth buffer bit 和stencil buffer bit的大小
参数9: 设置全屏模式
功能:
它创建了一个可以显示位图的窗口,分配相应的buffer。 在glfw3版本中,这种方法被替换成了GLFWwindow *glfwCreateWindow(int wight, int height, const char *title, GLFWmonitor *monitor, GLFWwindow *share)
4.2 禁止
vertical synchronization
glfwSwapInterval(0);
参数: glfwSwapBuffers操作之间,屏幕需要等待更新的次数
什么是vertical synchronization?
它是用来防止屏幕撕裂现象的
Screen tearing
Screen tearing 引起的原因是:
简单的说是,GPU往屏幕渲染的帧率大于屏幕刷新的帧率,也就是 说,当屏幕绘制(刷新)一帧到中间时, GPU已经向屏幕输送了好几帧,而屏幕会继续绘制(刷新),但这时用的数据是GPU向屏幕更新的数据。 这样就
导致的屏幕撕裂的问题。 它也并不是GPU比屏幕刷新的快, 总体来说,如果GPU的刷新率不是屏幕刷新率的倍数,那么就会出现撕裂的问题, 而解决这种问题的方式,就是 v-sync
V-sync:
Vertical synchronization 是 大多数系统的一个选项。 它是防止显卡想显存输送数据,直到屏幕刷新完当前帧为止。
在Vertical blanking interval的时间里,驱动会命令显卡 要么 快速的复制离屏区域到 激活现实区域里,俗称 double buffering,要么两个buffer都是可以现实的,然后再前后buffer之间切换,即 page flipping
4.3 实现监听设置
....
glfwSet开头的API设置 窗口关闭,键盘按键响应,以及鼠标键回调事件
4.4 设置窗口标题
glfwSetWindowTitle(app->getTitle());
参数: char *
4.5 其它一些api
glfwTerminate() 终止窗口, 当推出游戏时或者创建窗口
glfwCloseWindow(),关闭窗口
glfwDisable 关闭一些功能,如GLFW_MOUSE_CURSOR 取消鼠标标识显示
glfwGetTime() 获取当前时间
glfwSwapBuffers() 交换前后buffer