Как стать автором
Обновить

Комментарии 66

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

А Земля у Вас в правильную сторону вращается? А то мне кажется что нет )
О, а вот об этом я ни разу не задумывался, спасибо. :)
Кстати, попробуйте вот этот файл (это вариант без наклона) — сколько на нём будет FPS?
Забавный результат…

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

Публикации

Истории