пятница, 31 октября 2008 г.

Подгонка шейдеров под все графические API

Пока Direct3D10 рендер ещё сырой, иногда возвращаюсь к нему и постепенно дописываю.
Cейчас избавился в движке от OpenGL state(передаю матрицы трансформаций напрямую) .
Когда он был заменял макросы на соответствующие параметры при компиляции из Cg в GL_ARB_vertex_program. Код GLSL полученный из Cg не содержит GL state - видно nVidia сразу продумала это на будущее как deprecated функциональность.
При использовании этих макросов компилятор HLSL для Direct3D10 почему-то неверно распределял регистры в отличие от компилятора HLSL Direct3D9. Я пока не стал разбираться с этим, а временно скинул и переписал шейдеры специально для Direct3D10. Немного переписав шейдеры и добавив системный макрос D3D10 я избавился отлишней папки с шейдерами для Direct3D10.Настало время разобраться с использованием Cg для Direct3D10.

среда, 22 октября 2008 г.

Добавлена оптимизация перемножения матриц через SSE

Добавил в движок поддержку SSE в частности для перемножения матриц 4x4, 4x3. Написал аллокатор для STL std::vector выделяющий память, выровненную по границе 16 байт. Используются функции _aligned_malloc,_aligned_free. Большое спасибо Арсению Капулкину(Zeux) за исправленный код.

пятница, 3 октября 2008 г.

Разработка 3D движка

Итак, постепенно сюда буду писать прогресс разработки собственного трехмерного движка. Этой идеей уже сейчас никого не удивишь. Очень много людей пытаются написать 3D движок.
Целью разработки прежде всего является желание стать профессиональным программистом.
Разработка происходит в свободное время, временами с перерывами и ненормированным графиком(2-3 часа в день в среднем) и начата довольно давно где-то в конце 2004 года. В общей сложности общее время плотной работы 2 года. Одновременно с движком изучался С/C++ 3D графика и остальные смежные области, так и программирование в целом. Особого плана работы не было. Делалось то что получалось постепенно расширялась функциональность, проводилась оптимизация, улучшение архитектуры. Некоторые ошибки, недочёты, до сих пор не исправлены, Причины тут разные: либо отсутствие времени, опыта, или желание улучить то что по силам в данный момент, вернувшись к тому что поправить/доработать сложней. Движок не претендует на полноту и совершенство т.к. все понимают задача эта нетривиальная. Итак опишу что сейчас сделано и реализовано:
I. Не графическая функциональность
1) Физика: гора неработающего кода на Tokamak в дальнейшем будет выкинут и заменен на Ageia PhysX. Есть базовая функциональность. позволяющая в будущем добавить физическую библиотеку
2) Звук на основе библиотеки OpenAL с потоковой загрузкой ogg(libvorbis) и mp3(libmad),
3D звук(требует тестирования)
3) Поддержка Lua скриптов с доступом из скрипта нескольких переменных что позволяет ка минимум менять анимацию, реализовывать слежение за камерой, Debug Log у консоль из скриптов
4) Консоль - незаменимое средство отладки диагностики и управления движком от перезагрузки ресурсов до смены текущего рендера. Является так-же средством просмотра лога в реальном времени изменения/переключения режимов работы движка и смены рендера.
5) Самый начальный уровень сети инициализация сокетов Брекли создание сервера и клиентов. Посылка данных.(требуется доработка)
6) Защита от фатальных ошибок(целочисленное деление на ноль, нарушенный доступ к памяти), протоколирование работы, c записью Dump'а памяти на диск.
7) видео проигрыватель на основе theora;
8) файловая система с поддержкой zip;
II. Графика
1) Поддержка Direct3D9/Direct3D10/OpenGL. Смена рендера возможно командой консоли changerender 0(1)(2) где параметр тип рендера.
2) поддержка шейдерных языков HLSL/Cg/GLSL(из Сg кода)
3) Shadow Map тени с само затенением.(Standart Shadow Map) - в данный момент ведется улучшения теней посредством алгоритма Parallel Split Shadow Map.
4) попиксельное освещение.
5) Свой формат шейдеров(описание шейдера + константы) с менеджером шейдеров, Гибкая возможность задания констант, не изменяя код движка, прямо в файле
6) Свой формат материалов на основе идей из RenderMonkey и Ogre.

7) Гибкая система частиц с набором неограниченного числа различных независимых эмиттеров со своим набором аффекторов. + сохранение/загрузка из файла с менеджированием.
8) Иерархическая организация сцены в виде Scene Graph.
9) Поддержка динамических объектов в Scene Graph.
10) Frustum Culling(Оптимизированая проверка Box'а всего по 2 точкам)
11) Occluision Culling(Software, ведутся исследования для реализации Иеррахического Occlusion Query HQQ)
12) Рендер множества объектов(как в виде генерации мешей, на площади или текстурированных прямоугольников(плашек), в данный момент используется для редера растительности)
13) Свой формат статических моделей;
14) Скелетная анимация + свой формат моделей;
15) Морфичная анимация + свой формат моделей;
16) Рендеринг ландшафта с использованием технологии "Chunked Lod"(требует заделывания щелей между лодами);
17) Задание отсечения объектов по дистанции;
18) Задание альфа теста по дистанции;
19) Лоды для шейдеров(возможно требует доработки)
20) Менеджер полно экранного постпроцессинга с загрузкой описания постпроцессинга из файла. (Bloom, Depth of Filed)


Из тулзов разработан редактор системы частиц, экспортер скелетной
и морфичной анимации из 3DS Max, экспортер статических мешей.

Многие спросят зачем используется OpenGL? Тут все просто это первый API который я начал изучать, Не хочу кидать его поддержку т.к. там не так много ошибок как раньше хотя поддерживать его сложней всего, тут холивар устраивать не будем, у каждого есть мнение на этот счет. Мне кажется профессионал должен знать в совершенстве все 3D API.

Код писался на C/C++. В коде отсутствуют глобальные переменные и функции(кроме WinMain) Используется STL/boost(boost::any, boost::shared_ptr). Код по возможности писался кросплатформенным. Движок гарантированно компилится на Microsoft Visual C++ 2005/2008, Intel C++ 10.x, gcc(MinGW) с последним компилятором возникли проблемы при компиляции Direct3D10.

Пока скриншоты выкладывать не буду, хотя есть что показать поправлю побольше ошибок + немного улучшу.