我正在使用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中尝试了相同的操作,并且不会出现这些症状。感谢您的支持和帮助。
答案 0 :(得分:2)
(根据评论中的讨论进行回答)
当您将VkSwapchainCreateInfo::preTransform
设置为VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR
以外的其他值时会发生这种情况,但是在渲染过程中实际上并未应用该变换。安全的做法是始终使用VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR
,但是如果您的窗口正在由系统合成器旋转,则从性能/功率的角度来看,这不是最佳选择。
查看系统合成器正在应用的转换(VkSurfaceCapabilitiesKHR::currentTransform
),在渲染过程中自己应用该转换,并通过设置VkSwapchainCreateInfo::preTransform
让合成器知道您这样做的效率更高。