пятница, 30 декабря 2011 г.

GUI. FUCK YEAH, переделал рендеринг!








Вот оно, ребята, GUI моей мечты!  :D   Не, ну оформление конечно кака, но не суть )  Главное ведь что оно своё :3

upd: дада! Опять без скина GUI )  Скины поддерживаются но мне лениво их рисовать :D

Что изменилось:

Теперь рендеринг всего GUI идёт обычно в 1-5 DIP-ов а не в 100500 как раньше.  Сам по себе GUI не только может, но и рисуется ровно в 1 DIP, однако дополнительные ДИП-ы нужны, если в нём юзаются пользовательские текстуры!   На скрине, приведённом выше, количество DIP-ов = 3 потому что вон та хренька красная сверху слева - это текстура сцены, которая какраз перед рендером GUI и рисуется. Из за неё и не 1 а 3 дипа:  рисуем GUI до картинки, рисуем картинку, рисуем остальное.

То есть я вместо моего адски дебилоидного рендеринга (каждый элемент рисовал сам себя, имел СВОЙ вершинный и константный буфер..омг) сделал чоткий батчинг : )

На самом деле это конечно не сложно совсем. Но кое что изначально слегка напрягло:  родительские контролы должны собой обрезать дочерние контролы, чтобы дочерние не рендерились за границами родительских. Раньше я рекурсивно рендерил, постоянно спуская ScissorRectangle и применяя его для каждого контрола.  И было всё вздрыжне. НО! Теперь то у меня всё всё всё может нарисоваться за 1 DIP! И Scissor хардварный не применить (  Бида!  Вот пришлось симулировать его - вручную обрезаю scissor-ом квады контролов  (модифицирую геометрию и текстурные координаты квадов). Впринципе тоже детсвкая задача : )   Обрезание геометрии делается прямо во время её генерации, а генерация вызывается если изменился scissor. Всё просто.


На скрине новые контролы (сейчас сел и допилил их):

1. ScrollBar  - он один для вертикального и горизонтального скроллирования! Конструктор требует, чтобы юзер указал направление скроллинга

2. ScrollablePlane - вон тот квадратик посреди скрина с 2 скроллами сразу.   ScrollablePlane - наследник Plane  + добавил скроллы.  Можно скроллить теперь контент очень удобно : )  Надо бы прикрутить "кинетические скроллы" (точнее эти модифицировать), чтобы можо было дёрнуть ползунок, а он ещё будет некоторое время двигаться, останавливаясь  (как сейчас на мобилах любят делать)


Adios, ушёл дальше болеть : (

четверг, 1 декабря 2011 г.

Блин

С кем бы замутить игру под iPhone и заработать миллион )  Что ж все такие ленивые то..

Извращения в С++

Начал постигать всяческие извращения, которые можно замутить в С++  ^__^

Первое, что пришло в голову - подменить у класса виртуальный метод  :3 Легального способа тут конечно нет, но just for fun можно VisualStudio-only намутить код ) Всё тут просто - у каждого объекта любого класса при наличии в классе виртуальных методов в самом начале записывается указатель на таблицу виртуальных методов этого класса. Таблица - просто набор указателей на методы! Осталось написать подложный метод и перезаписать указатель в таблице виртуальных методов ^^ Что я, собственно, и сделал. И.. и обломался: access violation writing location... )

vtable записывается в read-only память : \  Бида...  казалось бы ) Но за что я люблю С++  (в отличае от шарпа на котором раньше писал) - в нём можно сделать всё, даже то, что запрещено  :D

VirtualQuery, VirtualProtect спасут отца Русской демократии.

struct Foo
{
virtual void VirtualMethod(){
printf("VIRTUAL METHOD\n");
}
};

void ReplacementFunc(){
printf("LOL FUNCTION!!\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
typedef void (*func)();
 Foo* foo = new Foo();

size_t* vtbl;
 memcpy(&vtbl, foo, sizeof(size_t));

func ptr = &ReplacementFunc;

MEMORY_BASIC_INFORMATION meminfo;
DWORD oldprotect;
VirtualQuery(&vtbl[0], &meminfo, sizeof(meminfo));
VirtualProtect(meminfo.BaseAddress, 4, PAGE_EXECUTE_READWRITE, &oldprotect);

memcpy(&vtbl[0], &ptr, sizeof(func));

 foo->VirtualMethod();  //тадааам ) В консоли:  LOL FUNCTION!!
getchar();
return 0;
}

Блджад, почему тут нету тега [code]  ?  Или есть..

Буду искать новые извращения и потом добавлять сюда, а пока надо делами заниматься.

пятница, 18 ноября 2011 г.

Кривые Безье

Появилось время для редактора )

