вторник, 21 декабря 2010 г.

Решил узнать какого качества игру можно сделать на quad. Для того, чтобы не замахиваться на что-то огромное, было решено накидать пакмана. Да не простого — а золотого!

Идея:
Классический пакман, но в темноте. Пакман — солнышко, которое подзаряжается точечками и светит ярче. Солнышко освещает всё вокруг, но свет не проходит сквозь стены.

Реализация:
Сложности реализации дали о себе знать с первых минут разработки. Если с полом всё понятно — там normalmapping, то со светом всё сложнее на порядок. Как делался свет. Итак, для затенения мы накладываем через умножение (multiply) карту освещенности. В карту освещенности должны попасть светящиеся точки (они слегка мерцают), небольшая область в пару пикселей вокруг точек (эффект свечения) и, собственно, свет от солнышка. Свет от солнышка заслуживает отдельной большой статьи. Обмолвлюсь лишь, что рендеринг в данном случае 17-ти проходный. Да, да! Однако результат превосходит ожидания. Свет не проходит сквозь препятствия, угасает с дальностью и более того — рассеивается с дальностью.

После окончания разработки света было решено оформить его дополнительным модулем и поставлять с движком, чтобы не было у простых смертных проблем с реализацией подобного эффекта. Чик и готово. Чуть больше прогресса покажу позже, пока только один скриншот.

вторник, 14 декабря 2010 г.

Длительное время не писал сюда. Думал что делать с блогом. В итоге решил переименовать и исправить  названия (старое название Joy3D Framework кануло в лету). За это время движок успел заметно подрасти и научиться рисовать довольно хитрые картинки. Обзавелся собственным сайтом http://quad-engine.com и даже парой игр, сделанных с его использованием. Но обо всём по порядку.

Скриншот, прикрепленный к этому посту показывает результат работы шейдеров и quad engine в целом. Результатом является честный raytracing теней от выбранных объектов сцены. Рендеринг многопроходный (сейчас около 17 проходов), но это будет оптимизироваться. На машинах с видеокартами класса GeForce7600 дает около 210fps. Мило?

пятница, 18 июня 2010 г.

Меж тем в разработке модуль для создания оконных интерфейсов (пока без использования основного движка для рендера). Z-order, перетаскивание окон, дочерные окна, модальные окна, панельки, кнопочки и многое другое возможно уже с помощью этого модуля.
В ближайшем будущем объеденю с предыдущим скриншотом. Кнопочки обретут объем, текстуры, окошки начнут поблескивать металлическим блеском....
Одним словом это должно будет впечатлять! :)
Шрифты обросли дополнениями в виде масштабирования, кернинга. На подходе межбуквенные отступы (+\-), наклонные шрифты, раскраска по тегам и функции по форматированию текста для вывода.
Демо будет как только будет что показать. А пока что лишь представляю во что бы превратились мои Rusty Lines, делай я их сейчас и на этом движке.

среда, 9 июня 2010 г.

Продолжаем ковырять рендер шрифтов. На сей раз улучшения вывода шрифта.
Stroke:

Shadow:

Noisy:

понедельник, 17 мая 2010 г.

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



Чтобы не было претензий мол "обводка темная" - так надо :) Зачем - неважно. Вот скриншот работы смого Фонтрендера:



А это аналогичный шрифт (только на градацию жирнее) и специально сделаный желтого цвета, чтобы показать, что всё замечательно. Скриншот с движка.

четверг, 18 марта 2010 г.

Сегодня был реализован FontRender. Утилита генерирует 32битные текстуры с шрифтом, а также файл с UV координатами для символов. В утилите выбор символов, необходимых для генерации, задается текстовым полем. Также доступен выбор толщины (от ультратонкого до ультратолстого) и размера шрифта.
Имеется встроенный просмотровщик результата (выбор цвета фона, цвета шрифта) для оценки читабельности текста, полученного рендером.
Рендер производится с 5х Антиалиасингом.

Результат работы утилиты:


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

четверг, 11 марта 2010 г.

Давно не писал, ибо обновлений в явном виде пока нет.

Планируется довольно обширный тулкит для фреймворка. А именно:
FontRender - эта утилита будет не просто делать текстуру для программы. Она также будет генерировать альфаканал для букв. Так как замечено, что некоторые шрифты не имеют оного. Также литеры в текстуре будут максимально плотно прилегать друг к другу, что минимизирует по размеру текстуру. Для каждой буквы будут сгенерированы параметры ширины, высоты, поэтому будет поддержка любых шрифтов. Как моноширинных, так и нет. Дополнительной функцией будет возможность набрать с клавиатуры в поле ввода все желаемые литеры, дабы исключить все лишние (например если нужны только цифры).
Для фреймворка, разумеется, будет полноценный класс для загрузки и отрисовки текстов в любых мыслимых и немыслимых результатах. Возможность использовать курсив и подчеркивание.
Осуществляться подобные вещи будут с помощью специальных функций вроде DrawItalic или же с помощью тегов, например цветовых.

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


Разумеется, все вышесказанное относится к планам. До реализации всего перечисленного пока далековато. В поддержку фреймворка будет выпущена технологичная игра, до релиза которой не будет раскрываться ни жанр, ни стиль, ни скриншоты. Тоесть, ровным счетом - ничего. Однако результатом останетесь довольны.

четверг, 4 марта 2010 г.

Текстурный блок научился загружать текстуры в BMP, JPG, TGA форматах.
К слову сказать - как BMP, так и TGA поддерживаются с альфа каналом. Поддерживается RLE сжатие и 32битные TGA.

вторник, 2 марта 2010 г.

QuadTexture:
Текстурный модуль теперь загружает текстуры любого разрешения, создавая в памяти текстуру корректного для видеокарты размера.
В один экземпляр QuadTexture можно загрузить до 8 текстур:
my_texture:= TQuadTexture.create(Joy3D);
my_texture.LoadFromFile(0, 'diffuse.bmp', 80, 80);
my_texture.LoadFromFile(1, 'normal.bmp', 80, 80);
my_texture.LoadFromFile(2, 'specular.bmp', 80, 80);
Загрузит в текстуру my_texture 3 текстуры. Диффузную, нормалмэп и спекуляр. При отрисовке будут вызываться, соответственно, все три текстуры, в соответствующие регистры (0, 1, 2). При использовании шейдеров автоматом идут в регистры шейдеров, в остальных случая по заданным критериям смешения мультитестурирования.

Joy3D:
Окно автоматически создается размером с указанное поле вывода (нет необходимости в конструкторе или "на лету" программы устанавливать ширину и высоту окна).
Добавлена функция для расчета TBN для полигона (касательного пространства). Необходимо для корректной работы normalmapping шейдера.

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

Рождён блок QuadShader. Работа с оным выглядит как:

Инициализация:
QuadShader := TQuadShader.create(Quad);
QuadShader .LoadComplexShader('vs.bin', 'ps.bin');

В цикле программы:
QuadShader .SetShaderState(Enabled : boolean);

В шейдерный блок добавлена проверка версии поддерживаемых шейдеров.

суббота, 27 февраля 2010 г.

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

В процессе реализации шейдерный блок QuadShader. Пример работы тестового блока QuadShader - попиксельное освещение с нормалпеппингом, спекуряр меппингом и диффузной картой:


Использованы эти карты для теста:

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

Ограничение вывода. SetClipRect(x, y, x2, y2).

Движемся к полноценному фреймворку.
Добавлена функция переключения режимов альфа-смешивания.
Имея опыт разработки казуальных игр имею представление, что переключение режима обработки прозрачности для каждого спрайта - накладной и ненужный расход, поэтому переключение режима альфа-смешивания было вынесено в отдельную функцию:

Quad.SetBlendMode(jbmSrcAlpha);

При отрисовке, скажем, частиц, в кол-ве измеряемом тысячами, позволяет экономить ресурсы, хотя кода на строчку больше становится.
Добавился рендер в текстуру. Использование простое как 2 копейки:
После инициализации QuadRender делаем:
Quad.CreateRenderTexture(256, 256); // где 256 и 256 - размеры текстуры, соотвественно.
rendertarget := TQuadTexture.create(Quad); // создаем обычный класс TJoyTexture
rendertarget.CreateFromI(Joy3D.RenderTexture, 256, 256); // говорим ему использовать текстуру из под рендера.

Всё!

Далее нас ждет 2 блока
Quad.BeginRender;
Quad.EndRender;
В первом блоке идет рендер в текстуру (если надо), во втором основной.

Да, чуть не забыл. Первый блок обрамляется в:
Quad.RenderToTexture(True);
Quad.RenderToTexture(False);
чтобы дать понять фреймворку, что мы хотим рендерить в текстуру.

Пример работы (фиолетовый прямоугольник - рендер в текстуру):


Разумеется, с текстурой можно вытворять всё что угодно как и с любой другой во фреймворке. Вращать, блендить, масштабировать и т.п.