Pull to refresh

Comments 8

Хочется увидеть фпс на тестовых девайсах, а так же сравнение с hdr текстурами, то есть без функций упаковки/распаковки.

Тестовый девайс у меня всего один: xperia z3
Описанный пример с 2^20 частиц работает на ~30fps. Без красивостей в постобработки ~42fps.


На hdr-текстурах результат примерно на 5 fps хуже.
Утверждать ничего не буду, попробывал всего один раз и возможно где-то просто ошибся.

UFO just landed and posted this here

К сожелению, клиент под Android еще в процессе. В скором времени постараюсь выложить. Все примеры можно будет собирать в Android Studio и запускать на устройстве или на симуляторе.


Десктопных клиентов пока не планирую. Можно использовать Qt, вроде как она по умолчанию работает в режиме совместимости с OpenGL ES (что бы шейдеры не переписовать). Или воспользоваться каким-либо эмулятором, например, этим

Не могли бы вы подробнее рассказать про функции упаковки/распаковки? Тут предполагается, что значения нормированы к (0,1)? Почему умножаем на 255, а не 256? Для чего вообще в функции pack нужно последнее действие? Разве лишние разряды не будут отброшены автоматически?

OpenGL обрабатывает текстуры формата GL_RGBA8 с помощью того, что называется Normalized integer. Т.е. на самом деле у нас есть только целые числа, которые OpenGL автоматически преобразует в числа с плавающей точкой и обратно. Такие числа характеризуются наличием знака и количеством бит (bitdepth). В нашем случае, это 8-ми битные, беззнаковые целые.
Максимальное значение:


MAX = 2^8 - 1

OpenGL преобразования:


float = int / MAX
int = round(float * MAX).

Суть распаковки/запаковки


Запаковка:


  1. Мы умножаем наше число F от 0.0 до 1.0 на 255.0. Из полученного результата нам важен остаток B. Это то, что не влезло в 8 бит. Т.е. в один 8-ми битный компонент мы можем записать только F — B / 255.0.
  2. На втором шаге мы просто сохраняем (B, F — B / 255.0)

Распаковка:


  1. Складываем две компоненты, не забыв разделить первую на 255.0.
    (B / 255.0) + (F - B / 255.0) -> F
-Почему умножаем на 255, а не 256?

наверно потому, что для хранения числа 255 надо 8 бит, а для 256 уже 9.

Выложил клиент под Android.
Cобираю на Ubuntu 16.04, на Windows не пробовал. Если попробуете и что-то не заработает, напишите пожалуйта.

Sign up to leave a comment.

Articles