vulkan x 和 y 切换
vulkan x and y switched
我正在使用 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,OS:android 8.0,phone 供应商:HTC。对于此设备,仅当设备使用分屏模式且设备处于横向(应用程序强制采用纵向模式)时,才会出现这些症状。我在其他设备和全屏(非分屏)模式下也看到过这种情况。所以,我不认为这是我在屏幕尺寸改变时重新初始化交换链、管道、深度缓冲区、渲染通道和命令缓冲区的方式。由于在全屏模式下出现此问题的设备屏幕不会改变大小。
我是不是做错了什么?有错误吗?我愿意就此问题提供更多信息,但不知道需要什么。
我在相同环境下的相同设备上尝试了 OpenGLES 2.0 中的相同操作,但没有出现这些症状。感谢大家的支持和帮助。
(根据评论中的讨论回答)
当您将 VkSwapchainCreateInfo::preTransform
设置为 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR
以外的其他内容时会发生这种情况,但在渲染过程中实际上并未应用该变换。安全的做法是始终使用 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR
,但如果你的 window 被系统合成器轮换,从 performance/power 的角度来看,这是次优的。
查看系统合成器正在应用的转换 (VkSurfaceCapabilitiesKHR::currentTransform
) 会更有效,在渲染过程中自己应用该转换,并通过设置 VkSwapchainCreateInfo::preTransform
让合成器知道您这样做了。
我正在使用 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,OS:android 8.0,phone 供应商:HTC。对于此设备,仅当设备使用分屏模式且设备处于横向(应用程序强制采用纵向模式)时,才会出现这些症状。我在其他设备和全屏(非分屏)模式下也看到过这种情况。所以,我不认为这是我在屏幕尺寸改变时重新初始化交换链、管道、深度缓冲区、渲染通道和命令缓冲区的方式。由于在全屏模式下出现此问题的设备屏幕不会改变大小。
我是不是做错了什么?有错误吗?我愿意就此问题提供更多信息,但不知道需要什么。
我在相同环境下的相同设备上尝试了 OpenGLES 2.0 中的相同操作,但没有出现这些症状。感谢大家的支持和帮助。
(根据评论中的讨论回答)
当您将 VkSwapchainCreateInfo::preTransform
设置为 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR
以外的其他内容时会发生这种情况,但在渲染过程中实际上并未应用该变换。安全的做法是始终使用 VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR
,但如果你的 window 被系统合成器轮换,从 performance/power 的角度来看,这是次优的。
查看系统合成器正在应用的转换 (VkSurfaceCapabilitiesKHR::currentTransform
) 会更有效,在渲染过程中自己应用该转换,并通过设置 VkSwapchainCreateInfo::preTransform
让合成器知道您这样做了。