glfw编程指南

hunter_wyh 发布于2019-08-20 22:20:51 阅读数 261  收藏

展开

窗口对象

所述GLFWwindow对象封装二者的窗口和上下文。它们是使用glfwCreateWindow创建的,并使用glfwDestroyWindowglfwTerminate(如果有的话)进行销毁。由于窗口和上下文是不可分离地链接的,因此对象指针用作上下文和窗口句柄。

要查看提供给各种窗口相关回调的事件流,请运行events测试程序。

窗口创建

使用glfwCreateWindow创建一个窗口及其OpenGL或OpenGL ES上下文,该窗口返回创建的窗口对象的句柄。例如,这会创建一个640 x 480窗口模式窗口:

GLFWwindow * window = glfwCreateWindow(640,480,“My Title”,NULL,NULL);

如果窗口创建失败,NULL将返回,因此有必要检查返回值。

窗口句柄传递给所有与窗口相关的函数,并与所有输入事件一起提供,因此事件处理程序可以告知哪个窗口收到了事件。

全屏窗户

要创建全屏窗口,您需要指定窗口应使用的监视器。在大多数情况下,用户的主监视器是一个不错的选择。有关检索监视器的详细信息,请参阅检索监视器

GLFWwindow * window = glfwCreateWindow(640,480,“My Title”,glfwGetPrimaryMonitor(),NULL);

全屏窗户覆盖显示器的整个显示区域,没有边框或装饰。

通过使用glfwSetWindowMonitor设置监视器可以使窗口模式窗口全屏显示,并且可以通过使用相同的功能取消设置全屏窗口窗口。

GLFWvidmode结构的每个字段对应于函数参数或窗口提示,并组合以形成该窗口的所需视频模式。只要窗口具有输入焦点,就会为所选监视器设置与所需视频模式最匹配的支持视频模式。有关检索视频模式的详细信息,请参阅视频模式

视频模式字段

对应于

GLFWvidmode.width

widthglfwCreateWindow的参数

GLFWvidmode.height

heightglfwCreateWindow的参数

GLFWvidmode.redBits

GLFW_RED_BITS提示

GLFWvidmode.greenBits

GLFW_GREEN_BITS提示

GLFWvidmode.blueBits

GLFW_BLUE_BITS提示

GLFWvidmode.refreshRate

GLFW_REFRESH_RATE提示

有了全屏窗口,您可以使用glfwSetWindowMonitor更改其分辨率,刷新率和监视器。如果您只需要更改其分辨率,也可以调用glfwSetWindowSize。在所有情况下,新视频模式的选择方式与glfwCreateWindow选择的视频模式相同。如果窗口具有OpenGL或OpenGL ES上下文,则它将不受影响。

默认情况下,监视器的原始视频模式将被恢复,如果失去输入焦点,则窗口会显示图标,以允许用户切换回桌面。可以使用GLFW_AUTO_ICONIFY窗口提示禁用此行为,例如,如果您希望同时使用全屏窗口覆盖多个监视器。

如果监视器断开连接,则该监视器上全屏的所有窗口都将切换到窗口模式。有关更多信息,请参阅监视配置更改

“窗口全屏”窗口

如果所需视频模式的最接近匹配是当前视频模式,则视频模式将不会更改,从而使窗口创建更快,应用程序切换更顺畅。这有时称为窗口全屏无边框全屏窗口,并计为全屏窗口。要创建此类窗口,请请求当前视频模式。

const GLFWvidmode * mode = glfwGetVideoMode(monitor);

glfwWindowHint(GLFW_RED_BITS,mode- > redBits);

glfwWindowHint(GLFW_GREEN_BITS,mode- > greenBits);

glfwWindowHint(GLFW_BLUE_BITS,mode- > blueBits);

glfwWindowHint(GLFW_REFRESH_RATE,mode- > refreshRate);

GLFWwindow * window = glfwCreateWindow(mode- > width,mode- > height,“My Title”,monitor,NULL);

这也适用于全屏幕的窗口模式窗口。

const GLFWvidmode * mode = glfwGetVideoMode(monitor);

glfwSetWindowMonitor(window,monitor,0,0,mode- > width,mode- > height,mode- > refreshRate);

请注意,glfwGetVideoMode返回监视器的当前视频模式,因此如果您要在该监视器上有一个全屏窗口,您希望全屏窗口,则需要先保存桌面分辨率。

窗户破坏

当不再需要窗口时,使用glfwDestroyWindow将其销毁

glfwDestroyWindow(窗口);

窗户破坏总是成功的。在实际销毁之前,将删除所有回调,因此不会为窗口传递其他事件。调用glfwTerminate时剩余的所有窗口也会被销毁。

当全屏窗口被破坏时,其监视器的原始视频模式将恢复,但伽玛斜坡保持不变。

窗口创建提示

在创建窗口和上下文之前,可以设置许多提示。一些影响窗口本身,另一些影响帧缓冲或上下文。每次使用glfwInit初始化库时,这些提示都会设置为默认值。整数值提示可以分别与设置glfwWindowHint和字符串值的提示与glfwWindowHintString。您可以使用glfwDefaultWindowHints一次性将所有值重置为默认值。

一些提示是特定于平台的。这些在任何平台上设置始终有效,但它们只会影响其特定平台。其他平台会忽略它们。设置这些提示不需要特定于平台的标头或调用。

注意

在创建要获得指定属性的窗口和上下文之前,需要设置窗口提示。它们作为glfwCreateWindow的附加参数。

硬约束和软约束

一些窗口提示是硬约束。这些必须与窗口和上下文创建的可用功能完全匹配才能成功。非硬约束的提示尽可能匹配,但结果上下文和帧缓冲可能与这些提示所请求的不同。

以下提示始终是硬约束:

请求OpenGL上下文时,以下附加提示是硬约束,但在请求OpenGL ES上下文时会被忽略:

窗口相关的提示

GLFW_RESIZABLE指定窗口模式窗口是否可由用户调整大小。该窗口仍然可以使用glfwSetWindowSize函数调整大小。可能的值是GLFW_TRUE和GLFW_FALSE。对于全屏和未修饰的窗口,此提示将被忽略。

GLFW_VISIBLE指定窗口模式窗口最初是否可见。可能的值是GLFW_TRUE和GLFW_FALSE。全屏窗口会忽略此提示。

GLFW_DECORATED指定窗口模式窗口是否具有窗口装饰,例如边框,关闭窗口小部件等。未修饰的窗口将不会被用户调整,但仍允许用户在某些平台上生成关闭事件。可能的值是GLFW_TRUE和GLFW_FALSE。全屏窗口会忽略此提示。

GLFW_FOCUSED指定窗口模式窗口在创建时是否将被赋予输入焦点。可能的值是GLFW_TRUE和GLFW_FALSE。对于全屏和最初隐藏的窗口,此提示将被忽略。

GLFW_AUTO_ICONIFY指定全屏窗口是否会在输入焦点丢失时自动图标化并恢复先前的视频模式。可能的值是GLFW_TRUE和GLFW_FALSE。窗口模式窗口会忽略此提示。

GLFW_FLOATING指定窗口模式窗口是否将浮动在其他常规窗口之上,也称为最顶层或始终在顶部。这主要用于调试目的,不能用于实现正确的全屏窗口。可能的值是GLFW_TRUE和GLFW_FALSE。全屏窗口会忽略此提示。

GLFW_MAXIMIZED指定窗口模式窗口在创建时是否将最大化。可能的值是GLFW_TRUE和GLFW_FALSE。全屏窗口会忽略此提示。

GLFW_CENTER_CURSOR指定光标是否应该在新创建的全屏窗口上居中。可能的值是GLFW_TRUE和GLFW_FALSE。窗口模式窗口会忽略此提示。

GLFW_TRANSPARENT_FRAMEBUFFER指定窗口帧缓冲区是否透明。如果系统启用并支持,则窗口帧缓冲区alpha通道将用于将帧缓冲区与背景组合。这不会影响窗口装饰。可能的值是GLFW_TRUE和GLFW_FALSE。

GLFW_FOCUS_ON_SHOW指定窗口是否将获得输入焦点时glfwShowWindow被调用。可能的值是GLFW_TRUE和GLFW_FALSE。

GLFW_SCALE_TO_MONITOR指定是否应根据放置的任何监视器的监视器内容比例调整窗口内容区域的大小。这包括创建窗口时的初始放置。可能的值是GLFW_TRUE和GLFW_FALSE。

此提示仅对屏幕坐标和像素始终按1:1(如Windows和X11)映射的平台产生影响。在像macOS这样的平台上,帧缓冲区的分辨率会随窗口大小而改变。

帧缓冲相关提示

GLFW_RED_BITS,GLFW_GREEN_BITS,GLFW_BLUE_BITS,GLFW_ALPHA_BITS,GLFW_DEPTH_BITS和GLFW_STENCIL_BITS指定默认帧缓冲区的各种组件的所需位深度。值GLFW_DONT_CARE表示应用程序没有首选项。

GLFW_ACCUM_RED_BITS,GLFW_ACCUM_GREEN_BITS,GLFW_ACCUM_BLUE_BITS和GLFW_ACCUM_ALPHA_BITS指定累积缓冲区的各种组件的所需位深度。值GLFW_DONT_CARE表示应用程序没有首选项。

累积缓冲区是传统的OpenGL功能,不应在新代码中使用。

GLFW_AUX_BUFFERS指定所需的辅助缓冲区数。值GLFW_DONT_CARE表示应用程序没有首选项。

辅助缓冲区是传统的OpenGL功能,不应在新代码中使用。

GLFW_STEREO指定是否使用OpenGL立体渲染。可能的值是GLFW_TRUE和GLFW_FALSE。这是一个严格的约束。

GLFW_SAMPLES指定用于多重采样的所需样本数。零禁用多重采样。值GLFW_DONT_CARE表示应用程序没有首选项。

GLFW_SRGB_CAPABLE指定帧缓冲区是否应该支持sRGB。可能的值是GLFW_TRUE和GLFW_FALSE。

OpenGL:如果系统启用并支持,则GL_FRAMEBUFFER_SRGB启用将控制sRGB渲染。默认情况下,将禁用sRGB渲染。

OpenGL ES:如果系统启用并支持,则上下文将始终启用sRGB渲染。

GLFW_DOUBLEBUFFER指定帧缓冲区是否应该是双缓冲的。你几乎总是想要使用双缓冲。这是一个严格的约束。可能的值是GLFW_TRUE和GLFW_FALSE。

监控相关提示

GLFW_REFRESH_RATE指定全屏窗口所需的刷新率。值GLFW_DONT_CARE表示将使用最高可用刷新率。窗口模式窗口会忽略此提示。

上下文相关的提示

GLFW_CLIENT_API指定要为其创建上下文的客户端API。可能的值是GLFW_OPENGL_API,GLFW_OPENGL_ES_API和GLFW_NO_API。这是一个严格的约束。

GLFW_CONTEXT_CREATION_API指定用于创建上下文的上下文创建API。可能的值是GLFW_NATIVE_CONTEXT_API,GLFW_EGL_CONTEXT_API和GLFW_OSMESA_CONTEXT_API。这是一个严格的约束。如果未请求客户端API,则忽略此提示。

macOS:此平台上没有EGL API,使用它的请求将失败。

Wayland: EGL API 本机上下文创建API,因此该提示不起作用。

