На HTC One X получилось вот такое db.tt/2A2yKX5u
И еще, у вас опечатка: первые уравнения у вас для преобразования из сферической в декартову, а вторые наоборот.
Любопытно. Stopped оно в эмуляторе действительно иногда делало, но с этим, вроде, мне уже удалось справиться.
А чёрное окно обычно у меня длилось секунд 10, не больше. Я имею в виду, в эмуляторе: на устройстве-то всё грузится за секунду.
Уже лучше, но артефакты есть. db.tt/FrXy9lO7
И по поводу некорректного отображения на стыке передней и задней полусфер: можно ведь преобразовывать координаты так, чтоб проекция с большим углом к сфере была всегда по периметру отображаемой плоской проекции.
Там тот же билд. :)
Вообще, странно, что даже для одного и того же чипа (Tegra 3) результаты получаются разными (на Nexus 7 всё ОК, на One X нет), но тут уже, видимо, какая-то разница в драйверах начинает сказываться. Если мне One X попадётся в руки, попытаюсь додавить этот эффект. Ну, или может быть кто-нибудь мне поможет, исходники-то открыты. :)
В свое время делал что-то похожее (еще на спектрум потом на 386х).
Вращающиеся фигуры назывался. (разные фигуры на выбор вращались на экране)
Типа наглядного пособия по математике.
Только там я применял массивы значений косинусов, чтобы быстрее считалось.
Писалось на Бейсике, в тетрадках. Потом по полдня вбивалось.
Была даже скомпилиная программа, которая зачетом ушла и больше не осталась.
Надо бы повторить, с оглядкой на Ваш код.
И кстати, просчет не видимости точки (что-то типа Z буфера) высчитывался как-то интересно.
Я потом эту формулу в другом виде в мат.анализе нашел. Хотя вывел сам.
50+ FPS но появились деформации как на скрине в первом коменте только гораздо меньшие. как буж-то землю нарезали на плоские круги и некоторые слегка провернули относительно других.
Ого, вот это странно. У меня сейчас такой эффект на One тоже воспроизводится (именно такой, «слоями», а не как в комментарии), но с чего бы он мог появиться, если предыдущий вариант работал нормально?.. Загадочно.
Ну, они бы и в предыдущем варианте тогда возникали. :) А вычисление текстурных координат в обоих шейдерах сделано одинаково.
Вообще, вот сейчас я ковыряю One, и у меня стойкое ощущение, что он насильно сжимает текстуру. Если это так, то я уже ничего сделать не смогу…
Собрал ещё три варианта. :)
На этот раз, у меня получилась почти нормальная работа на HTC One, путём переставления битов и изменения множителя. Мелкие артефакты изображения всё равно присутствуют, но стало уже лучше.
Итак, для HTC One: версия "только вращение", версия с наклоном.
да, как думаете, справитесь с этим? я залип на этот шарик, на работе, минут на 15, еще коллегам потом показывал ) А можно еще звезды добавить на задний фон?
Хороший вопрос. С одной стороны, хочется это исправить, а с другой — шейдер «с наклоном» уже и так очень сложный, от изящества первой версии в нём почти ничего не осталось. Так-то демка создавалась чисто ради вращения вокруг своей оси.
Так или иначе, исходники доступны всем, поэтому если не я, то кто-нибудь другой наверняка что-то сможет сделать. :)
Ну а звёзды… чуть позже прикручу. :)
Вот сейчас совсем странно стало, почему тогда у BlackSwan первая версия работала нормально (а почти такая же перестала), а у вас она же давала 30 fps? Что же это был за билд такой?..
Как бы то ни было, добавил в пост ссылки, чтобы можно было выбрать себе сборку по вкусу. :)
Читаю коменты, и мне страшно. Если два треугольника с шейдерами вызывают такие различия на разных девайсах, через что же проходят разработчики более серьезных игр…
Спасибо за статью. Я подобное во флеше делал, тока до гениальности проще. Брал рисовал круг, под ним слой с прямоугольной картой+ маска по форме круга и двигал карту слева направо циклично. В итоге сделал солнечную систему из 7 планет. Задачка на экзамене такая была.
Вот да, мой друг изначально сделал примерно так же. Но при этом нет «выпуклости», перспективы, поэтому мне и захотелось сделать примерно так же просто, но более правдоподобно.
Ну да, решив задачу нахождения сферических текстурных координат, дальше уже можно двигаться в направлении любых спецэффектов, использующих текстуры. :)
У меня работает в Chrome и Firefox, но не работает в Safari.
Я пока не разбирался в причинах, всё-таки это мой первый webGL, сделанный менее чем за сутки.
Ан нет, у меня в Safari тоже работает: там надо было явно включить поддержку WebGL, тогда всё пучком.
Больше скажу, теперь у меня это работает даже в Firefox for Android.
Отличная статья!
И очень хорошая идея. Ваш код и «хак» arbg-формата отлично работает на IOS.
Попробовала сделать на IPhone,
Одна проблема с fps. С чего ей так падать непонятно, может у кого есть мысли насчет этого?
Причем пробовала сделать нативные шрейдеры, которые сами делают преобразование из декартовых в сферические, но тоже грустно получилось с производительностью.
Зависит от версии айфона: например, на четвёрке это было бы ожидаемо, т.к. там впервые появилось ретина-разрешение, при незначительном увеличении мощности процессора (по сравнению с 3GS). Тут ведь производительность упирается именно в количество экранных пикселей и мощность видеоядра.
Да, на четверке смотрю. На ipad-mini ситуация получше. Но все-таки это довольно странно. Я работаю на cocos2d и там огромное множество преобразований со спрайтами, и fps не падает. А тут от одной картинки все так опустилось. В предложенном методе, вообще, исключительно линейные преобразования, которые GPU по сути должен на раз-два делать. Возможно тут переключение между текстурами играет нехорошую роль. Но за статью и за идею Вам спасибо, при любом fps).
Преобразования со спрайтами обычно делаются на уровне вершин, которых в спрайте всего четыре штуки (как и здесь). А вот пикселей здесь — примерно 321700 (это только те, которые попадают под «if (z2 > 0.0)», а так их 409600), и для каждого выполняется довольно сложный пиксельный шейдер с произвольной выборкой из двух текстур.
Так что, да, в данном случае это всего лишь просто забавная демка, с сомнительной применимостью, хотя позапрошлогодние GPU её уже вполне тянут на 60 fps, а дальше будет только лучше.
Насколько я поняла по анализу перфоманса, когда текстура читается непоследовательно, а зависимо от переменных происходит сильное замедление. Видимо в это и есть причина. Согласна, что для новых устройств это уже утрачивает актуальность.
Сфера из двух треугольников