Продолжил пилить, фиксить баги и т.п.  Ноды вроде работают без проблем!  Но ноды эти надо связывать между собой! Т.е. выходы одних с входами других.

Для этого везде юзаются кривые Безье. Вот я и подумал - а чем я хуже? : )   Решил погуглить тему, так как раньше не нужна была - не занимался.  Погуглил, покурил..  ох ёпт!!  Я то думал там будет ацкая жесть с километровыми формулами, а там оказалась детская задачка ))

Вот на своём софтрендере замтил отрисовку этих самых кривых ^^ С-К-А-Ч-А-Т-Ь    90кб всего, статично слинковал с рантаймом (просить не должно). M$ Windows only.



воскресенье, 13 ноября 2011 г.

Пилю дальше GUI )

Опять переписал дофига всего, уже по традиции )

Но главное что дописал - "обрезание" контролов scissor-ом родителя.  Я думал, что я сделал это давно, а оказалось не сделал )  :D   Теперь всё зачОтненько рендерится, быстро и правильно )

Слегка пофиксил сплит-контейнеры, допилил класс виджета-узла графа шейдерного редактора, сделал его ресайзинг )

Скины поддерживаются, однако я их пока не рисовал и контролы просто заливаются дефолтным цветом, который я рендомно выставил как-то однажды и забил : )

Вот WIP (work in progress) скрин того, с чем я работаю.  Поясню:

1. Тут не все поддерживаемые контролы :D  Тут только то, что я прямо сейчас тестирую, не более.
2. Тут нету скина  (не применён) и т.е. нет текстур.
3. На скрине 2 сплит-контейнера, 2 кнопки, 1 pictureBox (в который выводится отрендеренная сцена), 1 shaderNode


понедельник, 7 ноября 2011 г.

WIP news

Oh sh..
Времени почти нет на движок. Но вот вчера вечером сел за написание редактора шейдеров ) ЭТО КОШМАР! :D

Мой GUI - сразу же с первых минут жутко зафейлился по всем фронтам ( И началось его дописывание/переписывание. : )

1. Добавил SplitContainer контрол. Нужен мне для UI редактора (ну, это контрол где есть 2 панельки и полоса-разделитель. которую таскать можно). Работает теперь отлично!

2. Сегодня при поддержке одного друга пофиксил 100500 багов в моём текстовом классе! А именно: горизонтальное, вертикальное выравнивание, отступы букв друг от друга, правильное получение размеров строки (в пикселях) и много чего ещё попутно ). Теперь текст рендерится правильно и чётко по центру (если стоИт выравнивание по центру). В общем _теперь_ я доволен рендерингом текста )

3. Меняю иерархию классов "виджетов". Теперь моего брутального и бессердечного кода нет. Всё чисто, лаконично и красиво )

Допиливаю другие контролы... скоро будут скрины ^^

воскресенье, 18 сентября 2011 г.

NES Emulator news

Добавил поддержку over 20 опкодов процессора, начал писать PPU (сделал запись контрольных регистров 1,2 и чтение регистра состояния). Нашёл баг в JSR опкоде - пофиксил ) Более подробно в моём блоге на gamedev.ru http://www.gamedev.ru/pages/l/forum/?id=152486 (это страница с комментами - я в комментах больше всего постю - не хочу засирать раздел своими постами )

пятница, 16 сентября 2011 г.

Волшебный мир ассемблера :D

Вчерашней ночью решил же писать эмулятор денди! О ДААА! :D

Создал пустой проект, написал создание окошка, копирование ROM-а в память. Cool!! What next?? o_O Эм... ээм.. вырубил всё нафиг и пошёл спать ; ) "Верное решение"(с)

Сегодня решил таки вернуться к вопросу, ведь "врагу на сдаётся наш гордый Варяг"! начал с гугления архитектуры Famicom. Этой системе уже куча лет, она жутко старая, но в инете так и нет нормальной полной скомпонованной инфы о ней :D Блджад! Приходится гуглить по кусочкам.