OSMesa:顾名思义,使用OSMesa创建的OpenGL上下文在交换缓冲区时不会更新窗口内容。使用OpenGL函数或OSMesa本机访问函数glfwGetOSMesaColorBufferglfwGetOSMesaDepthBuffer来检索帧缓冲内容。

注意

如果更改此提示,则假定其知道在给定平台上使用哪个上下文创建API的OpenGL扩展加载器库可能会失败。这可以通过glfwGetProcAddress加载来解决,glfwGetProcAddress总是使用所选的API。

错误:

在某些Linux系统上,在单个进程中通过本机和EGL API创建上下文将导致应用程序出现段错误。暂时坚持使用Linux上的一个API或另一个API。

GLFW_CONTEXT_VERSION_MAJOR和GLFW_CONTEXT_VERSION_MINOR指定创建的上下文必须兼容的客户端API版本。这些提示的确切行为取决于请求的客户端API。

注意

不要将这些提示混淆为GLFW_VERSION_MAJOR和GLFW_VERSION_MINOR,它们提供了GLFW标头的API版本。

OpenGL:这些提示不是硬约束,但如果创建的上下文的OpenGL版本小于请求的上限,则创建将失败。因此,对于遗留代码使用1.0版的默认值是完全安全的,并且在可用时仍然可以获得版本3.0及更高版本的向后兼容上下文。

虽然没有办法向驱动程序询问支持最高版本的上下文,但是当您要求版本1.0上下文时,GLFW将尝试提供此上下文,这是这些提示的默认值。

OpenGL ES:这些提示不是硬约束,但如果创建的上下文的OpenGL ES版本小于请求的上下文,则创建将失败。此外,如果请求2.0或更高版本,则无法返回OpenGL ES 1.x,反之亦然。这是因为OpenGL ES 3.x向后兼容2.0,但OpenGL ES 2.0不向后兼容1.x.

注意

macOS: OS仅支持OpenGL版本3.2及更高版本的前向兼容核心配置文件上下文。在创建版本3.2或更高版本的OpenGL上下文之前,必须相应地设置GLFW_OPENGL_FORWARD_COMPATGLFW_OPENGL_PROFILE提示。macOS上根本不支持OpenGL 3.0和3.1上下文。

GLFW_OPENGL_FORWARD_COMPAT指定OpenGL上下文是否应该是前向兼容的,即在所请求的OpenGL版本中不推荐使用所有功能的上下文。只有在请求的OpenGL版本为3.0或更高版本时才能使用此选项。如果请求OpenGL ES,则忽略此提示。

OpenGL参考手册中详细描述了向前兼容性。

GLFW_OPENGL_DEBUG_CONTEXT指定是否创建调试OpenGL上下文,该上下文可能具有其他错误和性能问题报告功能。可能的值是GLFW_TRUE和GLFW_FALSE。如果请求OpenGL ES,则忽略此提示。

GLFW_OPENGL_PROFILE指定要为其创建上下文的OpenGL配置文件。可能的值是GLFW_OPENGL_CORE_PROFILE或GLFW_OPENGL_COMPAT_PROFILE,或GLFW_OPENGL_ANY_PROFILE不请求特定配置文件之一。如果要求OpenGL版本低于3.2,则GLFW_OPENGL_ANY_PROFILE必须使用。如果请求OpenGL ES,则忽略此提示。

OpenGL配置文件在OpenGL参考手册中有详细描述。

GLFW_CONTEXT_ROBUSTNESS指定上下文使用的健壮性策略。这可以是一个GLFW_NO_RESET_NOTIFICATION或GLFW_LOSE_CONTEXT_ON_RESET,或GLFW_NO_ROBUSTNESS不要求鲁棒性策略。

GLFW_CONTEXT_RELEASE_BEHAVIOR指定上下文要使用的发布行为。可能的值之一GLFW_ANY_RELEASE_BEHAVIOR,GLFW_RELEASE_BEHAVIOR_FLUSH或GLFW_RELEASE_BEHAVIOR_NONE。如果行为是GLFW_ANY_RELEASE_BEHAVIOR,将使用上下文创建API的默认行为。如果行为是GLFW_RELEASE_BEHAVIOR_FLUSH,则只要上下文从当前上下文释放,管道就会被刷新。如果行为是GLFW_RELEASE_BEHAVIOR_NONE,则在发布时不会刷新管道。

GL_KHR_context_flush_control扩展名详细描述了上下文释放行为。

GLFW_CONTEXT_NO_ERROR指定是否应由上下文生成错误。可能的值是GLFW_TRUE和GLFW_FALSE。如果启用,则会产生错误的情况会导致未定义的行为。

GL_KHR_no_error扩展名详细描述了OpenGL和OpenGL ES的无错误模式。

macOS特定窗口提示

GLFW_COCOA_RETINA_FRAMEBUFFER指定是否在Retina显示器上使用全分辨率帧缓冲区。可能的值是GLFW_TRUE和GLFW_FALSE。这在其他平台上被忽略。

GLFW_COCOA_FRAME_NAME指定用于自动保存窗口框架的UTF-8编码名称,或者如果为空则禁用窗口的框架自动保存。这在其他平台上被忽略。这是使用glfwWindowHintString设置的。

GLFW_COCOA_GRAPHICS_SWITCHING指定是否在自动图形切换中,即允许系统为OpenGL上下文选择集成GPU,并在必要时在GPU之间移动它,或者是否强制它始终在离散GPU上运行。这仅影响具有集成和离散GPU的系统。可能的值是GLFW_TRUE和GLFW_FALSE。这在其他平台上被忽略。

更简单的程序和工具可能希望启用此功能以节省电量,而执行高级渲染的游戏和其他应用程序则希望将其禁用。

