Итак, у меня странная проблема.Я портирую современный исходный порт старого игрового движка на iOS и tvOS.Он был написан с использованием OpenGL, и я нашел fork , в котором используется OpenGL ES, и я смог Франкенштейну объединить эти два варианта с тем, где он на самом деле теперь будет успешно работать на устройствах iOS и tvOS.
Вот странная часть - части игры не отображаются правильно на моем iPhone X, но они корректно отображаются на моем iPad Air 2 и Apple TV (4-го поколения).
Я заметил в потоке сообщений в окне вывода, что место, где движок выводит информацию рендерера, на iPhone X говорит:
OpenGL version: OpenGL ES 2.0 Metal 58.4
, тогда как наскажем, на iPad Air 2 написано:
OpenGL version: OpenGL ES 2.0 A8X GPU - 130.1
"OpenGL ES Metal" для меня звучит как "Jumbo Shrimp", поскольку это, очевидно, не одно и то же.Если бы я догадался, я бы сказал, что на iPhone X драйверы OpenGL ES работают поверх какого-то уровня перевода металла, что может быть долгосрочным планом Apple по созданию своего рода перспективных решений послеOpenGL ES не рекомендуется.
Но по какой-то причине это нарушает мой игровой движок, и хотя я неплохо умею совместную работу над кодом, я недостаточно разбираюсь в графическом кодировании, чтобы знать, где искать, чтобы изменить вещи к работе.
Очевидно, что правильный ответ - исправить все, что вызывает проблему, но в качестве кратковременного исправления мне интересно, есть ли способ заставить игру на iOS не использовать OpenGL ES наверх Металла?(если это действительно то, что происходит)
Итак, как сказал Брэд Ларсон ниже, ответы были такими: да, OpenGL ES работает поверх Metal, и нет, его нельзя избежать.Однако для дальнейшего использования, если кто-то еще сталкивается с этой проблемой, я решил реальную проблему с помощью другого SO-ответа:
Фрагментный шейдер WebGL GLSL не работает на iOS
По сути, точность шейдеров с плавающей точкой необходимо повысить с lowp
и mediump
до highp