Окей, базовая инфа есть, почитал про CPU, PPU, APU, memory mapped IO и т.п. Ну это всё конечно весьма увлекательно, только представления о том, как это всё реально работает и как собсно это эмулировать досихпор нет! : \ Что-то типа "смотрим в книгу - видим фигу" Но.. останавливаться же не в моих правилах )

Пошёл потроллил в Skype чатике товарищей Utechenko V. O. и DDS, которые таки выдали чуток полезной мне инфы, в частности направили "на путь истинный" - посоветовали книги Владислава Пирогова, которые оказались весьма занимательными : )

Так я пришёл к мысли, что "блин, ведь давно пора выучить ассемблер" ! Используя книги, туториалы по программированию AVR микроконтроллеров, туториалы по ассемблеру, википедию, параллельно распивая зелёный чай, поедая сгущёнку и печатая очередной рендер из VRay матеря принтер за баги в печати начал постигать азы микроэлектроники, ассемблерного программирования.

Чёрт! Это чувство просто офигенно! Чувство, когда начинаешь понимать нечто ранее недосягаемое.. как звёзды ) Ещё вчера сидел тупил, не понимал _совершенно ничего_ в архитектуре и уже сегодня я знаю назначение северного, южного мостов, чипа CMOS, что такое защищённый режим процессора и как в него переходить ) Назначение APIC (контроллера прерываний) да и саму суть прерываний! Я раньше вообще не представлял что же это такое и нафига оно нужно! Я вообще думал что это какаято хардварная фича проца, которая вызывается через строго отведённый интервал и что-то шлёт в этот момент девайсам. Оказалось всё немного по-другому. APIC контроллер физически приаттачен к выводам девайсов на материнской плате. Девайсы могут слать сигналы прерываний, контроллер ставит соответствующий флаг, который ожидает обработки процессором. Если в процессоре глобально и локально прерывания не запрещены, то обрабатываются они по очереди следуя приоритету. Для каждого прерывания есть свой собственный обработчик! Т.е. - процессор проверяет, стоит ли флаг прерывания и если его можно выполнить - сохраняет состояние регистров (заливает значения в стек), переходит к обработчику прерывания и обрабатывает его, восстанавливает состояние регистров и продолжает выполнение программы.

Не понятен только один момент - ведь во время обработки прерывания могут ещё несколько раз придти сигналы о необходимости выполнить одно и тоже прерывание! Ну тоесть девайс запросит его несколько раз. Что тогда? Насколько я понял - все прерывания кроме последнего тупо пропускаются. Странно это всё. Понятно, что такое может произойти с минимальной вероятностью, но может же : )

Сделал загрузку ROM-а игры NES (выбрал SuperMarioBros как тестовую игру,ибо в нём самая простая архитектура картриджа - нету MemoryMapper-а и т.п.), набросал пока Dummy классы железа NES, обработчики нескольких опкодов процессора, разобрался с обработкой прерываний, обработал Reset.

Ок, хватит тут графоманствовать - ушёл обратно в мир ассемблера..

четверг, 15 сентября 2011 г.

Hardcore wanted

Софтрендеры писал и не раз... уже не вставляет. Хочется чего-то более хардкорного и полезного! Вот в мою больную голову неведомым мне образом закатилась мысль - а не написать ли мне эмулятор чего-нибудь? :3 Но так как я ничерта не смыслю в этом деле - решил начать с простого ) С эмуляции DENDY (nes). Собсно да - начинаю писать эмулятор ) В свободное время... 9ох ё.. и как эти процессорры то эмулировать...) : P

понедельник, 12 сентября 2011 г.

PIMPL

Дело было вечером, делать было нечего : ) Почитал об этой идиоме (pointer to implementation). Мне как-то раньше объясняли что это такое! Да так объяснили, что я чуть не поседел, решив, что это что-то мегозаумное, жёсткое в реализации и вообще только для программеров over9000 уровня )

Погуглил, прочитал за пару минут первую попавшуюся статью и.. ОМГ, дак тут то идея, которая будет понятна любому школьнику ))) Оказалось - мне СЛИШКОМ извращённо объясняли и ещё я сам идею юзал уже давно, правда слегка не так, а по-своему :3

Переписал систему ввода с каноничной идеей PIMPL ) Впринципе чуть-чуть красивше смотрится, чем раньше ^__^

А, кстати, обновил железо чуть-чуть : ) Заменил видеокарту! Раньше стояла gf 8600 gts, а теперь купил и поставил gf GTX 550 Ti ! Жырнота! Разница огромная!! Особенно это заметно при массивной выборке текстур - так в 8600 скорость выборки была примерно 8 гигатекселей в секунду, теперь же 28 гигатекселей : ) И те тяжёлые места в моих сценах, где ФПС падал до 30 теперь выдают не меньше 250 ФПС!

Блин, такая видяха расслабляет : \ Как бы не наговнокодить с ней :D Что ещё радует кроме высокой производительности - полная аппаратная поддержка DirectX11! О да!! Можно пощупать тесселяцию и динамическую линковку шейдеров ^^ Да и собсно писать полноценный именно DX11 рендерер для движка : )

Ах да, насчёт рендеров. У меня в движке реализован мультирендеринг. Тоесть могу рендерить сцену хоть через DX9-11, хоть через OpenGl, да хоть через софтварный рендерер : )) 9кстати новая версия софтрендера сейчас в разработке - юзаю блочную растеризацию и MMX). Но есть тут мааааленькая проблема - линковка gAPI библиотек : \

В поле Additional dependencies настроек линковки проекта я прописываю нужные lib-ы, они линкуются к библиотеке проекта и всё прекрасно работает! НО! Представим ситуацию, когда у меня реализован рендеринг на DX9 и глупо запрещать запуск на Windows XP. Как, собсно, запускать на XP мой проект?? Когда он слинкован с DX11 либами. которых в XP может и не быть! о_О

Раньше я юзал M$-only фичу #pragma comment (lib, "blablabla.lib") и, впринципе, указав дефайнами набор рендереров можно было отключить какую угодно версию DX и для XP собрать версию без DX11. Но это смотрится больше как костыль : (

Единственным годным решением пока вижу вынесение рендереров в отдельные DLL как плагины и подгрузку нужной библиотеки уже во время зщапуска руками : ) Кстати, так у меня было изначально! И систему плагинов я НЕ удалил ; )

Но, думаю, пока рано над этим заморачиваться! Рендереры описаны в отдельных классах в отдельных файлах ) Поэтому перенести в DLL - не составит особого труда.

The end. Ушёл дальше покорять мир!

понедельник, 9 мая 2011 г.

Апдейт трассировщика пути.

Нашёл несколько ошибок (кстати, которые встречаю у многих : ) , пофиксил, оптимизировал, и собсно вот результат - не супер. но лучше : ) С матовыми зеркалами

понедельник, 2 мая 2011 г.

Raytracing

Накидал по-быстрому трассировщик пути : )

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



Не суперское качество, конечно, но ждать ещё несколько минут/часов стало влом - остановил : )

понедельник, 25 апреля 2011 г.

SSAO

Потихоньку раскурил и добавил SSAO



пятница, 22 апреля 2011 г.

Небольшой BugFix

Нашёл различные баги в рендеринге. Большинство из них из за копипаста! О_О Копипаст - ЗЛО!! Ррр, надо отучиваться.

Теперь ни каких варнингов от DX-а нет, ФПС значительно поднялся, а волосы у меня стали ещё более "мягкие и шелковистые"(с)

За модельку интерьера спасибо Аврелию, любезно выложившему её на форуме gamedev.ru


четверг, 21 апреля 2011 г.

Ни чего интересного : )

Был скрин дерьмовой сцены, был скрин GUI. Сейчас всё перепроверил, оптимизировал - есть скрин дерьмовой сценой И GUI : )

понедельник, 18 апреля 2011 г.

Апдейт шрифтов

Пофиксил свою тупую генерацию шрифтов! Они выглядели стрёмно (похоже будто отключено сглаживание) а если заюзать светлый шрифт на светлом фоне, то вообще адское УГ.

Вот апдейтю предыдущий скрин только с правильным рендерингом шрифта!

GUI - начало

Занялся собсно GUI. Пока сделал нормальную систему сообщений, менеджер слоёв, оконный менеджер, рендеринг текста и несколько видов различных контролов.

Вот скрин с 3 из них - "надпись", "текстовое поле", "кнопка". Всё кликабельно, настраиваемо. На всё что можно/нужно привязаны события. Есть поддержка скинов.

воскресенье, 17 апреля 2011 г.

Небольшой апдейт по прогрессу

Давно не отписывался - надо бы сообщить ВСЕМУ МИРУ о моём [говно] движке! (ведь весь мир же ждал этого, правда? *_*)

Итак, начнём перечисление скромных апдейтов:

1. Пофиксил прозрачность. Есть и альфа тест и альфа бленд. Работают вроде годно : ) Ну, если честно не совсем пофиксил )) Альфа бленд всё ещё криво освещается. Дело в том, что у меня же Light PrePass рендеринг, который не дружит с прозрачностью. В следствие чего все объекты с полупрозрачностью надо рисовать форвард-рендерингом, что влечёт за собой написание ещё одного рендера. Жесть. Не, ну я конечно могу костылей понаставить и за пол часа сделать рендеринг стекляшек, но мы ж, поработители мира - такие, ага, суровые ) Надо сразу делать "качественно". Лол!

2. Пофиксил компилятор ресурсов. Теперь всё компилится удобно! : )

3. Полностью переписал экспортёр моделей. Теперь для модели в 16 к треугольников экспорт идёт не 30 секунд а 1-2 секунды. жЪр!

4. Экспортнул анимацию.. загрузил - чотко рендерится ) но в самом конце трека анимации небольшой рывок есть. Кажется я знаю в чём дело и пофиксю на неделе.

5. Начал писать GUI! Посмотрел я wxWidgets, MYGUI, CEGUI - да нуу. Это "не то". Лучше я свой напишу!
Кстати по случаю GUI собрался и сделал нормально события/делегаты (как в шарпе почти). Ну, вот например создание кнопки и аттач к ней метода.

//add button
GUIButton* button = new GUIButton(gui);
button->SetPosition(Vec2i(50,50));
button->SetWidth(200);
button->SetHeight(100);
button->SetBackColor(Vec4f(1.0f,0.0f,0.0f,0.7f));
mainMenu->AddChild(button);


button->Event_MouseLeave+=NewDelegate(this, &CrysisGame::BT1Leaved);
button->Event_MouseClick+=NewDelegate(this, &CrysisGame::BT1Click);
Ну и остальные бла-бла-бла методы.. выпонели же, да?


и сами методы:

void BT1Click(GUIWindow* sender, int b)
{
static_cast(sender)->SetCaption(STR("Click"));
}
void BT1Leaved(GUIWindow* sender, int b)
{
static_cast(sender)->SetCaption(STR("Leaved"));
}

7. Добавил рендеринг в текстуру параметров поверхности! И заметил значительный спад FPS : ( Зато теперь могу делать материалы с разными BRDF!!!! ^______^


Кстати купил Crysis 2! : \ Сначала жутко демотивировал меня а теперь обратный эффект - мотивирует делать более качественную графику )

Ох, пойду я спать... вчера отмечал 2 днюхи... fuckin' headache!

понедельник, 21 марта 2011 г.

WIP News

А вот и я с небольшим набором апдейтов )

В последнее время разработка идёт не очень быстро... тут много факторов, но основной, наверно, отсутствие нормальной работы (в моём городке сложно найти адекватную, а за 10 тысяч в месяц админом работать.. не очень хочется : ) Правда зовут в Питер.. но чота, блин, страхово. Страхово не от переезда, а скорее всего от того, что "не пройду собеседование". Вот откуда эта неуверенность? Пздц.

Итак, хватит лирики, переходим к делу:

1. Добавлен класс ActionMap в игровой движок! Теперь все действия игрока мапятся именно в нём. Происходит это примерно так:

actionMap.BindAction(ACTION_FORWARD, KEY_Q);
actionMap.BindAction(ACTION_BACKWARD, KEY_E);
actionMap.BindAction(ACTION_JUMP, KEY_SPACE);
actionMap.BindAction(ACTION_ACCELERATION, KEY_LSHIFT);
actionMap.BindAction(ACTION_FIRE, KEY_MOUSE_LEFT);
actionMap.BindAction(ACTION_USE, KEY_F);
actionMap.BindAction(ACTION_TURNLR, KEY_AXIS_X);
actionMap.BindAction(ACTION_TURNUD, KEY_AXIS_Y);

Неудобно!? Бред! Очень удобно! Удобно как программно прописывать биндинги, так и загружать их и менять в рантайме!

2. Но одними биндингами сыт не будешь : ) Для управления персонажем используется новый класс ActionBuffer (название само за себя говорит). движок чекает инпут и по инпуту, подглядывая в ActionMap добавляет новые действия в ActionBuffer который позже отправляется игроку на выполнение. Всё очень просто : )


вот код ActionBuffer (есть у кого предложения оптимизации КОДА?)

#ifndef ActionBuffer_h__
#define ActionBuffer_h__

#include "Action.h"
#define NUM_SLICES 4

class ActionBuffer
{

private:
int buffer[NUM_SLICES];
public:
void AddAction(int action)
{
action--;
int slice = action >> 5;
action -= (slice << 5);
buffer[slice] |= (1 << action);
}
void RemoveAction(int action)
{
action--;
int slice = action >> 5;
action -= (slice << 5);
buffer[slice] &= ~action;
}
void Reset()
{
memset(buffer, 0, sizeof(GameAction) * NUM_SLICES);
}
bool CheckAction(int action)
{
action--;
int slice = action >> 5;
action -= (slice << 5);
return (buffer[slice] & (1 << action)) !=0;
}
};
#endif // ActionBuffer_h__


какбы конец кода.

Ну, ещё я пофиксил многие баги физики, научил капсулу игрока не падать, правильно коллайдиться. Также сделал управление камерой персонажа (можно переключать first person/third person виды). Собсно теперь могу спокойно персом бегать по уровню : ) Осталось решить одну маленькую назойливую проблему - прохождение камеры сквозь стены : ( Оно заметно когда включен режим обзора "от третьего лица".

Как решать? - думаю надо сделать для камеры физический объект - сферу! Путь коллайдится с миром, а я буду в соответствии со сферой поправлять позицию камеры.


Пока вот так.

пятница, 11 марта 2011 г.

ЫЫЫ

Пофиксил баг с тенями! Теперь PCF корректней работает + собсно бага нет. Он слишком глупый. чтобы я его называл : )



Uploaded with ImageShack.us

Ну какбы вот : )


На ебанутые яркие блики не обращаемс внимания ^___^ это я ещё BRDF для материалов не прикрутил к отложенному освещению

Небольшой апдейт

[+] написал экспортёр физической геометрии для 3DS Max
[+] сделал автоматическую загрузку и поддержку физической геометрии
[*] Вернул отключенные тени (были проблемы с ними, правда 1 ещё осталась)

Всё вроде хорошо, только тени ипут моск! Почему-то есть такой баг, как на скрине:



Uploaded with ImageShack.us

Возле ног перса виден баг тени. Пока х.з. в чём проблема. Первое что подумал - у меня слишком большой epsilon для тени! и реально очень большой стоял! Сделал таким маленьким, что артефакты начали проявляться, но баг не исчез : \ Сейчас буду искать причину.

четверг, 10 марта 2011 г.

Небольшой апдейт.

Сделал фабрику для сущностей и собсно их загрузку из файла XML.

Пока это выглядит так:

miranda = EntityFactory::me()->BuildEntity(AS_STRING("root/Data/Entities/unnamed_entity.xml"), pGraphics);

miranda->GetTransform()->SetPosition(Vector3D(0.0f,50.5f,0.0f));

gameWorld->AddEntity(miranda);

четверг, 3 марта 2011 г.

Время...

Время.. оно как долбаный песок - ускользает сквозь пальцы, не удержать его..

Казалось бы "что мне стОит написать игру", ведь это не так сложно! И это действительно так! Когда ты знаешь что делаешь, вопрос о сложности отходит на второй план а сам процесс разработки становится более.. эм.. творческим, как ещё сказать.. И да, писать игры не сложно, вот только это "творчество" незаметно съедает огромное количество времени! И это напрягает.. в итоге времени не хватает ни на "игру" ни на что другое

Хреново это всё, нужно будет подумать о путях оптимизации расходов времени, его ведь так мало... а хотя, бывает ли его много?

***********************************
Кстати, допилил класс IMeshObject Теперь рендеринг мешей (любых - хоть статичных, хоть со скиннингом, хоть процедурных) - стал гораздо более быстрым и удобным! Количество кода рендеринга сократилось как минимум в 2х раза, что не может не радовать. Правда появился какой-то баг с BoundingBox-ом объекта, но это не проблема - сейчас найду : )

четверг, 24 февраля 2011 г.

WIP

Пофиксил экспортёр - стал немного быстрее + экспортит объекты, состоящие из нескольких отдельных мешей.

Переписываю класс mesh-а. Изначально это был один общий класс. Сейчас сижу - разделаю. Будет общий интерфейс IMesh через который все виды мешей можжно будет одинаково рендерить, апдейтить. Давно пора было сделать. Например мне нужны некоторые методы для работы со скелетной анимацией (со скелетом И с вершинами) ну и т.п. зачем эти методы внутри статичного меша? Не нужны! Так же прикручу процедурные меши, что будет достаточно просто : ) А процедурные мне очень нужны (геометрические шейдеры не спасут).

Загрузил персонажа Miranda из Mass Effect 2 ^____^



где-то баг в загрузке материала о_О Глаза у миранды чёрные, гхм


ах да, убрал ещё добавление ambient освещения из всех типов лайтов. Было не пр
72;вильно сделано - каждый лайт добавлял свою долю ambient! так, добавив 10 лайтов радиусом 1 мм можно было засветить всю сцену о-О. Добавил новый тип источника света - AmbientLight который не нужно добавлять, который рендерится автоматом в зависимости от настроек сцены. Теперь освещение правильное.

понедельник, 14 февраля 2011 г.

Итоги работы

Так, что же я на этом С++ смог наваять на данный момент:

Графический двиг:

статическая библиоткека, реализовано:

1. система плагинов
2. мультирендер
3. менеджер ресурсов (правда пока всёравно в общем потоке работает Про потоки С++ хочу больше узнать, прежде чем юзать)
4. Виртуальная файловая система - поддержка ZIP архивов, обычных файлов с HDD, свой формат PAK файлов.
5. Скелетная анимация
6. Большой ландшафт. Макисмальный тестированный размер - 8*8 километров (с шагом сетки в 1 метр)
7. Рендеринг с отложенным освещением (не путать с полностью отложенным рендерингом!)
8. рендеринг травы - есть менеджер, занимающийся апдейтом, генерацией и рендерингом травы. Она отделена от основоного алгоритма рендеринга с целью оптимизации в следствие специфичности самой травы. Инфа о траве весит крайне мало. В памяти распаковываются только нужные инстансы травы, рендеринг в несколько DIP-ов идёт с использованием хардварного инстансинга. Мжно бьло бы сделать 1 DIP, но в таком случае Map/Unmap буферов будет каждый кадр.
9. Рендеринг растительности - все растения кроме травы. Свои методы анимации, свои методы отрисовки и шейдинга. Поа не прикрутил импосторы - провожу оптимизацию рендеринга того, что есть.
10. NormalMapping - тяжёлые параллаксы не люблю. Позже сделаю а пока и нормалмаппинга хватит.
11. EnvironmentMapping - накладываемс отражения из кубической карты, которая грузится с файла или же рендерится динамически.
12. ShadowMapping для spot light-ов. Сглаживание пока только PCF с настраиваемым ядром фильтра.
13. PSSM - каскадные тени для аутдора. Также юзаю PCF 4*4 Все тени рисуются в одну общую текстуру.
14. HDR - в нём реализован bloom, адаптация глаза, blue shift
15. Система убер-шейдеров
16. потом допишу, может что забыл )

Тулзы:

1. Экспортёры мешей, треков анимации (При экспорте меша можно точно указать какие данные экспортить а какие нет)
2. Эксплорер PAK файлов - так как формат мой собственный - нечем было просматривать "архивы". Пришлось написать "эксплорер" для PAK файлов. Написан на C#

Игровой движок:

только начал! Прикрутил физику к сущностям. Всё ))



пока всё : ( Мда, не густо..

суббота, 12 февраля 2011 г.

WIP PSSM

Вот, решил прикрутить PSSM - с ним всяко лучше сцена смотрится.

Кликабельно!!

вторник, 25 января 2011 г.

WIP News

Что сделал:

[+] Небо Нишиты (как в крайзисе) - динамическая смена времени суток. Можно задавать время восхода, заката солнца а также скорость его движения по небу : ) Ну и собсно начальное время суток. Задаётся в любой удобной форме. Юзаю "часы/минуты/секунды". Очень удобно получилось : )

[*] LOD ландшафт. Оптимизировал макисмально (на сколько смог). Ландшафт размером 4096*4096 метров (с шагом сетки = 1 метр) занимает 128 мб видео памяти это против 1.5 гб на предыдущем алгоритме : ) Тоесть стриммить геометрию собсно и не нужно т.к. мне ландшафт больше 2*2 км собсно и не нужен. (а это 32 метра видео памяти). LOD-ы сделал индексными буферами (может потом прикручу GCM но пока всё устраивает) с вырожденными треугольниками. Т.е. ни каких дибильных "юбок". Всё красиво и правильно стыкуется прореженными швами. Не доделал только блендинг текстур : ) Просто на траву отвлёкся. А так ни чего сложного. Максимум 5 текстурных слоёв будет (+маска).

[*] Рендеринг травы почти готов уже. на ландшафте 4096*4096 у меня может быть максимум 201+ миллион кустов травы : ) Все данные для этого занимают 16 метров всего-то. Осталось то, кстати, всего ни чего - тупо найти КРАСИВУЮ текстуру травы, а желательно несколько. У меня может быть максимум 4 вида травы на ландшафте. Да ещё и геометрию надо для неё намутить, хм. А вообще "трава" рендерится. Только вместо неё кубики : )

Освещение же у травы попиксельное - честное : )) (а какбы совсем пофиг! У меня же отложенное освещение ; )

Отскринюсь когда будет готов "лес".



UPD: всёравно выкладывал скрин на гамедьев, а, ладно, запостю. Ни чего интересного. Для количества )

среда, 19 января 2011 г.

Начал писать ландшафт.

Начал писать ландшафт. Сначала хотел сделать стримминг и прочую хрень но подумав пришёл к выводу, что мне МЕГООГРОМНЫЕ ЛАНДШАФТЫ нафик не нужны (по крайней мере в первой игре если она когда-нибудь вообще реализуется). Максимальный размер ландшафта в движке установлен как 4096*4096 а минимальный 64*64. Ландшафт любого из дозволенных размеров располагается целиком в видео памяти, что я себе ТЕПЕРЬ могу позволить, так как раньше у меня ландшафт 4096*4096 занимал примерно 1 ГБ видеопамяти! Теперь же такой ландшафт занимает 128 мегабайт : ) И это очень радует. Наврядли мне понадобится вообще ландшафт больше 2048*2048, который, кстати, весит вообще 32 мегабайта : ))

Ещё, правда, много работы по ландшафту.

Хотел сделать скрин но так лениво стало отрубать HDR : DD А "на улице" сильная засветка так как у меня там ни неба ни чего, короче, влом : )

"помещение" и ландшафт начинаются с координаты 0.0.0, поэтому на ниже приведённом скрине ландшафт воткнулся в "комнату". Ну какбы отскринил наверно для себя т.к. там ничо интересного пока нет : )




по-позже, как сделаю небо - запостю сюда же скрин outdoor-а )


upd: по немногочисленным просьбам поставил нормальный лайт а не кучу не пойми чего не пойми где




upd: поставил анизотропную фильтрацию текстур вместо линейной и MIP-уровни в тектсурах сгенерил. На дальнем плане чуток по-лучше стало.




если чо - картинки кликабельны )

кстати для сравнения: эта же самая сцена но с выключенным HDR эффектом:




вторник, 18 января 2011 г.

Трындец.

Почти с самого начала работы над С++ движком (как только решил на С++ перейти с C#) у меня были постоянные проблемы, постоянно что-то отваливалось и еэто "что-то" сильно мешало работать.

Но, УРА, я нашёл причину бага ) Закомментил весь проект, потом раскомментил, и ещё несколько раз закомментил -пытался локализовать баг - ххренушки. Нашёлся в самом неожиданном для меня месте, в загрузке уровня о_О Классический FAIL - вышел за пределы массива.

Теперь всё работает стабильно, можно НАКОНЕЦТО продолжить добавлять фичи в движжок )

по порядку буду добавлять:

1. огромный ландшафт
2. динамическое небо (light scattering)
3. рендеринг густой лесной растительности (деревья, трава)
4. системы частиц
5. GUI

Ща надо хотябы начать ландшафт а то как-то стрёмно идти спать : )

четверг, 6 января 2011 г.

Конкурс на лучшую игру в жанре "Стратегия" на сайте gamedev.ru

Конкурс СТРАТЕГИЙ: главная тема == http://www.gamedev.ru/flame/forum/?id=142449
Конкурс СТРАТЕГИЙ: участники и их проекты == http://www.gamedev.ru/flame/forum/?id=142446