Конференция "Игры" » smd2v12-src большая модель приводит к Out of memory [Delphi, Windows]
 
  • Kav (20.02.07 17:51) [0]
    http://www.igrodel.ru/glsl-bones.htm
    скачал этот пример smd2v12-src про скелетную анимацию, но стаккнулся со странным багом не могу понять, при загрузке сравнительно больших моделек выдает ошибку типа
    ---------------------------
    Project1
    ---------------------------
    Out of memory.
    ---------------------------
    ОК  
    ---------------------------
    , не могу точно отловить ошибку как-будто когда я пошагово нажимаю F8, ошибка не появляется, но стоит нажать F9, то все конец.
  • @!!ex © (20.02.07 18:08) [1]
    Юзаешь чужие сорцы?

    В свое время разбирался с smd, на примере, где скелет бегает.
    Тоде куча багов, и все такое.
    Переписал все с 0. Не Copy&Paste, а именно вникал в каждую строчку кода и писал свою реализацию.

    В итоге все отлично работает. Плюс куча возможностей, типа объединения анимаций, получения позиции конкретной ноды и все такое.
  • Belorus © (20.02.07 19:42) [2]
    @!!ex дай человеку свои сырцы :) Может ему горит :)
  • Kav (20.02.07 19:46) [3]
    Все сорцы хороши, но вот этот smd2v12-src он хорош тем что в нем
    скелетка реализована на вершинных шейдерах :)
    Кстати я так понял что в SMD нет материалов есть только текстуры или это не так?
  • @!!ex © (20.02.07 20:04) [4]

    > Все сорцы хороши, но вот этот smd2v12-src он хорош тем что
    > в нем
    > скелетка реализована на вершинных шейдерах :)

    Не так давно пришел к выводу, что выгоднее разбивать вершины по принадлежности к ноде и просто выставлять в API нужную матрицу трансформации. Тогда и проц не грузиться и шейдеров не надо. н алюбом старье работает. Правда еще не успел реализовать. Времени пока нету.


    > @!!ex дай человеку свои сырцы :) Может ему горит :)

    Если надо, без проблем. только не хочу выкладывать на общее обозрение. Чтобы не позориться. ;)


    > Кстати я так понял что в SMD нет материалов есть только
    > текстуры или это не так?

    Это так.
  • Kav (20.02.07 20:14) [5]
    >Не так давно пришел к выводу, что выгоднее разбивать вершины по >принадлежности к ноде и просто выставлять в API нужную матрицу >трансформации. Тогда и проц не грузиться и шейдеров не надо. н алюбом >старье работает. Правда еще не успел реализовать. Времени пока нету.
    если я правильно тебя понял,что у тебя деформаций не будет а там где стык костей - произойдет разрыв тела, а еслия тебя не правильно понял то хотелось бы увидеть это и пощупать
    Кстати если не тяжело то сорцы свои вышли на kavi5@yandex.ru, все легче разбираться когда сорцов больше
  • @!!ex © (20.02.07 22:01) [6]

    > Kav   (20.02.07 20:14) [5]

    Полигонов принадлежащих нескольким нодам обычно не так много их реально посчитать и на проце. Хотя это чисто мои мысли.
  • Kav (21.02.07 09:27) [7]
    @!!ex
    в принципе да идея не плохая, я никогда этого не замечал!
  • Kav (21.02.07 09:35) [8]
    @!!ex
    Хотя вообще-то надо практически хотябы посчитать сколько вершин принадлежат сразу двум костям и прикинуть какая производительность будет, но все же круто будет если приличная по скорости анимация будет без VS
  • @!!ex © (21.02.07 17:43) [9]

    > Kav   (21.02.07 09:35) [8]

    Чем выше детализация модели, тем ниже процент таких полигонов(Вершина может принадлежать только одной ноде. ;)).
  • Sapersky (21.02.07 20:05) [10]
    Не так давно пришел к выводу, что выгоднее разбивать вершины по принадлежности к ноде и просто выставлять в API нужную матрицу трансформации. Тогда и проц не грузиться и шейдеров не надо. н алюбом старье работает. Правда еще не успел реализовать. Времени пока нету.

    В DX SDK 8.1 (www.clootie.ru) есть пример SkinnedMesh с реализацией шейдерного и нешейдерного методов. Можно сравнить скорость (я сейчас на интегрированной карте особой разницы не увидел, что и понятно, она TnL не поддерживает вообще, так или иначе всё на CPU).
  • Kav (22.02.07 10:06) [11]
    Sapersky  
    но там не известно как они нешейдерный метод реализовали, ну сегодня на работу пойду скачаю посмотрю, но если честно сказать в в этом DX SDK черт голову сломит :)
  • Sapersky (22.02.07 12:35) [12]
    Результаты на 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 есть нечто подобное, посмотрите расширения.
  • @!!ex © (22.02.07 12:56) [13]

    > Cледует учесть, что используется версия шейдеров 1.0, которая
    > проще и на большинстве карт работает быстрее (GLSL, видимо,
    >  использует 2.0, судя по тому, что не запускается на поддерживающей
    > только первые шейдеры карте).

    Если не ошибаюмь,
    шейдеру нужно в начале указывать какую он версию требует и тогда 1.0 спокойно запускатся.
  • Sapersky (22.02.07 13:49) [14]
    На интегрированной карте пример с http://www.igrodel.ru/glsl-bones.htm вываливается на glCreateShaderObjectARB (AV at adress 00000000), т.е. расширение в принципе не поддерживается. В то же время шейдерные демки DX SDK 8.1 и 3DMark2001 крутятся вполне успешно.
  • Kav (23.02.07 02:15) [15]
    Сегодня посидел вечерок, частично переписал что-то, где-то вдумался в код с которого передираю (кстати передирал с примера smoothtexs), и о чудо смог загрузить в свой движек, потом отобразил модель, попробывал проиграть анимацию (которую я сразу сделал на VS 1.1), вроде работает и все это я сдела за один вечер!
    только меня пугает одно пример с которого я делал есть CheckBox, возле которого надпись "Интерполяция углов (глюки)",  я случаем не глючный пример передрал?
  • Kav (23.02.07 14:07) [16]
    @!!ex
    как ты делаешь Интерполяция углов, а то что даже переписал как сам понимал этот участок кода но от гльков не избавился
    нахожу сначала изменение угла между кадрами
     aF:=(animcia.kadri[sledKadr].povorot[i][n] -animcia.kadri[kadr].povorot[i][n]);  
    а потом прибавляю к углу на кадре изменение угла от времени          
    TempPovorot[n]:=(animcia.kadri[kadr].povorot[i][n] +(af*timeKadr));
    но увы есть кадры в которых одна нога поворачивается больше чем нужно на число Пи
    может ты можешь поточне подсказать фомулу Интерполяция углов?
  • @!!ex © (23.02.07 19:18) [17]

    > Kav   (23.02.07 14:07) [16]

    Интерполяцию углов желательно делать через кватернионы.
    Они позволяют многих багов избежать.
    Сам я в этом не особо силен, мало касался этого вопроса.
  • Kav (23.02.07 19:19) [18]
    понятно, пойду переписывать!
 
Конференция "Игры" » smd2v12-src большая модель приводит к Out of memory [Delphi, Windows]
Есть новые Нет новых   [134428   +41][b:0][p:0.001]