【发布时间】: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