【问题标题】:vulkan x and y switchedvulkan x 和 y 切换
【发布时间】:2019-03-02 10:36:30
【问题描述】:

我正在使用 android NDK Vulkan API 为 android 开发游戏。代码大部分是用 C++14 编写的。在大多数情况下,一切正常,但是,在某些设备上,我遇到了 x 和 y 坐标切换的问题。我在我认为的屏幕顶部绘制,它在侧面绘制对象。此外,当我对视点(视图矩阵)进行任何操作时,x 和 y 会反转。如果我沿 x 方向移动视点,它实际上会沿 y 方向移动。

此外,交换链报告的宽度和高度也是相反的。因此,如果我将这些值插入到透视矩阵中,如下所示:

glm::perspective(glm::radians(60.0f), swapchainRetrievedWidth / (float) swapchainRetrievedHeight, 0.1f, 10.0f);

它会画出严重倾斜的物体。但是如果我反转宽度和高度,像这样:

glm::perspective(glm::radians(60.0f), swapchainRetrievedHeight / (float) swapchainRetrievedWidth, 0.1f, 10.0f);

物体看起来不错。

发生这种情况的设备使用 Adreno 530,API 版本 1.0.49,驱动程序版本:35.143.1455,操作系统:android 8.0,手机供应商:HTC。对于此设备,仅当设备使用分屏模式且设备处于横向(应用程序强制纵向模式)时才会出现这些症状。我在其他设备和全屏(非分屏)模式下也看到过这种情况。所以,我不认为这是我在屏幕尺寸改变时重新初始化交换链、管道、深度缓冲区、渲染通道和命令缓冲区的方式。由于在全屏模式下出现此问题的设备的屏幕不会改变大小。

我做错了吗?有错误吗?我愿意就这个问题提供更多信息,但不知道需要什么。

我在 OpenGLES 2.0 中在相同设备上的相同情况下尝试了相同的操作,但没有出现这些症状。感谢大家的支持和帮助。

【问题讨论】:

  • 什么是 VkSurfaceCapabilitiesKHR::currentTransform,您将 VkSwapchainCreateInfoKHR::preTransform 设置为什么?
  • @JesseHall 所以,我将 VkSwapchainCreateInfoKHR::preTransform 设置为 VkSurfaceCapabilitiesKHR::currentTransform,但没有注意到 VkSurfaceCapabilitiesKHR::currentTransform 设置为 VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR。这显然是导致问题的原因,当我将 VkSwapchainCreateInfoKHR::preTransform 设置为 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR 时,问题就消失了。所以,我的下一个问题是:这是对所有设备、所有操作模式的安全修复吗?非常感谢您的帮助!
  • 是的,这在任何地方都是安全的。当合成器必须为您旋转交换链图像时,您将在某些设备上失去一些性能和/或功率,您可以通过设置 preTransform==currentTransform、将 w/h 交换为 90/270 旋转和渲染来避免这种情况在旋转的方向。
  • 并非所有转换都受支持,请参阅 VkSurfaceCapabilitiesKHR::supportedTransforms。在 Android 上,目前仅支持旋转 (android.googlesource.com/platform/frameworks/native/+/refs/…)。
  • 不幸的是,supportedTransforms 无法确定您是否会在 Android 上失去性能和/或电源(即它告诉您什么是可能的,而不是什么是有效的)。 GPU 始终可用作 SurfaceFlinger 的后备,因此supportedTransforms 是一个固定列表,与显示子系统实际可以本地处理的内容无关。不幸的是,避免额外功率的唯一有保证的方法是完全忽略supportedTransforms,并确保将preTransform 设置为currentTransform

标签: android android-ndk vulkan


【解决方案1】:

(根据cmets中的讨论回答)

当您将VkSwapchainCreateInfo::preTransform 设置为VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR 以外的其他值时会发生这种情况,但在渲染期间实际上并未应用该转换。安全的做法是始终使用VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,但如果系统合成器正在旋转您的窗口,从性能/功耗的角度来看,这是次优的。

查看系统合成器正在应用的变换 (VkSurfaceCapabilitiesKHR::currentTransform) 更有效,在渲染期间自己应用该变换,并通过设置 VkSwapchainCreateInfo::preTransform 让合成器知道您这样做了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多