кто-нить прогал на Maramlade, проблема с костями в GLES2

PooH

сам не шарю вообще, но скоро буду
пока читаю доку по самому мармеладу и по opengles, много нового и сложного
сама проблема в том, что есть моделька и в ней порядка 40-50 костей
в GLES 1.0 все ок, моделька показывается и крутит анимацию
в GLES 2.0 возникают проблемы, программа валится в assert и моделька отображается криво
гугление показало, что проблема в том, что в GLES2.0 введено ограничение на 32 кости в модели
какие способы решения есть?
т.к. я не сильно шарю, то не могу прикинуть оптимальный способ, как это сделать

bav46

мы написали свою библиотечку для костей, долго смотрели что до как и что можно юзать, проебались сильно и долго, зато независимо + оптимизировали по памяти круто ограничение на кости нет, повторное использование мешей ну итд
вот результат
http://www.youtube.com/watch?feature=player_embedded&v=...

PooH

мы написали свою библиотечку для костей
что именно делали?
свои шейдеры писали? или как-то уровнем повыше правили?
мишка угарный

bav46

шейдер тут не причем, цель библиотеки готовит выход данных(причем кастомизированный, хочешь нормали, хочешь тангенты) от времени, анимации итд, она mvc полностью, я вообще все вещи прототипирую на 1ом gl и рисую им же на компе стационарном. обсчет костей мы не убирали на gpu, все считается на cpu, хотя была такая идея убрать, все таки видюхи слабоваты еще для этого на устройствах, там шейдер строчек 30.
у этого мишки 76 костей и 4к полигонов на всех устройствах без бампа он дает максимум фпс, с бампом идет просадка

0000

