Сообщения на форуме пользователя Andrey (21 стр.)
Быстрое отображение множества спрайтов поверх основной сцены | 14 мая 2012 | 13:25 | #8 |
---|
bugman
> Перевод координат делаю через GLUproject исходя из матриц мира.
а где ты взял GLUproject для OpenGL ES 1.1 ?
>а по поводу матрицы проекции можно поподробнее?
я бы хранил координаты значков уже в мировых координатах, GLUproject или ее аналог для OpenGL ES 1.1(кстати надеюсь не double ?) требует 2 матрицы, модельно-видовую и проекционную, внутри функции она матрицы перемножает. Напиши свой аналог функции сделай ее встраиваемой и передавай готовую перемноженную матрицу modelView * proj, ведь она не меняется от значка до значка. Для каждого значка сэкономишь на перемножении матриц, разгрузив CPU. Именно так я и сделал. У меня похожая задача, пересчет координат текста(ну символ это квадрат тот-же значок что у тебя) для 10000 точек вполне быстро работает на ARM CPU.
> Перевод координат делаю через GLUproject исходя из матриц мира.
а где ты взял GLUproject для OpenGL ES 1.1 ?
>а по поводу матрицы проекции можно поподробнее?
я бы хранил координаты значков уже в мировых координатах, GLUproject или ее аналог для OpenGL ES 1.1(кстати надеюсь не double ?) требует 2 матрицы, модельно-видовую и проекционную, внутри функции она матрицы перемножает. Напиши свой аналог функции сделай ее встраиваемой и передавай готовую перемноженную матрицу modelView * proj, ведь она не меняется от значка до значка. Для каждого значка сэкономишь на перемножении матриц, разгрузив CPU. Именно так я и сделал. У меня похожая задача, пересчет координат текста(ну символ это квадрат тот-же значок что у тебя) для 10000 точек вполне быстро работает на ARM CPU.
Вопрос по оптимизации текстурирования ландшафта | 3 мая 2012 | 17:24 | #17 |
---|
Кирюха
если лоды для шейдеров не особо помогли ,(хотя ты еще поиграйся с дистанциями получше,), то действительно выборки сильно убили пиксельный конвейер. Тут действительно нужно завязываться на тулзы готовить большую текстуру и стримить (возможно асинхронно) с диска.
если лоды для шейдеров не особо помогли ,(хотя ты еще поиграйся с дистанциями получше,), то действительно выборки сильно убили пиксельный конвейер. Тут действительно нужно завязываться на тулзы готовить большую текстуру и стримить (возможно асинхронно) с диска.
Менеджер растительности | 28 апр. 2012 | 18:00 | #8 |
---|
DiSedov
>2. копирую в него (glCopyBufferSubData) те чанки, которые остаются видимыми
>3. затем стримю(glMapBufferRange + GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT ) в память участки буфера для вновь загруженных тайлов.
делай Memory Mapping + offset по позиции камеры из файла геометрии и сразу создавай буфер(если нужно удаляй старый) и лей через glBufferData, glMapBufferRange может быть медленней.
>2. копирую в него (glCopyBufferSubData) те чанки, которые остаются видимыми
>3. затем стримю(glMapBufferRange + GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT ) в память участки буфера для вновь загруженных тайлов.
делай Memory Mapping + offset по позиции камеры из файла геометрии и сразу создавай буфер(если нужно удаляй старый) и лей через glBufferData, glMapBufferRange может быть медленней.
Толковые книги по OpenGL 3/4 подскажете? | 26 апр. 2012 | 12:46 | #11 |
---|
evirus
> Раньше тоже пользовался SDL, но последнее время перешел на SFML
>Кроме этого, SFML шустрее развивается.
да, только она малоизвестная. Даже русская вики про нее мало пишет. Насчет шустрее развивается, ничего что у SDL последняя версия в январе 2012, а у SFML 2009 год? ничего что у SDL список платформ поболее ?
SDL видел часто как в поделках так и в более серьезных софтинах.
> Раньше тоже пользовался SDL, но последнее время перешел на SFML
>Кроме этого, SFML шустрее развивается.
да, только она малоизвестная. Даже русская вики про нее мало пишет. Насчет шустрее развивается, ничего что у SDL последняя версия в январе 2012, а у SFML 2009 год? ничего что у SDL список платформ поболее ?
SDL видел часто как в поделках так и в более серьезных софтинах.
COLLADA Animation | 18 апр. 2012 | 10: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].
> интересует за что отвечает 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].
Патиклы на GPU | 16 апр. 2012 | 15:15 | #36 |
---|
Executor
>Будте внимательнее. Демка ГЛ, а не ДХ9.
Точно, ну да ладно, пережиток прошлого не работает на Intel.
> Правда не знаю насколько пример можно считать корректным, код не смотрел.
Не корректный, нужно отключить вертикальную синхронизацию и проверить.
>Будте внимательнее. Демка ГЛ, а не ДХ9.
Точно, ну да ладно, пережиток прошлого не работает на Intel.
> Правда не знаю насколько пример можно считать корректным, код не смотрел.
Не корректный, нужно отключить вертикальную синхронизацию и проверить.
Патиклы на GPU | 16 апр. 2012 | 14:25 | #33 |
---|
Mikle
>на Интеле G31/G33 PointSprites не видно.
Интересно, в Driect3D 9 никакие флаги D3DCAPS9 не содержат информацию о поддержке PointSprites. Баг драйвера от Intel?
А можешь в DXDEBUG запустить?
>на Интеле G31/G33 PointSprites не видно.
Интересно, в Driect3D 9 никакие флаги D3DCAPS9 не содержат информацию о поддержке PointSprites. Баг драйвера от Intel?
А можешь в DXDEBUG запустить?
Патиклы на GPU | 16 апр. 2012 | 11:02 | #29 |
---|
Mikle
>> есть подозрение, что поинт спрайты эмулируются
> Если эмулируются геометрическим шейдером, то отлично - не будет простаивать :).
Вот это точно врядли
>> есть подозрение, что поинт спрайты эмулируются
> Если эмулируются геометрическим шейдером, то отлично - не будет простаивать :).
Вот это точно врядли
Сколько строк надо написать в ВАШЕМ движке, чтобы загрузить и отобразить модель? | 11 апр. 2012 | 9: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 строку меньше уже, код проще:
> _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 апр. 2012 | 9:56 | #2 |
---|
Ну вообще круто, особенно про построение сетки.
Время расчета скелетной анимации. | 6 апр. 2012 | 10:48 | #22 |
---|
Vorotnyak_Nazar
> П.С, Почему все хранят веса вершины в ней? А не в кости?
если я правильно понял вопрос, то 1 кость может действовать на разные вершины, а у этих вершин них свой вес.
Глянул код... тяжело на убогом Delphi читать, ну да ладно.
>TMesh.UpdateAnimation
не пойму зачем там цикл в цикле?
>TMesh.updatemesh
уже наверное говорил зачем цикл обнуления весов?
> П.С, Почему все хранят веса вершины в ней? А не в кости?
если я правильно понял вопрос, то 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 апр. 2012 | 14:00 | #10 |
---|
Vorotnyak_Nazar
> 3. Меш имеет два массивы(в одном координаты, нормали, текстурные координаты,а в
> другом только координаты(оригинальные))
> Обнуляются все вершины прикрепенные к костям.
зачем ?
ты же их все равно перезапишешь вновь рассчитанными, или нет?
4. Берутся вершины из оригинального меша (второй массив),умножаются на weight*offsetmatrix*bonematrix
и пишутся в первый массив .
> 5. Блокируются вершинный буфер и в него заливаются вершины из первого массива
> (так как массив динамический то блокирую ВБ при передачи каждой вершины(вот тут
> прокол,сегодня буду переписывать(надо блокировать один раз,
> а при заполнении смещать адрес)))
ну вот, для начала это исправь. больше 4000 локов это жесть, судя по числу вершин
> 3. Меш имеет два массивы(в одном координаты, нормали, текстурные координаты,а в
> другом только координаты(оригинальные))
> Обнуляются все вершины прикрепенные к костям.
зачем ?
ты же их все равно перезапишешь вновь рассчитанными, или нет?
4. Берутся вершины из оригинального меша (второй массив),умножаются на weight*offsetmatrix*bonematrix
и пишутся в первый массив .
> 5. Блокируются вершинный буфер и в него заливаются вершины из первого массива
> (так как массив динамический то блокирую ВБ при передачи каждой вершины(вот тут
> прокол,сегодня буду переписывать(надо блокировать один раз,
> а при заполнении смещать адрес)))
ну вот, для начала это исправь. больше 4000 локов это жесть, судя по числу вершин
Время расчета скелетной анимации. | 5 апр. 2012 | 11:41 | #5 |
---|
Vorotnyak_Nazar
>П.С.1 Тут наверное у вершинам стоит добавить количество костей.
точнее число костей на вершину, у меня 2 кости.
>занимает расчет у людей и сравнить з своими показателями(а то у меня медленно. Не знаю должно ли так быть.).
буфер вершин динамический? как его лочишь? хотя в основном будет просадка на цикле трансформации вершин.
>П.С.1 Тут наверное у вершинам стоит добавить количество костей.
точнее число костей на вершину, у меня 2 кости.
>занимает расчет у людей и сравнить з своими показателями(а то у меня медленно. Не знаю должно ли так быть.).
буфер вершин динамический? как его лочишь? хотя в основном будет просадка на цикле трансформации вершин.
Время расчета скелетной анимации. | 5 апр. 2012 | 10:49 | #3 |
---|
Vorotnyak_Nazar
А что имеется ввиду под расчетом анимации на CPU ? расчет иерархии костей или все вместе (иерархия + трансформация вершин матрицами костей)?
я на CPU считаю только иерархию у меня для 10 моделей вообще меньше 1 мс...
А что имеется ввиду под расчетом анимации на CPU ? расчет иерархии костей или все вместе (иерархия + трансформация вершин матрицами костей)?
я на CPU считаю только иерархию у меня для 10 моделей вообще меньше 1 мс...
Правка: 5 апр. 2012 10:50
Криво интерполируются нормали в шейдере | 5 апр. 2012 | 10:44 | #24 |
---|
innuendo
Не по теме вопрос. В asm коде это будет одинаково, static_cast более безопасен и компилятор выдаст предупреждение/ошибку при преобразование типов, C Style cast устарел, не безопасен и будет убран в новых версиях C++, так говорил Бьёрн Страуструп.
Не по теме вопрос. В asm коде это будет одинаково, static_cast более безопасен и компилятор выдаст предупреждение/ошибку при преобразование типов, C Style cast устарел, не безопасен и будет убран в новых версиях C++, так говорил Бьёрн Страуструп.