-
http://www.igrodel.ru/glsl-bones.htmскачал этот пример smd2v12-src про скелетную анимацию, но стаккнулся со странным багом не могу понять, при загрузке сравнительно больших моделек выдает ошибку типа --------------------------- Project1 --------------------------- Out of memory. --------------------------- ОК --------------------------- , не могу точно отловить ошибку как-будто когда я пошагово нажимаю F8, ошибка не появляется, но стоит нажать F9, то все конец.
-
Юзаешь чужие сорцы?
В свое время разбирался с smd, на примере, где скелет бегает. Тоде куча багов, и все такое. Переписал все с 0. Не Copy&Paste, а именно вникал в каждую строчку кода и писал свою реализацию.
В итоге все отлично работает. Плюс куча возможностей, типа объединения анимаций, получения позиции конкретной ноды и все такое.
-
@!!ex дай человеку свои сырцы :) Может ему горит :)
-
Все сорцы хороши, но вот этот smd2v12-src он хорош тем что в нем скелетка реализована на вершинных шейдерах :) Кстати я так понял что в SMD нет материалов есть только текстуры или это не так?
-
> Все сорцы хороши, но вот этот smd2v12-src он хорош тем что > в нем > скелетка реализована на вершинных шейдерах :)
Не так давно пришел к выводу, что выгоднее разбивать вершины по принадлежности к ноде и просто выставлять в API нужную матрицу трансформации. Тогда и проц не грузиться и шейдеров не надо. н алюбом старье работает. Правда еще не успел реализовать. Времени пока нету.
> @!!ex дай человеку свои сырцы :) Может ему горит :)
Если надо, без проблем. только не хочу выкладывать на общее обозрение. Чтобы не позориться. ;)
> Кстати я так понял что в SMD нет материалов есть только > текстуры или это не так?
Это так.
-
>Не так давно пришел к выводу, что выгоднее разбивать вершины по >принадлежности к ноде и просто выставлять в API нужную матрицу >трансформации. Тогда и проц не грузиться и шейдеров не надо. н алюбом >старье работает. Правда еще не успел реализовать. Времени пока нету. если я правильно тебя понял,что у тебя деформаций не будет а там где стык костей - произойдет разрыв тела, а еслия тебя не правильно понял то хотелось бы увидеть это и пощупать Кстати если не тяжело то сорцы свои вышли на kavi5@yandex.ru, все легче разбираться когда сорцов больше
-
> Kav (20.02.07 20:14) [5]
Полигонов принадлежащих нескольким нодам обычно не так много их реально посчитать и на проце. Хотя это чисто мои мысли.
-
@!!ex в принципе да идея не плохая, я никогда этого не замечал!
-
@!!ex Хотя вообще-то надо практически хотябы посчитать сколько вершин принадлежат сразу двум костям и прикинуть какая производительность будет, но все же круто будет если приличная по скорости анимация будет без VS
-
> Kav (21.02.07 09:35) [8]
Чем выше детализация модели, тем ниже процент таких полигонов(Вершина может принадлежать только одной ноде. ;)).
-
Не так давно пришел к выводу, что выгоднее разбивать вершины по принадлежности к ноде и просто выставлять в API нужную матрицу трансформации. Тогда и проц не грузиться и шейдеров не надо. н алюбом старье работает. Правда еще не успел реализовать. Времени пока нету.
В DX SDK 8.1 (www.clootie.ru) есть пример SkinnedMesh с реализацией шейдерного и нешейдерного методов. Можно сравнить скорость (я сейчас на интегрированной карте особой разницы не увидел, что и понятно, она TnL не поддерживает вообще, так или иначе всё на CPU).
-
Sapersky но там не известно как они нешейдерный метод реализовали, ну сегодня на работу пойду скачаю посмотрю, но если честно сказать в в этом DX SDK черт голову сломит :)
-
Результаты на Radeon 9000 Pro:
D3D Non-Indexed - 665 D3D Indexed - 766 Software - 232 D3D Indexed (VS) - 800
Шейдер всё-таки оказался немного быстрее. Cледует учесть, что используется версия шейдеров 1.0, которая проще и на большинстве карт работает быстрее (GLSL, видимо, использует 2.0, судя по тому, что не запускается на поддерживающей только первые шейдеры карте). Сам шейдер (точнее, шейдеры - я так понял, для случаев с разным кол-вом матриц) находится в ресурсах (skinnedmesh81.res).
Что касается нешейдерных методов - см. мануал к DX SDK по темам Geometry Blending, Indexed Vertex Blending. Если коротко, то принцип такой: в D3D можно выставить одновременно несколько матриц трансформации. При этом в формат вершины включаются коэффициенты, которые задают влияние каждой матрицы на данную вершину. В случае Non-Indexed можно задать одновременно до 4 матриц, модель рендерится по частям (похоже на то, что предлагал @!!ex). В случае Indexed в формат вершины дополнительно включаются 4 байта, задающие индексы в "матричной палитре", т.е. одновременно можно использовать 256 матриц, т.е. фактически все сразу и выводить модель за один приём. Indexed не поддерживается аппаратно некоторыми старыми картами, GeForce2MX, например (работает, но медленнее чем Non-indexed). Наверняка в OpenGL есть нечто подобное, посмотрите расширения.
-
> Cледует учесть, что используется версия шейдеров 1.0, которая > проще и на большинстве карт работает быстрее (GLSL, видимо, > использует 2.0, судя по тому, что не запускается на поддерживающей > только первые шейдеры карте).
Если не ошибаюмь, шейдеру нужно в начале указывать какую он версию требует и тогда 1.0 спокойно запускатся.
-
На интегрированной карте пример с http://www.igrodel.ru/glsl-bones.htm вываливается на glCreateShaderObjectARB (AV at adress 00000000), т.е. расширение в принципе не поддерживается. В то же время шейдерные демки DX SDK 8.1 и 3DMark2001 крутятся вполне успешно.
-
Сегодня посидел вечерок, частично переписал что-то, где-то вдумался в код с которого передираю (кстати передирал с примера smoothtexs), и о чудо смог загрузить в свой движек, потом отобразил модель, попробывал проиграть анимацию (которую я сразу сделал на VS 1.1), вроде работает и все это я сдела за один вечер! только меня пугает одно пример с которого я делал есть CheckBox, возле которого надпись "Интерполяция углов (глюки)", я случаем не глючный пример передрал?
-
@!!ex как ты делаешь Интерполяция углов, а то что даже переписал как сам понимал этот участок кода но от гльков не избавился нахожу сначала изменение угла между кадрами aF:=(animcia.kadri[sledKadr].povorot[i][n] -animcia.kadri[kadr].povorot[i][n]); а потом прибавляю к углу на кадре изменение угла от времени TempPovorot[n]:=(animcia.kadri[kadr].povorot[i][n] +(af*timeKadr)); но увы есть кадры в которых одна нога поворачивается больше чем нужно на число Пи может ты можешь поточне подсказать фомулу Интерполяция углов?
-
> Kav (23.02.07 14:07) [16]
Интерполяцию углов желательно делать через кватернионы. Они позволяют многих багов избежать. Сам я в этом не особо силен, мало касался этого вопроса.
-
понятно, пойду переписывать!
|