希望参与自动图形切换的捆绑应用程序也应该Info.plist通过将NSSupportsAutomaticGraphicsSwitching密钥设置为来声明它true。

X11特定的窗口提示

GLFW_X11_CLASS_NAME和GLFW_X11_INSTANCE_NAME指定所需的ASCII编码类和ICCCM WM_CLASS窗口属性的实例部分。这些是使用glfwWindowHintString设置的。

支持的和默认值

窗口提示

默认值

支持的值

GLFW_RESIZABLE

GLFW_TRUE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_VISIBLE

GLFW_TRUE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_DECORATED

GLFW_TRUE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_FOCUSED

GLFW_TRUE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_AUTO_ICONIFY

GLFW_TRUE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_FLOATING

GLFW_FALSE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_MAXIMIZED

GLFW_FALSE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_CENTER_CURSOR

GLFW_TRUE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_TRANSPARENT_FRAMEBUFFER

GLFW_FALSE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_FOCUS_ON_SHOW

GLFW_TRUE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_SCALE_TO_MONITOR

GLFW_FALSE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_RED_BITS

8

0到INT_MAX或GLFW_DONT_CARE

GLFW_GREEN_BITS

8

0到INT_MAX或GLFW_DONT_CARE

GLFW_BLUE_BITS

8

0到INT_MAX或GLFW_DONT_CARE

GLFW_ALPHA_BITS

8

0到INT_MAX或GLFW_DONT_CARE

GLFW_DEPTH_BITS

24

0到INT_MAX或GLFW_DONT_CARE

GLFW_STENCIL_BITS

8

0到INT_MAX或GLFW_DONT_CARE

GLFW_ACCUM_RED_BITS

0

0到INT_MAX或GLFW_DONT_CARE

GLFW_ACCUM_GREEN_BITS

0

0到INT_MAX或GLFW_DONT_CARE

GLFW_ACCUM_BLUE_BITS

0

0到INT_MAX或GLFW_DONT_CARE

GLFW_ACCUM_ALPHA_BITS

0

0到INT_MAX或GLFW_DONT_CARE

GLFW_AUX_BUFFERS

0

0到INT_MAX或GLFW_DONT_CARE

GLFW_SAMPLES

0

0到INT_MAX或GLFW_DONT_CARE

GLFW_REFRESH_RATE

GLFW_DONT_CARE

0到INT_MAX或GLFW_DONT_CARE

GLFW_STEREO

GLFW_FALSE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_SRGB_CAPABLE

GLFW_FALSE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_DOUBLEBUFFER

GLFW_TRUE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_CLIENT_API

GLFW_OPENGL_API

GLFW_OPENGL_API,GLFW_OPENGL_ES_API或GLFW_NO_API

GLFW_CONTEXT_CREATION_API

GLFW_NATIVE_CONTEXT_API

GLFW_NATIVE_CONTEXT_API,GLFW_EGL_CONTEXT_API或GLFW_OSMESA_CONTEXT_API

GLFW_CONTEXT_VERSION_MAJOR

1

所选客户端API的任何有效主要版本号

GLFW_CONTEXT_VERSION_MINOR

0

所选客户端API的任何有效次要版本号

GLFW_CONTEXT_ROBUSTNESS

GLFW_NO_ROBUSTNESS

GLFW_NO_ROBUSTNESS,GLFW_NO_RESET_NOTIFICATION或GLFW_LOSE_CONTEXT_ON_RESET

GLFW_CONTEXT_RELEASE_BEHAVIOR

GLFW_ANY_RELEASE_BEHAVIOR

GLFW_ANY_RELEASE_BEHAVIOR,GLFW_RELEASE_BEHAVIOR_FLUSH或GLFW_RELEASE_BEHAVIOR_NONE

GLFW_OPENGL_FORWARD_COMPAT

GLFW_FALSE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_OPENGL_DEBUG_CONTEXT

GLFW_FALSE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_OPENGL_PROFILE

GLFW_OPENGL_ANY_PROFILE

GLFW_OPENGL_ANY_PROFILE,GLFW_OPENGL_COMPAT_PROFILE或GLFW_OPENGL_CORE_PROFILE

GLFW_COCOA_RETINA_FRAMEBUFFER

GLFW_TRUE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_COCOA_FRAME_NAME

""

UTF-8编码的帧自动保存名称

GLFW_COCOA_GRAPHICS_SWITCHING

GLFW_FALSE

GLFW_TRUE 要么 GLFW_FALSE

GLFW_X11_CLASS_NAME

""

ASCII编码的WM_CLASS类名

GLFW_X11_INSTANCE_NAME

""

ASCII编码的WM_CLASS实例名称

窗口事件处理

请参阅事件处理

窗口属性和事件

用户指针

每个窗口具有可与设置用户指针glfwSetWindowUserPointer并用查询glfwGetWindowUserPointer。这可以用于您需要的任何目的,并且在窗口的整个生命周期内不会被GLFW修改。

指针的初始值是NULL。

窗口关闭和关闭标志

当用户尝试关闭窗口时,例如通过单击关闭窗口小部件或使用Alt + F4等关键字,可以设置窗口的关闭标记。然而,窗口实际上并没有被破坏,除非你注意这种状态变化,否则不会发生任何进一步的事情。

close标志的当前状态由glfwWindowShouldClose返回,可以使用glfwSetWindowShouldClose直接设置或清除。常见的模式是使用close标志作为主循环条件。

while(!glfwWindowShouldClose(window))

{

render(window);

glfwSwapBuffers(window);

glfwPollEvents();

}

如果您希望在用户尝试关闭窗口时收到通知,请设置关闭回调。

glfwSetWindowCloseCallback(window,window_close_callback);

在设置关闭标志直接调用回调函数。它可以用于过滤关闭请求并再次清除关闭标志,除非满足某些条件。

void window_close_callback(GLFWwindow * window)

{

if(!time_to_close)

glfwSetWindowShouldClose(window,GLFW_FALSE);

}

窗口大小

可以使用glfwSetWindowSize更改窗口的大小。对于窗口模式窗口,这将设置窗口的内容区域内容区域屏幕坐标中的大小。窗口系统可能对窗口大小施加限制。

glfwSetWindowSize(window,640,480);

对于全屏窗口,指定的大小将成为窗口所需视频模式的新分辨率。立即设置与新的所需视频模式最匹配的视频模式。调整窗口大小以适应设置视频模式的分辨率。

如果您希望在调整窗口大小时收到通知,无论是用户,系统还是您自己的代码,都要设置大小回调。

glfwSetWindowSizeCallback(window,window_size_callback);

当调整窗口大小时,回调函数以屏幕坐标接收窗口内容区域的新大小。

void window_size_callback(GLFWwindow * window,int width,int height)

{

}

还有glfwGetWindowSize用于直接检索窗口的当前大小。

Int width, height;

glfwGetWindowSize(width, height);

注意

不要将窗口大小传递给glViewport其他基于像素的OpenGL调用。窗口大小是屏幕坐标,而不是像素。对于基于像素的调用,请使用帧缓冲区大小(以像素为单位)。

上述功能适用于内容区域的大小,但装饰窗口通常具有围绕此矩形的标题栏和窗口框架。您可以使用glfwGetWindowFrameSize检索这些范围。

int left,top,right,bottom;

glfwGetWindowFrameSize(window,&left,&top,&right,&bottom);

返回值是屏幕坐标中从内容区域的边缘到整个窗口的相应边缘的距离。因为它们是距离而不是坐标,所以它们总是零或正。

帧缓冲区大小

虽然窗口的大小是以屏幕坐标测量的,但OpenGL使用像素。glViewport例如,您传入的大小应以像素为单位。在某些机器上,屏幕坐标和像素是相同的,但在其他机器上它们不会。还有第二组函数用于检索窗口的帧缓冲区的大小(以像素为单位)。

如果您希望在调整窗口的帧缓冲区时收到通知,无论是用户还是系统,都要设置大小回调。

glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);

回调函数在调整大小时接收帧缓冲的新大小,例如可以用于更新OpenGL视口。

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

{

glViewport(0,0,width,height);

}

还有glfwGetFramebufferSize用于直接检索窗口的帧缓冲区的当前大小。

Int width,height;

glfwGetFramebufferSize(window,&width,&height);

glViewport(0,0,width,height);

帧缓冲区的大小可以独立于窗口的大小而改变,例如,如果窗口在常规监视器和高DPI之间拖动。

窗口内容量表

可以使用glfwGetWindowContentScale检索窗口的内容比例。

float xscale,yscale;

glfwGetWindowContentScale(window,&xscale,&yscale);

内容比例是当前DPI与平台默认DPI之间的比率。这对于文本和任何UI元素尤为重要。如果按此缩放的UI的像素尺寸在您的计算机上看起来合适,则无论其DPI和缩放设置如何,它都应在其他计算机上以合理的大小显示。这依赖于系统DPI和缩放设置有些正确。

在每个监视器都有自己的内容比例的系统上,窗口内容比例将取决于系统认为窗口所在的监视器。

如果您希望在窗口的内容比例发生更改时收到通知,无论是因为系统设置更改还是因为它已移动到具有不同比例的监视器,请设置内容比例回调。

glfwSetWindowContentScaleCallback(window,window_content_scale_callback);

回调函数接收窗口的新内容比例。

void window_content_scale_callback(GLFWwindow * window,float xscale,float yscale)

{

set_interface_scale(xscale,yscale);

}

在像素和屏幕坐标始终以1:1映射的平台上,当窗口移动到具有不同内容比例的监视器时,需要调整窗口大小以显示相同的大小。要在创建窗口和稍后更改其内容比例时自动完成此操作,请设置GLFW_SCALE_TO_MONITOR窗口提示。

窗口大小限制

可以使用glfwSetWindowSizeLimits强制窗口模式窗口的内容区域的最小和最大大小。除非还设置了宽高比,否则用户可以将窗口的大小调整为指定限制内??的任何大小和宽高比。

glfwSetWindowSizeLimits(window,200,200,400,400);

要仅指定最小尺寸或仅指定最大尺寸,请将另一对设置为GLFW_DONT_CARE。

glfwSetWindowSizeLimits(window,640,480,GLFW_DONT_CARE,GLFW_DONT_CARE);

要禁用窗口的大小限制,请将它们全部设置为GLFW_DONT_CARE。

可以使用glfwSetWindowAspectRatio强制窗口模式窗口的内容区域的宽高比。除非还设置了大小限制,否则用户可以自由地调整窗口大小,但是将限制大小以保持宽高比。

glfwSetWindowAspectRatio(window,16,9);

宽高比指定为分子和分母,分别对应于宽度和高度。如果希望窗口保持其当前宽高比,请使用其当前大小作为比率。

int width, height;

glfwGetWindowSize(window, &width, &height);

glfwSetWindowAspectRatio(window, width, height);

要禁用窗口的宽高比限制,请将两个术语都设置为GLFW_DONT_CARE。

您可以为窗口设置大小限制和宽高比,但如果它们发生冲突,则结果不确定。

窗口位置

可以使用glfwSetWindowPos更改窗口模式窗口的位置。这会移动窗口,使其内容区域的左上角具有指定的屏幕坐标。窗口系统可能会限制窗口放置。

glfwSetWindowPos(window,100,100);

如果您希望在移动窗口时收到通知,无论是用户,系统还是您自己的代码,都要设置位置回调。

glfwSetWindowPosCallback(window,window_pos_callback);

当窗口移动时,回调函数在屏幕坐标中接收内容区域左上角的新位置。

void window_pos_callback(GLFWwindow * window,int xpos,int ypos)

{

}

还有glfwGetWindowPos用于直接检索窗口内容区域的当前位置。

int xpos,ypos;

glfwGetWindowPos(window,&xpos,&ypos);

窗口标题

所有GLFW窗口都有一个标题,虽然未装饰或全屏窗口可能无法显示或仅显示在任务栏或类似界面中。您可以使用glfwSetWindowTitle设置UTF-8编码的窗口标题。

glfwSetWindowTitle(窗口,“我的窗口”);

在函数返回之前复制指定的字符串,因此不需要保留它。

只要源文件编码为UTF-8,就可以直接在源中使用任何Unicode字符。

glfwSetWindowTitle(window,“ラストエグザイル”);

如果您使用的是C ++ 11或C11,则可以使用UTF-8字符串文字。

glfwSetWindowTitle(window,u8 “这总是一个UTF-8字符串”);

窗口图标

装饰窗户在某些平台上有图标。您可以通过使用glfwSetWindowIcon指定候选图像列表来设置此图标。

GLFWimageimages[2];

images [0] = load_icon(“my_icon.png”);

images [1] = load_icon(“my_icon_small.png”);

glfwSetWindowIcon(window,2,images);

图像数据是32位,小端,非预乘RGBA,即每通道8位,红色通道优先。从左上角开始,像素被规范地排列为连续的行。

要恢复默认窗口图标,请传入空图像阵列。

glfwSetWindowIcon(window,0,NULL);

窗口监视器

全屏窗口与特定监视器相关联。您可以使用glfwGetWindowMonitor获取此监视器的句柄

GLFWmonitor * monitor = glfwGetWindowMonitor(window);

此监视器句柄是glfwGetMonitors返回的句柄之一。

对于窗口模式窗口,此函数返回NULL。这是如何从窗口模式窗口告诉全屏窗口。

您可以使用glfwSetWindowMonitor在监视器之间或全屏和窗口模式之间移动窗口。在同一显示器或不同显示器上全屏显示窗口时,请指定所需的显示器,分辨率和刷新率。位置参数被忽略。

const GLFWvidmode * mode = glfwGetVideoMode(monitor);

glfwSetWindowMonitor(window,monitor,0,0,mode- > width,mode- > height,mode- > refreshRate);

使窗口窗口化时,请指定所需的位置和大小。刷新率参数将被忽略。

glfwSetWindowMonitor(window,NULL,xpos,ypos,width,height,0);

这将恢复任何先前的窗口设置,例如它是否已修饰,浮动,可调整大小,是否具有大小或宽高比限制等。要恢复最初窗口化为其原始大小和位置的窗口,请在将其设置为全屏之前保存这些窗口。然后如上所述传递它们。

窗口图标化

可以使用glfwIconifyWindow对 Windows进行图标化(即最小化)。

glfwIconifyWindow(window);

当图标化全屏窗口时,其监视器的原始视频模式将恢复,直到用户或应用程序恢复窗口。

可以使用glfwRestoreWindow恢复图标化窗口。此功能还可以从最大化恢复窗口。

glfwRestoreWindow(window);

恢复全屏窗口时,所需的视频模式也会恢复到其监视器。

如果您希望在窗口被图标化或恢复时收到通知,无论是用户,系统还是您自己的代码,请设置iconify回调。

glfwSetWindowIconifyCallback(window,window_iconify_callback);

回调函数接收窗口图标化状态的变化。

void window_iconify_callback(GLFWwindow* window, int iconified)

{

if (iconified)

{

// The window was iconified

}

else

{

// The window was restored

}

}

 

 

您还可以使用glfwGetWindowAttrib获取当前的图标化状态。

int iconified = glfwGetWindowAttrib(window,GLFW_ICONIFIED);

窗口最大化

可以使用glfwMaximizeWindow最大化Windows(即缩放)。

glfwMaximizeWindow(window);

全屏窗口无法最大化,将全屏窗口传递给此功能无效。

使用glfwRestoreWindow可以恢复最大化的窗口。此功能还可以从图标化中恢复窗口。

glfwRestoreWindow(window);

如果您希望在窗口最大化或恢复时收到通知,无论是用户,系统还是您自己的代码,请设置最大化回调。

glfwSetWindowMaximizeCallback(window,window_maximize_callback);

回调函数接收窗口最大化状态的变化。

void window_maximize_callback(GLFWwindow* window, int maximized)

{

if (maximized)

{

// The window was maximized

}

else

{

// The window was restored

}

}

 

您还可以使用glfwGetWindowAttrib获取当前最大化状态。

int maximized = glfwGetWindowAttrib(window,GLFW_MAXIMIZED);

默认情况下,新创建的窗口未最大化。您可以通过在创建窗口之前设置GLFW_MAXIMIZED窗口提示来更改此行为。

glfwWindowHint(GLFW_MAXIMIZED,GLFW_TRUE);

窗口可见性

可以使用glfwHideWindow隐藏窗口模式窗口。

glfwHideWindow(window);

这使得窗口对用户完全不可见,包括将其从任务栏,停靠栏或窗口列表中删除。无法隐藏全屏窗口,并且在全屏窗口上调用glfwHideWindow不会执行任何操作。

可以使用glfwShowWindow显示隐藏的窗口。

glfwShowWindow(window);

默认情况下,此功能还会将输入焦点设置为该窗口。设置GLFW_FOCUS_ON_SHOW窗口提示以更改所有新创建的窗口的此行为,或使用glfwSetWindowAttrib更改现有窗口的行为。

您还可以使用glfwGetWindowAttrib获取当前的可见性状态。

int visible = glfwGetWindowAttrib(window,GLFW_VISIBLE);

默认情况下,新创建的窗口是可见的。您可以通过在创建窗口之前设置GLFW_VISIBLE窗口提示来更改此行为。

glfwWindowHint(GLFW_VISIBLE,GLFW_FALSE);

在显示之前,隐藏的Windows对用户完全不可见。如果您需要在显示窗口之前进一步设置窗口,例如将窗口移动到特定位置,这将非常有用。

窗口输入焦点

Windows可以通过glfwFocusWindow获得输入焦点并带到前面。

glfwFocusWindow(window);

请记住,当窗口强制到顶部时,对用户来说可能会非常具有破坏性。要获得引起用户注意的破坏性较小的方式,请参阅注意请求

如果您希望在窗口获得或失去输入焦点时收到通知,无论是用户,系统还是您自己的代码,请设置焦点回调。

glfwSetWindowFocusCallback(window,window_focus_callback);

回调函数接收窗口的输入焦点状态的变化。

void window_focus_callback(GLFWwindow* window, int focused)

{

if (focused)

{

// The window gained input focus

}

else

{

// The window lost input focus

}

}

 

您还可以使用glfwGetWindowAttrib获取当前输入焦点状态。

int focused = glfwGetWindowAttrib(window,GLFW_FOCUSED);

默认情况下,新创建的窗口将获得输入焦点。您可以通过在创建窗口之前设置GLFW_FOCUSED窗口提示来更改此行为。

glfwWindowHint(GLFW_FOCUSED,GLFW_FALSE);

窗口注意请求

如果您希望在不中断的情况下通知用户事件,可以通过glfwRequestWindowAttention请求注意。

glfwRequestWindowAttention(window);

系统将突出显示指定的窗口,或者在不支持此窗口的平台上,整个应用程序。一旦用户注意到,系统将自动结束请求。

窗户损坏和刷新

如果您希望在窗口内容损坏并需要刷新时收到通知,请设置窗口刷新回调。

glfwSetWindowRefreshCallback(m_handle,window_refresh_callback);

当需要刷新窗口的内容时,将调用回调函数。

void window_refresh_callback(GLFWwindow * window)

{

draw_editor_ui(window);

glfwSwapBuffers(window);

}

注意

在合成窗口系统(如Aero,Compiz或Aqua)上,窗口内容保存在屏幕外,此回调可能仅在调整窗口或帧缓冲区时调用。

窗口透明度

GLFW支持两种窗口透明度; framebuffer透明度和整个窗口透明度。单个窗口可能不使用这两种方法。这样做的结果是不确定的。

这两种方法都需要平台来支持它,而不是GLFW支持的每个平台的每个版本都这样做,所以有机制来检查窗口是否真的是透明的。

使用GLFW_TRANSPARENT_FRAMEBUFFER窗口提示,可以在每像素每帧的基础上使窗口帧缓冲区透明。

glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER,GLFW_TRUE);

如果系统支持,则窗口内容区域将使用帧缓冲区每像素alpha通道与背景合成。这需要在系统上启用桌面合成。它不会影响窗户装饰。

您可以使用GLFW_TRANSPARENT_FRAMEBUFFER窗口属性检查窗口帧缓冲是否已成功透明。

if(glfwGetWindowAttrib(window,GLFW_TRANSPARENT_FRAMEBUFFER))

{

// window framebuffer目前是透明的

}

GLFW附带了一个启用帧缓冲透明度的示例gears。

可以使用glfwSetWindowOpacity设置整个窗口的不透明度,包括任何装饰。

glfwSetWindowOpacity(window,0.5f);

不透明度(或alpha)值是0和1之间的正有限数,其中0(零)是完全透明的,1(一)是完全不透明的。新创建的窗口的初始不透明度值为1。

可以使用glfwGetWindowOpacity查询窗口的当前不透明度。

float opacity = glfwGetWindowOpacity(window);

如果系统不支持整个窗口透明度,则此函数始终返回一个。

GLFW附带一个测试程序,可让您在调用的运行时控制整个窗口的透明度opacity。

窗口属性

Windows具有许多可以使用glfwGetWindowAttrib返回的属性。一些反映可能由于用户交互而改变的状态(例如,它是否具有输入焦点),而另一些反映了窗口的固有属性(例如,它具有什么样的边界)。有些与窗口有关,有些则与OpenGL或OpenGL ES上下文有关。

if(glfwGetWindowAttrib(window,GLFW_FOCUSED))

{

//窗口有输入焦点

}

GLFW_DECORATED,GLFW_RESIZABLE,GLFW_FLOATING,GLFW_AUTO_ICONIFYGLFW_FOCUS_ON_SHOW窗口的属性可以被改变glfwSetWindowAttrib

glfwSetWindowAttrib(window,GLFW_RESIZABLE,GLFW_FALSE);

窗口相关属性

GLFW_FOCUSED指示指定的窗口是否具有输入焦点。有关详情,请参见窗口输入焦点

GLFW_ICONIFIED指示指定的窗口是否已图标化。有关详细信息,请参见窗口图标

GLFW_MAXIMIZED指示指定的窗口是否已最大化。有关详细信息,请参阅Window maximization

GLFW_HOVERED指示光标当前是否直接位于窗口的内容区域上,而其间没有其他窗口。有关详细信息,请参阅光标输入/离开事件

GLFW_VISIBLE指示指定的窗口是否可见。有关详情,请参阅窗口可见

GLFW_RESIZABLE指示指定的窗口是否可以改变大小由用户。这可以在创建之前使用GLFW_RESIZABLE窗口提示设置,也可以在使用glfwSetWindowAttrib之后设置

GLFW_DECORATED指示指定的窗口是否具有边框,关闭窗口小部件等装饰。这可以在使用GLFW_DECORATED窗口提示创建之前或使用glfwSetWindowAttrib之后设置

GLFW_AUTO_ICONIFY指示指定的全屏窗口是否在焦点丢失,关闭窗口小部件等图标化。这可以在创建之前使用GLFW_AUTO_ICONIFY窗口提示或使用glfwSetWindowAttrib设置

GLFW_FLOATING指示指定的窗口是否为浮动,也称为最顶层或始终在顶部。这可以在使用GLFW_FLOATING窗口提示创建之前设置,也可以在使用glfwSetWindowAttrib之后设置

GLFW_TRANSPARENT_FRAMEBUFFER指示指定窗口是否具有透明帧缓冲区,即窗口内容是使用窗口帧缓冲区alpha通道与背景合成的。请参阅窗口透明度了解详情

GLFW_FOCUS_ON_SHOW指定窗口是否将获得输入焦点时glfwShowWindow被调用。这可以在创建之前使用GLFW_FOCUS_ON_SHOW窗口提示或使用glfwSetWindowAttrib之后设置

上下文相关属性

GLFW_CLIENT_API表示窗口上下文提供的客户端API; 要么GLFW_OPENGL_API,GLFW_OPENGL_ES_API或GLFW_NO_API。

GLFW_CONTEXT_CREATION_API指示用于创建窗口上下文的上下文创建API; 要么GLFW_NATIVE_CONTEXT_API,GLFW_EGL_CONTEXT_API或GLFW_OSMESA_CONTEXT_API。

GLFW_CONTEXT_VERSION_MAJOR,GLFW_CONTEXT_VERSION_MINOR和GLFW_CONTEXT_REVISION指示窗口上下文的客户端API版本。

注意

不要将这些属性混淆GLFW_VERSION_MAJOR,GLFW_VERSION_MINOR并GLFW_VERSION_REVISION提供GLFW标头的API版本。

GLFW_OPENGL_FORWARD_COMPAT是GLFW_TRUE窗口的上下文是否是OpenGL前向兼容的上下文GLFW_FALSE。

GLFW_OPENGL_DEBUG_CONTEXT是GLFW_TRUE窗口的上下文是OpenGL调试上下文,还是GLFW_FALSE其他。

GLFW_OPENGL_PROFILE表示上下文使用的OpenGL配置文件。这是GLFW_OPENGL_CORE_PROFILE或者GLFW_OPENGL_COMPAT_PROFILE如果上下文使用已知的配置文件,或者GLFW_OPENGL_ANY_PROFILEOpenGL配置文件未知或上下文是OpenGL ES上下文。请注意,返回的配置文件可能与上下文标志的配置文件位不匹配,因为当没有设置位时,GLFW将尝试其他方法来检测配置文件。

GLFW_CONTEXT_ROBUSTNESS指示上下文使用的健壮性策略。这是GLFW_LOSE_CONTEXT_ON_RESET或者GLFW_NO_RESET_NOTIFICATION如果窗口的上下文支持鲁棒性或GLFW_NO_ROBUSTNESS其他。

Framebuffer相关属性

GLFW不公开默认帧缓冲区的属性(即附加到窗口的帧缓冲区),因为可以使用OpenGL,Op??enGL ES或Vulkan直接查询这些属性。

如果您使用的是OpenGL或OpenGL ES 3.0或更高版本,该glGetFramebufferAttachmentParameteriv函数可用于检索红色,绿色,蓝色,alpha,深度和模板缓冲通道的位数。否则,glGetIntegerv可以使用该功能。

始终检索MSAA样本的数量glGetIntegerv。对于支持帧缓冲对象的上下文,返回当前绑定的帧缓冲区的样本数。

属性

glGetIntegerv

glGetFramebufferAttachmentParameteriv

红点

GL_RED_BITS

GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE

绿色位

GL_GREEN_BITS

GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE

蓝色位

GL_BLUE_BITS

GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE

Alpha位

GL_ALPHA_BITS

GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE

深度位

GL_DEPTH_BITS

GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE

模板位

GL_STENCIL_BITS

GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE

MSAA样本

GL_SAMPLES

此功能不提供

调用时glGetFramebufferAttachmentParameteriv,将从中查询红色,绿色,蓝色和alpha尺寸GL_BACK_LEFT,同时分别从GL_DEPTH和GL_STENCIL附件查询深度和模板尺寸。

缓冲交换

默认情况下,GLFW窗口是双缓冲的。这意味着你有两个渲染缓冲区; 前缓冲区和后缓冲区。前缓冲区是正在显示的缓冲区,后缓冲区是您渲染的缓冲区。

渲染整个帧时,是时候交换后面和前面的缓冲区,以显示已渲染的内容并开始渲染新帧。这是通过glfwSwapBuffers完成的。

glfwSwapBuffers(window);

有时选择何时进行缓冲区交换会很有用。使用函数glfwSwapInterval,可以在交换缓冲区之前从glfwSwapBuffers调用时选择驱动程序等待的最小监视器刷新次数:

glfwSwapInterval(1);

如果间隔为零,则在调用glfwSwapBuffers时立即进行交换,而不等待刷新。否则,至少间隔回溯将在每个缓冲区交换之间传递。当不希望测量等待垂直回扫所花费的时间时,使用零交换间隔对于基准测试目的是有用的。但是,交换间隔为1可以避免撕裂。

请注意,这可能不适用于所有计算机,因为某些驱动程序具有用户控制的设置,可覆盖应用程序请求的任何交换间隔。

支持WGL_EXT_swap_control_tear或GLX_EXT_swap_control_tear扩展的上下文也接受交换间隔,这允许驱动程序立即交换,即使帧到达稍晚。这会增加可见撕裂的风险,从而提高帧速率的稳定性。您可以使用glfwExtensionSupported检查这些扩展名

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值