【问题标题】:Create Vulkan surface for only a portion of a window仅为窗口的一部分创建 Vulkan 表面
【发布时间】:2021-08-13 06:03:12
【问题描述】:

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

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

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

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

如何避免渲染到超出必要的区域?

【问题讨论】:

  • stackoverflow.com/questions/68536118/… 的副本。我不完全理解这个问题。大多数窗口系统中“窗口”的定义几乎是原子不可分割的部分。你不能有一个窗口的一部分的表面,因为“表面”是“窗口”。只是同一事物的不同名称。如果你想拆分它,那为什么不干脆做两个窗口呢?
  • @krOoze 你是对的 - 我确实误解了一些现在对我来说更清楚的事情。感谢您的帮助!

标签: c vulkan


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多