, а не подскажешь как в Мармеладе попроще узнать виден объект в данный момент или нет?
P.S. То ж в Marmalade сижу. Доки и сообщества весьма печальны :(

bav46

я про мармелад только слышал, но его не юзал, я просто сказал, что проблема всех этих библиотек, что они конечно многие вещи делают просто и при этом имеют хорошую техподдержку, типа проект постоянно обновляется итд, но шаг влево шаг вправо сразу же накладывает определенные рестрикшены.
я свое второе приложение, которое в гуглопомойке(карточный пасьянс написал юзая андэнжайн и все равно его подковыривал под себя(на a кстати я как-то с разработчиком движка пересекся он меня убеждал, как делать надо было там, такие костыли он предлагал поэтому мы пишем все вещи сами практически с нуля.
Но мы специализируемся на волпаперах, поэтому для ап иос неактуален хотя в нейтиве не юзается ничего андройдоспецифичного

bav46

а не подскажешь как в Мармеладе попроще узнать виден объект в данный момент или нет?
это вроде называется oct tree если он его строит ищи мб и есть это

PooH

плюс мармелада в том, что он под "все" платформы

bav46

ну там же псевдо. юнити она тоже под все платформы, а все равно подпиливать приходится =)
вы лучше скажите, вы на работе девелопите под мармелад или дома, лицензии у Вас какие ?

0000

Я дома, лицензия самая дешевая - так что только iOS + Android.

bav46

давно занимаешься или только начал ? есть что-нить в маркетах?

0000

Не, хобби. Хочу махонькую игру сделать.
Поскольку С++/OpenGL плохо знаю, то пришлось вот купить мармелад - он часть головняка по загрузке моделей и менеджерам ресурсов снял.
Вчера вот еще Lua прикрутил - стало веселее.

PooH

вы лучше скажите, вы на работе девелопите под мармелад или дома, лицензии у Вас какие ?
на работе, второй
только начинаем
пока купили indie, если все ок будет, то купим подороже

PooH

ну там же псевдо. юнити она тоже под все платформы, а все равно подпиливать приходится =)
я так понял, что преимущество в том, что куча готового для ресурсов, прокладка для графической части и всякие утилитарные вещи (свои матрицы, вектора и т.д.)
+ вроде как компилится в нативный код, что вроде как дает преимущество в скорости

bav46

+ вроде как компилится в нативный код, что вроде как дает преимущество в скорости
ну скрипты не компилятся вроде, в юнити жаваскрипт подобное, в мармеладе луа.
я с чуваком работал он писал свой движок, он юзал как раз си подобный скриптязык, который разработал кто-то из наших девелоперов, работающий в какой-то отечественной гейм девелопмент студии довольно крупной, там скрипты компилятся.
то что нативное это и ежику понятно

kokoc88

в юнити жаваскрипт подобное
В Unity C# же, с полноценной поддержкой Visual Studio. Кстати, не стоит забывать про Unity Asset Store, хоть и приходится выкидывать на помойку около 60% купленных моделек. ;)

PooH

в итоге все уперлось в написание собственных шейдеров
прошу подсказать:
я правильно понимаю, что
1. для реализации скелетной анимации придется писать шейдер, кости хранить в юниформе (массив кватернионов, т.к. предполагается до 64 костей индекс текущих костей передавать через атрибут (вектор с индексами 4х костей и весами)
2. для реализации других шейдерных эффектов (освещение множественными источниками, бамп-мэппинг и т.д.) придется либо пихать их тот же шейдер, либо рендерить в текстуру и потом накладывать ее на поверхности
3. т.е. не получится обработать в одном вершинном шейдере сначала преобразование вершин для скелетной анимации, а потом в другом шейдере добавить, к примеру, дополнительный сдвиг и искажений этих же вершин? или можно взять набор вершин, обработать их одним шейдером, а потом обработать их другим шейдером так, чтобы их эффект умножался

0000

О, может подскажешь, раз так далеко закопался. Какую систему координат используете?
Я правильно понял, что по умолчанию правосторонняя (ноль в левом верхнем углу, OX - слева направо, OY сверху вниз, OZ торчит в пользователя)?
А можно как то поменять на левостороннюю: ноль центр экрана, OX - слева направо, OY - вверх, OZ - от пользователя. scale(-1) не помогает.

PooH

А можно как то поменять на левостороннюю: ноль центр экрана, OX - слева направо, OY - вверх, OZ - от пользователя. scale(-1) не помогает.
а зачем?
вы зеркало рисуете?

PooH

О, может подскажешь, раз так далеко закопался. Какую систему координат используете?
:)
я закопался в теорию
поэтому твой вопрос ставит меня в тупик
но вообще правосторонняя, наверное

0000

Право и лево сторонняя, это какой рукой её можно изобразить, если большой палец OX, указательный OY, средний OZ.
Мне хочется, чтобы было интуитивно понятно, где у меня объект, т.е. задаю координаты (100, 0, 100) - это значит правее и спереди меня на один метр.

PooH

Право и лево сторонняя, это какой рукой её можно изобразить, если большой палец OX, указательный OY, средний OZ.
не, ну я знаю, конечно, что такое лево- и провосторонние со
просто не уверен, какая именно используется в opengl и мармеладе
скорее всего правосторонняя

0000

Как не знаешь, а как же вы объекты то позиционируете то?!
P.S. Только доперло - можно из исходной системы сделать чтобы OXY были горизонтальной плоскостью, просто повернув первоначальную систему, тогда в этом случае позиция указанного выше объекта можно задать как (100, 100, 0 что то же интуитивно понятно. Вечером попробую :)

PooH

Как не знаешь, а как же вы объекты то позиционируете то?!
я пока просто пытаюсь написать шейдер и добавить его к материалу и отрендерить с ним сцену
сам понимаешь, тут безразлично какая со используется
еще раз, зачем тебе переводить из одной со в другую?

PooH

Мне хочется, чтобы было интуитивно понятно, где у меня объект, т.е. задаю координаты (100, 0, 100) - это значит правее и спереди меня на один метр.
есть два подхода:
можешь крутить глобальную систему координат, можешь у себя в мозгу крутить
второе предпочтительнее
ну и вообще все зависит от положения камеры
можешь ее крутить

bav46

1. для реализации скелетной анимации придется писать шейдер, кости хранить в юниформе (массив кватернионов, т.к. предполагается до 64 костей индекс текущих костей передавать через атрибут (вектор с индексами 4х костей и весами)
ты че хочешь повесить просчет анимации на видюху ?

PooH

ты че хочешь повесить просчет анимации на видюху ?
а что не так?
скелет крутим на CPU
а вершины обсчитываем на GPU: для каждой зная положение костей, их веса и bindPos высчитываем результирующее положение

bav46

надо смотреть стоимость передачи весов в шейдер на устройствах

PooH

надо смотреть стоимость передачи весов в шейдер на устройствах
веса - это один vec4
индексы костей - либо vec4 int либо вообще 1 int
передается через атрибут вершины
кости через юниформ: 128 кватернионов
итого: имеем массив 64 кватерниона повороты костей, 64 vec4 координаты костей (все это можно упаковать в 32 матрицы 4х4 - ровно столько, сколько мармелад запихивает в свой юниформ с костями);
для каждой вершины передаем через атрибуты 2 вектора: индексы костей, веса костей
в шейдере распаковываем юниформ для нужных индексов (тут немного говнокод будет, т.к. 3я кость будет лежать в bones[1] в первых двух столбцах)
считаем результирующую матрицу преобразования (4 кости, смещение и поворот) и преобразовываем вершину
ну потом как обычно проектируем ее в view пространство

PooH

проблема в том, что придется выкинуть на помойку все уже готовые эффекты от мармелада и писать самому освещение (пока не знаю, каким образом мы его будем реализовывать)

bav46

я просто еще хочу добавить что в шейдере if очень дорого.
я как-то читал статью на хабре про то как делался дьябло третий вот там уже все данные влетали в шейдер готовые а шейдер тупо только множит

PooH

что в шейдере if очень дорого.
я пока не заметил в своей реализации if

bav46

напиши свой кусок когда для одной вершины два -три веса и две три кости

PooH

напиши свой кусок когда для одной вершины два -три веса и две три кости
в чем проблема передавать нулевой вес?

bav46

брр, какой нулевой вес?
на одну вершину может воздействовать от 0 до n костей
или ты хочешь максимизировать передачу? скажем если максимум 4 кости то делаем для всех передачу в 4 веса и индекса ?

PooH

или ты хочешь максимизировать передачу? скажем если максимум 4 кости то делаем для всех передачу в 4 веса и индекса ?
4 кости на вершину, имхо, должно хватить для мобильного приложения
не надо никаких if - просто если передаем меньше 4х костей, то зануляем веса для "лишних"

bav46

ну да я это и имел ввиду.
а какой формат скелетника юзаешь ?
я юзаю колладу и конвертер в свой формат, щас пишу свою обертку для луа так просто больше поиграться ибо чистяком на плюсах задирает сводить анимации

PooH

а какой формат скелетника юзаешь ?
мармеладовский?
у них там своя атмосфера:
 
CIwAnim
{
skeleton "joint1"
// Keyframe# 1
CIwAnimKeyFrame
{
time 0
bone "joint1"
pos {0,0,-1715.52380}
rot {-0.70325,0,0.71094,0}

bone "joint2"
pos {579.81592,0,0.00000}
rot {0.99994,0,0.01093,0}

bone "joint3"
pos {573.51434,0,0.00000}
rot {0.99994,0,-0.01093,0}

bone "joint4"
pos {579.81592,0,0.00000}
rot {0.99994,0,0.01099,0}

bone "joint5"
pos {567.21277,0,-0.00000}
rot {0.99998,0,-0.00556,0}

bone "joint6"
pos {579.78174,0,-0.00000}
rot {0.99998,0,-0.00549,0}

}
....

PooH

скелетника
я еще не совсем гуру 3d, если честно, поэтому не понимаю жаргона
может ты про плеер анимации спрашиваешь?
тогда мармеладовский, на линейной интерполяции

bav46

я имел ввиду меш+кости формат модели.

PooH

я имел ввиду меш+кости формат модели.
это тоже мармеладовское
такого же плана как выше: текстовый, человеко-понятный

0000

Блин, думал какие то чудеса в Мармеладе с системами координат, а оказалось тупо экспортер из блендера в Мармелад с косяком :(

PooH

экспортер из блендера в Мармелад с косяком
есть такое
их же официальный экспортер из майи никак у меня установиться не мог
только руками и поставился
Оставить комментарий
Имя или ник:
Комментарий: