forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   C3D Engine (http://forum.boolean.name/showthread.php?t=16433)

pozitiffcat 12.07.2012 11:34

Ответ: C3D Engine
 
У кого есть андроид 2.3.3 и выше? Что бы пощупать демо...
ВЫложу как сделаю вывод текста с FPS на экран...

HolyDel 12.07.2012 12:01

Ответ: C3D Engine
 
у меня есть galaxy note, с андором 4.0.3

pozitiffcat 12.07.2012 12:03

Ответ: C3D Engine
 
о ништяк, как вывод текста сделаю я выложу сюда пощупать демку. и напишу результаты тестирования на моих девайсах...

HolyDel 12.07.2012 15:59

Ответ: C3D Engine
 
как будешь выводить текст? через фритайп?

jimon 12.07.2012 16:15

Ответ: C3D Engine
 
а кто-то вообще делал нормальный рендер через фритайп ? мы битмап шрифты только юзаем ибо вектор сложно растеризировать нормально на лету http://www.antigrain.com/research/font_rasterization/

SBJoker 12.07.2012 17:23

Ответ: C3D Engine
 
Битмапы рулят... хотя памяти немного жалко на них.

moka 12.07.2012 18:03

Ответ: C3D Engine
 
Могу потестить тоже на Tegra 3: HTC One X и Asus Transformer 1, также есть доступ к Samsung Galaxy Nexus (там уже попроще видео, но мощное тоже).
Имхо, если писать двиг под андройды, то фокусируйся на будущее железо, т.к. развивается рынок очень шустро, следственно пока твой движок будет пригоден для использования и пока разработчик закончит свою игру на нём, у всех почти уже будут Android 4+.

pozitiffcat 12.07.2012 19:51

Ответ: C3D Engine
 
Цитата:

Сообщение от HolyDel (Сообщение 232799)
как будешь выводить текст? через фритайп?

через текстуру

pozitiffcat 12.07.2012 19:52

Ответ: C3D Engine
 
http://rghost.ru/39173999 (20 метров архив) - fps видно плохо черный шрифт на темном фоне :D, некогда допиливть, сегодня уже времени нет, а результаты тестирования узнать хочется
Просьба за тестировать. Там папку медиа поместить в /sdcard/ocge/
короче создать каталог ocge в карте памяти, установить apk и написать сюда fps, если не запускается то прикрепить лог, он в корне карты памяти образуется ocge.log
apk файл для armv7 http://rghost.ru/39177842

pozitiffcat 12.07.2012 19:55

Ответ: C3D Engine
 
Итак:
LG P500 - 15 fps (video: adreno 200)
EXPLAY 701 - 34 fps (video: mali 400)
мой комп 600+ fps (video: NV GT240 DDR3)

HolyDel 12.07.2012 20:50

Ответ: C3D Engine
 
galaxy note.
зеленый экран и ничего не происходит
лог тоже не появился.

pozitiffcat 12.07.2012 22:42

Ответ: C3D Engine
 
проверь муть к media
/sdcard/ocge/media/
если нет лога, то возможно, у тебя путь не sdcard. Вот на планшете у меня флешка это /extsd, а внутренняя память /sdcard, может и у тебя так?

короче нужно держать медию по пути /sdcard/ocge/media проверь каким нибудь продвинутым эксплорером

HolyDel 12.07.2012 22:47

Ответ: C3D Engine
 
у меня флешка /sdcard/external_sd/ я положил во внутреннюю память.
путь к медия /sdcard/ocge/media/ (во внутренней памяти. может приложению нужны дополнительные права на работу со внутренней памятью?)

pozitiffcat 12.07.2012 22:51

Ответ: C3D Engine
 
права в манифесте прописаны. У мня на 2 девайсах работает, проверь /sdcard/ocge.log

HolyDel 12.07.2012 22:56

Ответ: C3D Engine
 
есть какой-то log.log
Код:

Init application
Running
Init window
Init GL
Setup render OpenGL render
DEBUG:  init attributes
DEBUG: plane create static mesh
DEBUG: plane generate plane static mesh
DEBUG: plane generate VBOs static mesh
DEBUG: plane_node create static mesh node
DEBUG: plane_node set static mesh plane
Enter to main loop
DEBUG: Reshape w=800, h=1280
Init application
Running
Init window
Init GL
Setup render OpenGL render
DEBUG:  init attributes
DEBUG: plane create static mesh
DEBUG: plane generate plane static mesh
DEBUG: plane generate VBOs static mesh
DEBUG: plane_node create static mesh node
DEBUG: plane_node set static mesh plane
Enter to main loop
DEBUG: Reshape w=1280, h=800
Init application
Running
Init window
Init GL
Setup render OpenGL render
DEBUG:  init attributes
DEBUG: plane create static mesh
DEBUG: plane generate plane static mesh
DEBUG: plane generate VBOs static mesh
DEBUG: plane_node create static mesh node
DEBUG: plane_node set static mesh plane
Enter to main loop
DEBUG: Reshape w=1280, h=800
Init application
Running
Init window
Init GL
Setup render OpenGL render
DEBUG:  init attributes
DEBUG: plane create static mesh
DEBUG: plane generate plane static mesh
DEBUG: plane generate VBOs static mesh
DEBUG: plane_node create static mesh node
DEBUG: plane_node set static mesh plane
Enter to main loop
DEBUG: Reshape w=800, h=1280
Init application
Running
Init window
Init GL
Setup render OpenGL render
DEBUG:  init attributes
DEBUG: plane create static mesh
DEBUG: plane generate plane static mesh
DEBUG: plane generate VBOs static mesh
DEBUG: plane_node create static mesh node
DEBUG: plane_node set static mesh plane
Enter to main loop
DEBUG: Reshape w=800, h=1280
Init application
Running
Init window
Init GL
Setup render OpenGL render
DEBUG:  init attributes
DEBUG: plane create static mesh
DEBUG: plane generate plane static mesh
DEBUG: plane generate VBOs static mesh
DEBUG: plane_node create static mesh node
DEBUG: plane_node set static mesh plane
Enter to main loop
DEBUG: Reshape w=800, h=1280
Init application
Running
Init window
Init GL
Setup render OpenGL render
DEBUG:  init attributes
DEBUG: plane create static mesh
DEBUG: plane generate plane static mesh
DEBUG: plane generate VBOs static mesh
DEBUG: plane_node create static mesh node
DEBUG: plane_node set static mesh plane
Enter to main loop
DEBUG: Reshape w=1280, h=800
Init application
Running
Init window
Init GL
Setup render OpenGL render
DEBUG:  init attributes
DEBUG: plane create static mesh
DEBUG: plane generate plane static mesh
DEBUG: plane generate VBOs static mesh
DEBUG: plane_node create static mesh node
DEBUG: plane_node set static mesh plane
Enter to main loop
DEBUG: Reshape w=800, h=1280
Init application
Running
Init window
Init GL
Setup render OpenGL render
DEBUG:  init attributes
DEBUG: plane create static mesh
DEBUG: plane generate plane static mesh
DEBUG: plane generate VBOs static mesh
DEBUG: plane_node create static mesh node
DEBUG: plane_node set static mesh plane
Enter to main loop
DEBUG: Reshape w=800, h=1280
Init application
Running
Init window
Init GL
Setup render OpenGL render
DEBUG:  init attributes
DEBUG: plane create static mesh
DEBUG: plane generate plane static mesh
DEBUG: plane generate VBOs static mesh
DEBUG: plane_node create static mesh node
DEBUG: plane_node set static mesh plane
Enter to main loop
DEBUG: Reshape w=800, h=1280
Init application
Running
Init window
Init GL
Setup render OpenGL render
DEBUG:  init attributes
DEBUG: plane create static mesh
DEBUG: plane generate plane static mesh
DEBUG: plane generate VBOs static mesh
DEBUG: plane_node create static mesh node
DEBUG: plane_node set static mesh plane
Enter to main loop
DEBUG: Reshape w=800, h=1280
Init application
Running
Init window
Init GL
Setup render OpenGL render
DEBUG:  init attributes
DEBUG: plane create static mesh
DEBUG: plane generate plane static mesh
DEBUG: plane generate VBOs static mesh
DEBUG: plane_node create static mesh node
DEBUG: plane_node set static mesh plane
Enter to main loop
DEBUG: Reshape w=800, h=1280

не твое?

pozitiffcat 12.07.2012 22:58

Ответ: C3D Engine
 
походу старый бинарник попробуй это http://rghost.ru/39177842
в новом ocge.log
походу эклипс тупит
а я понял! я для арм 7 не компилил новую версию щас погоди

pozitiffcat 12.07.2012 23:04

Ответ: C3D Engine
 
Axelynx вот попробуй http://rghost.ru/39177842
Заработало?

HolyDel 12.07.2012 23:47

Ответ: C3D Engine
 
да. работает. шустренько - 24 fps (это при разрешении 1280 x 720)

pozitiffcat 12.07.2012 23:49

Ответ: C3D Engine
 
Супер! Спасибо... Да там есть еще че ускорять, я просто не занимался... я переписывал двиг с нуля.
Текст прозрачный? А то на телефоне он на белом фоне блендинг не работает, а на планшете ок

HolyDel 12.07.2012 23:50

Ответ: C3D Engine
 
текст с белой каемкой. походу без альфаблендинга.

pozitiffcat 12.07.2012 23:55

Ответ: C3D Engine
 
Каемка это я так шрифт сгенерировал, а там прям квадраты белые, когда блендинг не включается...

HolyDel 13.07.2012 14:23

Ответ: C3D Engine
 
зачем тебе интерфейс рендерера? ты хочешь cross gapi?

pozitiffcat 13.07.2012 15:33

Ответ: C3D Engine
 
Сначала думал, что есть отличия GL/ES, вот и написал интерфейс, можно директ запилить когда нечего делать будет, но для этого надо уходить от GL синтаксиса, более абстрактно сделать класс, у меня и окошки работают на freeGlut, SDL, Android API.. на любой вкус. Хотя SDL можно выпилить, у меня freeGlut, норм работает, компилится с сорцов без либ.
Я не ищу сложных путей, по фозможности использую проверенные временем библиотеки. Юзать freeimage не стал за не надобностью, раз есть свой формат моделей, так пусть будет свой формат текстур, накрайняк можно будет потом хранить текстуры прямо в моделях.. но это так на будущее.

HolyDel 13.07.2012 15:56

Ответ: C3D Engine
 
Код:

RENDER->bindBuffer(_vbo, BT_ARRAY);
        RENDER->vertexAttribPointer(shader->getPositionAttrib(), 3, RENDER->oFLOAT(), RENDER->oFALSE(),  sizeof(Vertex), (const void*)0);
        if(shader->getNormalAttrib() != -1) RENDER->vertexAttribPointer(shader->getNormalAttrib(), 3, RENDER->oFLOAT(),  RENDER->oFALSE(),sizeof(Vertex), (const void*)12);
        if(shader->getTexcoordAttrib() != -1)RENDER->vertexAttribPointer(shader->getTexcoordAttrib(), 2, RENDER->oFLOAT(), RENDER->oFALSE(), sizeof(Vertex), (const void*)24);

        RENDER->bindBuffer(_ibo, BT_ELEMENT);
        RENDER->drawElements(RENDER->oTRIANGLES(), _icount, RENDER->oUNSIGNED_SHORT(), 0);

семь виртуальных вызовов на отрисовку вместо одного... такто спички, но всеж...

pozitiffcat 13.07.2012 16:21

Ответ: C3D Engine
 
при 60 fps, это мешать не будет, прирост будет 0.5 фпс если убрать интерфейс.
При 1000 фпс, различие может быть в 50 fps. но какая нам разница, если глаз не воспринимает 1000 фпс, можно ограничиться 100 фпс.
Зачем нам гнаться за этими 0.5 % прироста, оптимизировав код. Лучше реализовывать чувствительные к ГАПИ оптимизации.

PS. компиляторы давно научились сами оптимизировать подобный код.

pozitiffcat 16.07.2012 16:35

Ответ: C3D Engine
 
Поднял на 20% FPS - это без Frustum. Запилил тач в андроиде. Сделал нормальный шрифт.
Осталось, нормальный фрустум, конвертирование текстур прям при экспорте из макса. Проверить оптимизации, сделать нормальную доку, вытащить все в DLL, мастер для Eclipse, Visual Studio, и можно будет пощупать.
После этого собираюсь запилить наконец-то тени, point и spot освещение, пока не решил per-vertex или per-pixel

moka 16.07.2012 17:11

Ответ: C3D Engine
 
Освещение ведь на шейдерах, делай оба варианта. С возможностью переключения.
Ведь если делать толково, то deferred, а там да, пиксельное сразу лучше.

HolyDel 16.07.2012 18:09

Ответ: C3D Engine
 
Цитата:

Поднял на 20% FPS
каким образом? если не секрет ))

pozitiffcat 16.07.2012 19:39

Ответ: C3D Engine
 
один раз за кадр множу projection matrix и view matrix, в шейдер передается modelMatrix и viewprojMatrix, и множится в шейдере. Раньше у каждого объекта вычислялась modelview матрица ну и анимацию вынес в ГПУ

ABTOMAT 16.07.2012 20:54

Ответ: C3D Engine
 
Неплохо!

HolyDel 16.07.2012 20:59

Ответ: C3D Engine
 
непробывал множить матрицы на цпу, а в шейдере не множить матрицы вообще? этож мобилка, там немного шейдерных процессоров.

pozitiffcat 17.07.2012 09:13

Ответ: C3D Engine
 
гпу всегда быстрее цпу. Тем более прирост на лицо

jimon 17.07.2012 12:07

Ответ: C3D Engine
 
Цитата:

Сообщение от pozitiffcat (Сообщение 233086)
гпу всегда быстрее цпу. Тем более прирост на лицо

на мобильниках зачастую скелетка быстрее на цпу + neon, чем на гпу, потому что гпу крутится на низких частотах (~100-400 мгц) и у него всего 2-4 ядра, когда цпу под 1+ ггц работает

ps. еще memcpy через neon быстрее чем обычный :crazy:

HolyDel 17.07.2012 12:10

Ответ: C3D Engine
 
Цитата:

Тем более прирост на лицо
т.е. я правильно понимаю, что считать одну матрицу на цпу, и передавать ее на объект дороже чем передавать две матрицы на объект и считать их на мобильном гпу для КАЖДОЙ вершины?

pozitiffcat 17.07.2012 13:06

Ответ: C3D Engine
 
Ну у меня прирост в производительности дало на гигогерцовом cortexA8 проце и на 600 мегагерцовом тоже.
PS. вершин у каждой модели в среднем 1000

pozitiffcat 17.07.2012 14:28

Ответ: C3D Engine
 
Добавил файловые системы - дисковую и zip

HolyDel 17.07.2012 20:06

Ответ: C3D Engine
 
файлы советую сделать подмапленными. где тут была статья джимона. дает прирост в 15% по скорости. + ненадо создавать буфера.

pozitiffcat 17.07.2012 20:14

Ответ: C3D Engine
 
Что такое подмапленые может я так и делаю...

HolyDel 17.07.2012 20:22

Ответ: C3D Engine
 
http://forum.boolean.name/showthread.php?t=16880

pozitiffcat 24.07.2012 15:48

Ответ: C3D Engine
 
Сделал визард для эклипса (как отдельное приложение, проще поддерживать). Генерирует готовый проект, который рисует пустую сцену. Программисту остается лишь добавлять код. Сразу либы кладет куда надо и т.д. со стандартным функционалом визардов эклипса особо не развернешься без костылей

pozitiffcat 24.07.2012 17:01

Ответ: C3D Engine
 
Добавил некоторые вещи в TODO, думаю выложу бету, когда закончу с документированием. Сейчас занимаюсь документированием. Выложу бинарники библиотек к студии и мастер к эклипсу. Бинарники для андроида будут идти с мастером. Эклипс должен быть настроен на андроид сдк, и установлен ADT плагин

pozitiffcat 26.07.2012 20:39

Ответ: C3D Engine
 
Запилил динамические тени от одного источника освещения

pozitiffcat 27.07.2012 11:44

Ответ: C3D Engine
 
Добавил callback класс для работы с шейдерами и entity - можно творить что угодно
выглядит это следующим образом:
Код:

class SHCallback : public ocge::IShaderCallback
{
        ocge::Oint mycolor;
public:
        void onCreate(ocge::IShader* shader)
        {
                mycolor = shader->getUniformHandle("mycolor");
        }
        void onEntityRender(ocge::IShader* shader, ocge::IEntity* entity)
        {
                if(entity->getName() == "cube")
                        shader->setUniform4f(mycolor,0,1,0,1);
                else
                        shader->setUniform4f(mycolor,1,0,0,1);
        }
};

Код:

ocge::IShader* cbshader = engine->createShader(sh_vert, sh_frag);
        cbshader->setCallback(new SHCallback());

Код:

cube->setShader(cbshader);
Чорт. Никак не зарелизю бэтку... стока в голову лезет идей, которыми я хочу поделиться.

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

HolyDel 27.07.2012 12:04

Ответ: C3D Engine
 
Цитата:

if(entity->getName() == "cube")
shader->setUniform4f(mycolor,0,1,0,1);
else
shader->setUniform4f(mycolor,1,0,0,1);
чото ты все намешал.
коллбэк вешаем или на шейдер или на ентити. а у тебя как то на все вместе.

pozitiffcat 27.07.2012 12:13

Ответ: C3D Engine
 
так надо чтобы onCreate вызывался один раз когда устанавливаем в шейдер колбэк. Представь скока раз вызовется onCreate при установке колбыка на каждый entity. У меня onCreate вызывается только при setCallBack, т.к. установки хэндлов юниформов касаются только шейдера а не entity.
обработка ентити в колбэке нужна например для генерации матрицы какой то особенной и т.п. еще будет метод onSceneRender
onSceneRender выполняется 1 раз на сцену, а onEntityRender для каждого ентити
Короче может я плохо объяснил, но вобщем так надо, это моя реализация, и она ничем не мешает разработке. ))

pozitiffcat 27.07.2012 12:19

Ответ: C3D Engine
 
Например так:
Код:

class SHCallback : public ocge::IShaderCallback
{
        ocge::Oint mycolor;
        ocge::Oint MVP;
        glm::mat4 VP;
public:
        void onCreate(ocge::IShader* shader)
        {
                mycolor = shader->getUniformHandle("mycolor");
                MVP = shader->getUniformHandle("MVP");
        }
        void onEntityRender(ocge::IShader* shader, ocge::IEntity* entity)
        {
                glm::mat4 mvp = VP * entity->getModelMatrix(true);
                shader->setUniformMat4fv(MVP, 1, glm::value_ptr(mvp));
                if(entity->getName() == "cube")
                        shader->setUniform4f(mycolor,0,1,0,1);
                else
                        shader->setUniform4f(mycolor,1,0,0,1);
        }
        void onSceneRender(ocge::IShader* shader, ocge::ISceneManager* smgr)
        {
                VP = engine->getProjectionMatrix() * smgr->getCamera()->getViewMatrix();
        }
};


HolyDel 27.07.2012 12:43

Ответ: C3D Engine
 
по крайней мере идея стала понятна.

Цитата:

smgr->getCamera()
одна камера в сцене?

pozitiffcat 27.07.2012 13:31

Ответ: C3D Engine
 
нет камер скока угодно, тока одна камера активна. На вьюпорты не делятся, ибо у меня не такой универсальный движок. Можно заюзать 2D спрайт с текстурой срендереной с какойнибудь камеры (это если например захочется сделать зеркало заднего вида)

pozitiffcat 27.07.2012 17:43

Ответ: C3D Engine
 
Загладил стандартные тени.
Добавил установку атрибутов cast shadows и receive shadows, их можно использовать в своих шейдерах
Включаются тени 1 строкой кода
PHP код:

light->setCastShadow(true); 

PS. страшный FPS из-за intel 4500, у меня даже без теней такой fps на встроеном видео
UPD, будет мощная система колбэков. Я продумал тут кое чего.. это очень удобный механизм для разработки и управлением всем. Можно очень гибко использовать объекты, вплоть до создания своих типов

pozitiffcat 01.08.2012 17:11

Ответ: C3D Engine
 
Ну вот я и закончил со спецэффектами, да и впринципе список ToDo почти подошел к концу, теперь наконец допишу доку и выложу скоро бету (примерно неделя)
фото отчет: запилил постэффекты
4х проходный блум (фозможно будет изкаробки, отдельная функция уже есть)

HolyDel 01.08.2012 19:24

Ответ: C3D Engine
 
что на скрине? какой это блум? это же блур.

pozitiffcat 01.08.2012 21:08

Ответ: C3D Engine
 
блум предусматривающий сглаживание картинки.. подпилить просто надо, особо не разбирался

pozitiffcat 01.08.2012 21:42

Ответ: C3D Engine
 
Помоему вполне адекватный блум вот посмотрите:

Mhyhr 02.08.2012 00:18

Ответ: C3D Engine
 
Хорошо бы в динамике посмотреть, и разрешение поболее.

pozitiffcat 02.08.2012 09:22

Ответ: C3D Engine
 
http://rghost.ru/39526910
Вот демка, что на скрине, в динамике. Крутить камерой, зажимаете ЛКМ и вращаете

HolyDel 02.08.2012 10:29

Ответ: C3D Engine
 
он у тебя кроссплатформенный? и андроид и винда? круто.
в динамике смотрится лучше, чем на скринах.

pozitiffcat 02.08.2012 10:45

Ответ: C3D Engine
 
Спасибо дружище =) на андроиде тоже работает, но там немного подглючивает формат текстур, получаются точки на экране с постэффектом как будто смотришь старое кино на старой пленке, вобщем тупо, я щас копаю в эту сторону
PS. а какие у вас FPS? у меня на интеле 4500 20 фпс дает эта сцена...

HolyDel 02.08.2012 10:56

Ответ: C3D Engine
 
на 6850M дает 177 фпс если смотреть на сцену и 204 если отвернуться и смотреть на скайбокс.

pax 02.08.2012 10:59

Ответ: C3D Engine
 
FPS 39, i5-2500K (встроенное видео), камеру не двигал, тени странные и блум тоже странноват

pozitiffcat 02.08.2012 11:05

Ответ: C3D Engine
 
pax тени странные из-за маленького разрешения текстуры (там косяк маленький немогу победить), а чем блум непонравился?

pax 02.08.2012 11:22

Ответ: C3D Engine
 
Как-то сильно засвечивает, эффект можно уменьшить?

pozitiffcat 02.08.2012 11:47

Ответ: C3D Engine
 
Эффек можно уменьшить естественно...

pozitiffcat 02.08.2012 17:25

Ответ: C3D Engine
 
Программируемые частицы:
Система частиц этого движка отличается от системы частиц других движков (чесно хз как в других движках, но думаю не так =)). Здесь вся логика программируется, предоставив необходимый инструмент. Опять же колбэки.

HolyDel 02.08.2012 18:28

Ответ: C3D Engine
 
Цитата:

Система частиц этого движка отличается от системы частиц других движков (чесно хз как в других движках, но думаю не так =)). Здесь вся логика программируется, предоставив необходимый инструмент. Опять же колбэки.
приведи пример кода.

у меня, например разделено между спрайтовыми системами и системами частиц.

частицы обновлятся на ГПУ, спрайты на ЦПУ.


Часовой пояс GMT +4, время: 20:28.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot