вулкан х и у переключился - PullRequest
       31

вулкан х и у переключился

0 голосов
/ 28 февраля 2019

Я занимаюсь разработкой игры для Android с использованием API Android NDK Vulkan.Код, по большей части, на C ++ 14.В большинстве случаев все работает нормально, однако на некоторых устройствах у меня возникает такая проблема, когда координаты x и y переключаются.Я рисую то, что я считаю верхней частью экрана, и это рисует объекты сбоку.Кроме того, когда я делаю что-либо с точкой зрения (матрица вида), x и y меняются местами.Если я перемещаю точку обзора в направлении x, она фактически перемещается в направлении y.

Кроме того, ширина и высота, сообщаемые цепочкой обмена, меняются местами.Так что, если я вставлю эти значения в матрицу перспективы следующим образом:

glm :: перспектива (glm :: radians (60.0f), swapchainRetrievedWidth / (float) swapchainRetrievedHeight, 0.1f, 10.0f);

он будет рисовать ужасно перекошенные объекты.Но если я переверну ширину и высоту, как показано ниже:

glm ::спектива (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 на том же устройстве при тех же обстоятельствах, и эти симптомы не возникают.Спасибо за вашу поддержку и помощь.

1 Ответ

0 голосов
/ 02 марта 2019

(Ответ основан на обсуждении в комментариях)

Это происходит, когда вы устанавливаете VkSwapchainCreateInfo::preTransform в значение, отличное от VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, но на самом деле не применяете это преобразование во время рендеринга.Безопаснее всего всегда использовать VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, но если ваше окно вращается системным композитором, это неоптимально с точки зрения производительности / мощности.

Более эффективно смотреть на то, что преобразованиесистемный композитор применяет (VkSurfaceCapabilitiesKHR::currentTransform), применяет, который преобразует себя во время рендеринга, и пусть композитор узнает, что вы сделали это, установив VkSwapchainCreateInfo::preTransform.

...