GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (21 стр.)

Сообщения на форуме пользователя Andrey (21 стр.)

Быстрое отображение множества спрайтов поверх основной сцены14 мая 201213:25#8
bugman
> Перевод координат делаю через GLUproject исходя из матриц мира.
а где ты взял GLUproject  для OpenGL ES 1.1 ?
>а по поводу матрицы проекции можно поподробнее?
я бы хранил координаты значков уже в мировых координатах, GLUproject  или ее аналог для OpenGL ES 1.1(кстати надеюсь не double ?) требует 2 матрицы, модельно-видовую и проекционную, внутри функции она матрицы перемножает. Напиши свой аналог функции сделай ее встраиваемой и передавай готовую перемноженную матрицу modelView * proj, ведь она не меняется от значка до значка. Для каждого значка сэкономишь на перемножении матриц, разгрузив CPU. Именно так я и сделал. У меня похожая задача, пересчет координат текста(ну символ это квадрат тот-же значок что у тебя) для 10000 точек вполне быстро работает на ARM CPU.
Вопрос по оптимизации текстурирования ландшафта3 мая 201217:24#17
Кирюха
если лоды для шейдеров не особо помогли ,(хотя ты еще поиграйся с дистанциями получше,), то действительно выборки сильно убили пиксельный конвейер. Тут действительно нужно завязываться на тулзы готовить большую текстуру и стримить (возможно асинхронно) с диска.
Менеджер растительности28 апр. 201218:00#8
DiSedov
>2. копирую в него (glCopyBufferSubData) те чанки, которые остаются видимыми
>3. затем стримю(glMapBufferRange + GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT ) в память участки буфера для вновь загруженных тайлов.
делай Memory Mapping + offset по позиции камеры из файла геометрии и сразу создавай буфер(если нужно удаляй старый) и лей через glBufferData, glMapBufferRange  может быть медленней.
Толковые книги по OpenGL 3/4 подскажете?26 апр. 201212:46#11
evirus
> Раньше тоже пользовался SDL, но последнее время перешел на SFML
>Кроме этого, SFML шустрее развивается.
да, только она малоизвестная. Даже русская вики про нее мало пишет. Насчет шустрее развивается, ничего что у SDL последняя версия в январе 2012, а у SFML 2009 год? ничего что у SDL список платформ поболее ?
SDL видел часто как в поделках так и в более серьезных софтинах.
COLLADA Animation18 апр. 201210:02#2
Chaos_Optima
> интересует за что отвечает jointOrient[Z,Y,X]
Судя по описанию это ось вращения + угол поворота, к примеру jointOrientY[0 1 0 44.90112] вращение по оси Y на 44 градуса, насчет rotate я думаю что какой-нибудь еще дополнительный поворот по осям, может быть относительно родительской матрицы?
попробуй составь кватернион из 3 углов поворота(yaw,pith,roll), в твоем случае из jointOrient[Z,Y,X] 0, 44.90112, 0. позиция у тебя есть, эту матрицу попробуй домножь на матрицу по 3 углам из rotate[Z,Y,X].
Не уверен насчет rotate[Z,Y,X].
Патиклы на GPU16 апр. 201215:15#36
Executor
>Будте внимательнее. Демка ГЛ, а не ДХ9.
Точно, ну да ладно, пережиток прошлого не работает на Intel.
> Правда не знаю насколько пример можно считать корректным, код не смотрел.
Не корректный, нужно отключить вертикальную синхронизацию и проверить.
Патиклы на GPU16 апр. 201214:25#33
Mikle
>на Интеле G31/G33 PointSprites не видно.
Интересно, в Driect3D 9 никакие флаги D3DCAPS9 не содержат информацию о поддержке PointSprites. Баг драйвера от Intel?
А можешь в DXDEBUG запустить?
Патиклы на GPU16 апр. 201211:02#29
Mikle
>> есть подозрение, что поинт спрайты эмулируются
> Если эмулируются геометрическим шейдером, то отлично - не будет простаивать :).
Вот это точно врядли
Сколько строк надо написать в ВАШЕМ движке, чтобы загрузить и отобразить модель?11 апр. 20129:59#11
Sergio
> _camera = s3d::CameraElement::Pointer(new s3d::CameraElement("main-camera",
> &_scene));
вот скажи мне зачем дергать выделения памяти?? у тебя что 20 типов камер с виртуальными функциями находящимися в неком списке???
> _defaultShader->setUniform("mTransform", m->finalTransform());
поиск строк? наверное std::map/std::hash_map или каждый кадр glGetUniformLocation ? а если 50 мешей в сцене?
ASD
> App* app=new App(en);
> en->runApplication(app);
>
> delete app;
> en->shutdown();
зачем new для App ? sizeof(App) наверное 200 байт от силы? Вот на 1 строку меньше уже, код проще:
int main(int argc, char* argv[])
{
  IEngine* en=InitEngine();

  if(!en)
    printf("cannot init engine\n");
  else
  {
    App app(en);
    en->runApplication(&app);
    
    en->shutdown();
  }

  return 0;
}
Totem Engine 4 Blog. Статья 4. Environment. Atmosphere Scattering. (комментарии)9 апр. 20129:56#2
Ну вообще круто, особенно про построение сетки.
Время расчета скелетной анимации.6 апр. 201210:48#22
Vorotnyak_Nazar
> П.С, Почему все хранят веса вершины в ней? А не в кости?
если я правильно понял вопрос, то 1 кость может действовать на разные вершины, а у этих вершин них свой вес.
Глянул код... тяжело на убогом Delphi читать, ну да ладно.
>TMesh.UpdateAnimation
не пойму зачем там цикл в цикле?
>TMesh.updatemesh
уже наверное говорил зачем цикл обнуления весов?

Вообще меняй подход, структуры данных.

общий принцип такой. Храним для времени t набор костей: (quternion + pos или матрица)
для всех костей:
1) для текущего времени t, находим 2 кадра из нашего набора костей где t1 и t2 время записанной анимации, тогда t1 < t < t2
2) Интерполируем их ( находим матрицу между t1 и t2)
3) проходимся по всем вершинам:
и последовательно делаем транфоммацию по номеру матрицы кости с домножением на вес вершины
Прмерный псевдокод:

float t1 = 

float t2 = 

float t = ...

// индекс кости для времени t1
int bone1 = 
// индекс кости для времени t2
int bone2 = 

for(int i = 0; i < numBones; ++i) {
...
  // получаем кость для времени t между 2 костями сохраненными на временах t1, t2
  Bones[i]  = Interolate(originalBone[bone1], originalBone[bone2], t);
...
}

// расчет иерархии


// трансформация
for(int i = 0; i < numVertex; ++i) {
  AnimVertex& vertex = animVertex[i];
  // восстановить начальную
  vertex.pos = animVerts[i].pos;
  Vector3D v = Vector3D::Zero();
  // для всех весов. тут можно четко указать сколько максимум и развернуть цикл по возможности
  // при экспорте список весов писать от 0, т.е. если 3 веса то лучше 0.5 0.3 0.2 0.0, а не 0.5 0.3 0.0 0.2
  // предполагается что семантика веса float[4], больше 4 весов на вершину прост оне нужно
  for(int j = 0; j < AnimVertex::NUM_WEIGHTS; ++j) {
    // V = V * boneMatrix * weight
    v += (vertex.pos * Bones[vertex.boneIndices[j]] * vertex.weight[j]);
  }
  // сохраняем анимированную позицию
    vertex.pos = v;
}

Время расчета скелетной анимации.5 апр. 201214:00#10
Vorotnyak_Nazar
> 3. Меш имеет два массивы(в одном координаты, нормали, текстурные координаты,а в
> другом только координаты(оригинальные))
>   Обнуляются все вершины прикрепенные к костям.
зачем ?
ты же их все равно перезапишешь вновь рассчитанными, или нет?
4. Берутся вершины из оригинального меша (второй массив),умножаются на weight*offsetmatrix*bonematrix
    и пишутся в первый массив .
> 5. Блокируются вершинный буфер и в него заливаются вершины из первого массива
> (так как массив динамический то блокирую ВБ при передачи каждой вершины(вот тут
> прокол,сегодня буду переписывать(надо блокировать один раз,
> а при заполнении смещать адрес)))
ну вот, для начала это исправь. больше 4000 локов это жесть, судя по числу вершин
Время расчета скелетной анимации.5 апр. 201211:41#5
Vorotnyak_Nazar
>П.С.1 Тут наверное у вершинам стоит добавить количество костей.
точнее число костей на вершину, у меня 2 кости.
>занимает расчет у людей и сравнить з своими показателями(а то у меня медленно. Не знаю должно ли так быть.).
буфер вершин динамический? как его лочишь? хотя в основном будет просадка на цикле трансформации вершин.
Время расчета скелетной анимации.5 апр. 201210:49#3
Vorotnyak_Nazar
А что имеется ввиду под расчетом анимации на CPU ? расчет иерархии костей или все вместе (иерархия + трансформация вершин матрицами костей)?
я на CPU считаю только иерархию у меня для 10 моделей вообще меньше 1 мс...

Правка: 5 апр. 2012 10:50

Криво интерполируются нормали в шейдере5 апр. 201210:44#24
innuendo
Не по теме вопрос. В asm коде это будет одинаково, static_cast более безопасен и компилятор выдаст предупреждение/ошибку при преобразование типов, C Style cast устарел, не безопасен и будет убран в новых версиях C++, так говорил  Бьёрн Страуструп.

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр