首页 > 解决方案 > 仅为窗口的一部分创建 Vulkan 表面

问题描述

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

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

我完全理解我可以使用具有原点偏移和高度补偿的视口在视觉上完成此操作,但是据我了解,帧缓冲区实际上仍然包含表面全尺寸的像素信息(例如 800x600 用于 800x600 客户区域窗口),即使我只渲染到该窗口的一部分。然后帧缓冲区被“映射”并因此被压缩到视口区域。

所有这些都让我想知道视口的用途是什么。如果它只是定义了从图像缓冲区到表面区域的映射,那么如果帧缓冲区包含的像素比它被映射到的区域多得多,那不是非常低效吗?在你的应用程序中使用不同的窗口HWNDs FIRST,然后从那时起创建不同的表面是否没有意义?

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

标签: cvulkan

解决方案


几乎每个应用程序的处理方式是窗口的客户区(即:不是工具栏等的东西)是主框架窗口的子窗口。当框架调整大小时,您调整客户端窗口的大小以匹配新的客户区(考虑到工具栏/等的新大小)。

正是这个客户端窗口应该有一个为其创建的 Vulkan 表面。


推荐阅读