仅为 window 的一部分创建 Vulkan 表面

Create Vulkan surface for only a portion of a window

我们有一个 window 顶部有水平工具栏的应用程序。我们传递给 Vulkan 以创建表面的 windows 级句柄最终包括工具栏后面的区域,即 Vulkan 完全不知道工具栏,表面包括它“后面”的 space。

我的问题是,一个表面可以只代表这个 window 的一部分吗?我们显然不需要处理位于工具栏后面的像素的数据,因此希望避免创建比必要更大的帧缓冲区、深度缓冲区等。

我完全理解我可以使用视口以视觉方式完成此操作,例如有原点偏移和高度补偿,但据我了解,即使我只渲染到window 的一部分。然后帧缓冲区被“映射”并因此被挤压到视口区域。

所有这些让我想知道视口的用途是什么。如果它只是简单地定义从图像缓冲区到表面区域的映射,那么如果您的帧缓冲区包含比它映射到的区域多得多的像素,那么效率是不是非常低?使用例如,而不是应用程序中的部分部分是否没有意义?首先使用不同的 windows HWND,然后再创建不同的表面?

如何避免渲染到比需要更大的区域?

几乎每个应用程序的处理方式是 window 的客户区(即:不是工具栏之类的东西)是 window 的子级主框架window。调整框架大小时,调整客户端 window 的大小以匹配新的客户区(考虑到 toolbars/etc 的新尺寸)。

应该为这个客户端 window 创建一个 Vulkan 表面。