Comments 66
На HTC One X получилось вот такое db.tt/2A2yKX5u
И еще, у вас опечатка: первые уравнения у вас для преобразования из сферической в декартову, а вторые наоборот.
Хм, странно, мне казалось, что на One я тоже тестировал. Похоже, спутал с Butterfly или ещё чем-то. Значит, там такая же беда, как на S4. :(
30 fps на третьей тегре с двумя треугольниками? Ну оок, лол.
Ну тегра — это вообще странная вещь. На моём S3, например, стабильно держится 60 fps, а значит кадровая частота ограничена лишь VSync'ом.
Угу, очень странная, но Epic Citadel от Epic Games выдает средний фпс 57.
Значит, там довольно примитивные пиксельные шейдеры, только и всего.
60 фпс, проблема с текстурой. Может она пожата в неподдерживаемый формат?
А, я перепутал One и One X.
Значит, проблема как минимум с теграми (One X и Nexus 7).
На WindowsAndroid сначала «Unfortunately, Planet has stopped.», потом пустое чёрное окно с заголовком.
Любопытно. Stopped оно в эмуляторе действительно иногда делало, но с этим, вроде, мне уже удалось справиться.
А чёрное окно обычно у меня длилось секунд 10, не больше. Я имею в виду, в эмуляторе: на устройстве-то всё грузится за секунду.
Хм… Кажется, после этого комментария я таки решусь попробовать освоить WebGL.
Попробуйте обновлённую сборку, пожалуйста. Мне как раз случай с вашего скриншота был наиболее интересен, вдруг удалось его исправить?
Уже лучше, но артефакты есть. db.tt/FrXy9lO7
И по поводу некорректного отображения на стыке передней и задней полусфер: можно ведь преобразовывать координаты так, чтоб проекция с большим углом к сфере была всегда по периметру отображаемой плоской проекции.
Там тот же билд. :)
Вообще, странно, что даже для одного и того же чипа (Tegra 3) результаты получаются разными (на Nexus 7 всё ОК, на One X нет), но тут уже, видимо, какая-то разница в драйверах начинает сказываться. Если мне One X попадётся в руки, попытаюсь додавить этот эффект. Ну, или может быть кто-нибудь мне поможет, исходники-то открыты. :)
Хотя… Что-то я засомневался, тот же ли. Попробуйте, действительно, вот это: вдруг я в последний момент, как обычно, всё перепутал?..
В свое время делал что-то похожее (еще на спектрум потом на 386х).
Вращающиеся фигуры назывался. (разные фигуры на выбор вращались на экране)
Типа наглядного пособия по математике.
Только там я применял массивы значений косинусов, чтобы быстрее считалось.
Писалось на Бейсике, в тетрадках. Потом по полдня вбивалось.
Была даже скомпилиная программа, которая зачетом ушла и больше не осталась.
Надо бы повторить, с оглядкой на Ваш код.
И кстати, просчет не видимости точки (что-то типа Z буфера) высчитывался как-то интересно.
Я потом эту формулу в другом виде в мат.анализе нашел. Хотя вывел сам.
На Lenovo A750 всё работает, 30FPS.

А Земля у Вас в правильную сторону вращается? А то мне кажется что нет )
Забавный результат…

50+ FPS но появились деформации как на скрине в первом коменте только гораздо меньшие. как буж-то землю нарезали на плоские круги и некоторые слегка провернули относительно других.
Ого, вот это странно. У меня сейчас такой эффект на One тоже воспроизводится (именно такой, «слоями», а не как в комментарии), но с чего бы он мог появиться, если предыдущий вариант работал нормально?.. Загадочно.
Выглядит забавно :) На вскидку — может где-то ошибки округления возникают ( всмысле погрешности вычисления координат)?
Ну, они бы и в предыдущем варианте тогда возникали. :) А вычисление текстурных координат в обоих шейдерах сделано одинаково.
Вообще, вот сейчас я ковыряю One, и у меня стойкое ощущение, что он насильно сжимает текстуру. Если это так, то я уже ничего сделать не смогу…
Собрал ещё три варианта. :)
На этот раз, у меня получилась почти нормальная работа на HTC One, путём переставления битов и изменения множителя. Мелкие артефакты изображения всё равно присутствуют, но стало уже лучше.
Итак, для HTC One: версия "только вращение", версия с наклоном.
выглядит классно на nexus 7, 60fps, только где наклон выбают артефакты
да, как думаете, справитесь с этим? я залип на этот шарик, на работе, минут на 15, еще коллегам потом показывал ) А можно еще звезды добавить на задний фон?
Хороший вопрос. С одной стороны, хочется это исправить, а с другой — шейдер «с наклоном» уже и так очень сложный, от изящества первой версии в нём почти ничего не осталось. Так-то демка создавалась чисто ради вращения вокруг своей оси.
Так или иначе, исходники доступны всем, поэтому если не я, то кто-нибудь другой наверняка что-то сможет сделать. :)
Ну а звёзды… чуть позже прикручу. :)
Тестирую эту версию, обе дают 60 фпс, версия с наклоном изначально без наклона, покрутил, всё ок, только на полюсах артефакты.
Вот сейчас совсем странно стало, почему тогда у BlackSwan первая версия работала нормально (а почти такая же перестала), а у вас она же давала 30 fps? Что же это был за билд такой?..
Как бы то ни было, добавил в пост ссылки, чтобы можно было выбрать себе сборку по вкусу. :)
Вот так, имея один эмулятор Android, можно потестировать свое приложение «коллективным разумом» на большом количестве различных android девайсов
Читаю коменты, и мне страшно. Если два треугольника с шейдерами вызывают такие различия на разных девайсах, через что же проходят разработчики более серьезных игр…
В более серьёзных играх не используются такие жестокие хаки. :)
посмотри на шейдеры более-менее реалистичного освещения или сглаживания.
Спасибо за статью. Я подобное во флеше делал, тока до гениальности проще. Брал рисовал круг, под ним слой с прямоугольной картой+ маска по форме круга и двигал карту слева направо циклично. В итоге сделал солнечную систему из 7 планет. Задачка на экзамене такая была.
Вот да, мой друг изначально сделал примерно так же. Но при этом нет «выпуклости», перспективы, поэтому мне и захотелось сделать примерно так же просто, но более правдоподобно.
Ну да, решив задачу нахождения сферических текстурных координат, дальше уже можно двигаться в направлении любых спецэффектов, использующих текстуры. :)
дальше советую посмотреть в сторону Clipmaps или мегатекстуры, для того чтоб увеличить качество при увеличении. получится не хуже GoogleEarth
Судя по всему, простая цилиндрическая (она же простая географическая, она же equirectangular, она же plate carrée).
У меня работает в Chrome и Firefox, но не работает в Safari.
Я пока не разбирался в причинах, всё-таки это мой первый webGL, сделанный менее чем за сутки.
Ан нет, у меня в Safari тоже работает: там надо было явно включить поддержку WebGL, тогда всё пучком.
Больше скажу, теперь у меня это работает даже в Firefox for Android.
Отличная статья!
И очень хорошая идея. Ваш код и «хак» arbg-формата отлично работает на IOS.
Попробовала сделать на IPhone, image

Одна проблема с fps. С чего ей так падать непонятно, может у кого есть мысли насчет этого?
Причем пробовала сделать нативные шрейдеры, которые сами делают преобразование из декартовых в сферические, но тоже грустно получилось с производительностью.
Зависит от версии айфона: например, на четвёрке это было бы ожидаемо, т.к. там впервые появилось ретина-разрешение, при незначительном увеличении мощности процессора (по сравнению с 3GS). Тут ведь производительность упирается именно в количество экранных пикселей и мощность видеоядра.
Да, на четверке смотрю. На ipad-mini ситуация получше. Но все-таки это довольно странно. Я работаю на cocos2d и там огромное множество преобразований со спрайтами, и fps не падает. А тут от одной картинки все так опустилось. В предложенном методе, вообще, исключительно линейные преобразования, которые GPU по сути должен на раз-два делать. Возможно тут переключение между текстурами играет нехорошую роль. Но за статью и за идею Вам спасибо, при любом fps).
Преобразования со спрайтами обычно делаются на уровне вершин, которых в спрайте всего четыре штуки (как и здесь). А вот пикселей здесь — примерно 321700 (это только те, которые попадают под «if (z2 > 0.0)», а так их 409600), и для каждого выполняется довольно сложный пиксельный шейдер с произвольной выборкой из двух текстур.
Так что, да, в данном случае это всего лишь просто забавная демка, с сомнительной применимостью, хотя позапрошлогодние GPU её уже вполне тянут на 60 fps, а дальше будет только лучше.
Насколько я поняла по анализу перфоманса, когда текстура читается непоследовательно, а зависимо от переменных происходит сильное замедление. Видимо в это и есть причина. Согласна, что для новых устройств это уже утрачивает актуальность.
Only those users with full accounts are able to leave comments. Log in, please.