вторник, 8 ноября 2011 г.

Философия квода (quad англ. [transcription] ).

Первое, что важно, в использовании квода - он должен быть простым. То есть вызывать как можно меньше вопросов, в идеале не вызывать совсем. Это обеспечивается архитектурой, построенной на интерфейсах, простыми и понятным именованием констант, переменных, интерфейсов, методов и параметров. Разумеется, объектно-ориентированный подход также упрощает понимание. Код квода получается максимально лаконичным, но тем не менее таким же мощным, как и предполагалось.
Второе, что тоже очень важно, необходима возможность использования очень неочевидных функций, как то: изменение фильтрации текстур или режима обработки минусовых UV координат, свободное текстурирование и прочее.
Довольно занятно, что в большей мере, всё это удалось воплотить в той реализации квода, что есть сейчас. Многое еще предстоит, но основное направление уже задано.
Возможно надо было разделить рендер и системные функции. Более того - пугает, что это возможно придется делать. А это будет значить, что код будет поломан. Поэтому это останется до 2.0
Как я уже однажды писал - шейдеры были одной из фич, которые очень хотелось иметь в 2д движке. К сожалению, большинство движков (особенно под Делфи) не имело поддержки шейдеров, или же нарушало первое или второе правило (описаны выше).
Знание DirectX для квода не нужно абсолютно. Единственная вещь, которая может потребоваться - знание HLSL, для написания шейдеров. Однако, шейдеры не являются обязательными к использованию, так что данным аспектом можно пренебречь.

Сейчас в планах дальнейшее усовершенствование основной части и разработка новых модулей. Частицы, ГУИ, создание и управление окном, спрайтовый движок и прочие радости жизни.

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

Баловался с титрами. Вот что вышло:

Короткий сегодня пост...

среда, 26 октября 2011 г.

Сегодня было принято решение, которое просто таки обязано популяризировать quad. Итак, quad обзаведется базой шейдеров. Как это будет выглядеть:

Monochrome:
Применение:


Quad.RenderToTexture(MyRenderTarget, True);
  // Render your scene here
Quad.RenderToTexture(MyRenderTarget, False);

ShaderMonochrome.SetState(True);
MyRenderTarget.Draw(0, 0, $FFFFFFFF);
ShaderMonochrome.SetState(False);

<Ссылка на бинарный файл шейдера, готовый к использованию>

Код шейдера:
sampler2D DiffuseMap : register(s0);

float4 std_PS(vertexOutput Input) : COLOR {
  float4 Output;

  float4 tex_diff = tex2D(DiffuseMap, Input.TexCoord);
  Output = (tex_diff.r + tex_diff.g + tex_diff.b) / 3;
              
  if (Output.r < 0.2 || Output.r > 0.8) Output.r = 0.0; else Output.r = 1.0;
  if (Output.g < 0.2 || Output.g > 0.8) Output.g = 0.0; else Output.g = 1.0;
  if (Output.b < 0.2 || Output.b > 0.8) Output.b = 0.0; else Output.b = 1.0;

  return Output;
}


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

Более того, если кто-то выразит желание помочь с пополнением базы шейдеров - милости просим!

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

Сегодня открою завесу "тайны", над IGDC69 демо. Очередной howto в деталях.
Для начала мне нужна была некая сцена, которую нарисовал прямоуольниками, спрайтами шариков, и шрифтом вот так:
Ну так это же страшно и брр... Ладно, как нам добиться эффекта посимпотичнее. Думаем, решаем что после мы это все сделаем интерлейсом. Пройдемся полосочками в режиме multiply, получаем:
Теперь можно работать над постпроцессом. Все, что мы сейчас нарисовали, засовываем в рендертаргет. Рендертаргет понадобится для того, чтобы сделать из него еще один, и оставить в том виде, что есть сейчас. 
Открываем еще один рендертаргет, вчетверо меньшего разрешения и рендерим туда с горизонтальным блюром по гауссу содержимое главного рендертаргета, затем делаем с полученным тоже самое по вертикали:

Затем оставляем их впокое, берем первый, главный рендертаргет и проходимся шейдером, добавляя хроматизма, зависящего от расстояния пикселя от центра картинки, а также добавляем (опять таки в зависимости от того же расстояния) серого цвета. Таким образом картинка в центре более контрастная чем по краям, и без разложения цвета на составляющие:

Затем делаем радиальный блюр по гауссу. Также как и в предыдущем проходе, с добавлением хроматизма, делаем это в зависимости от расстояния. Чтобы уложиться в модель шейдеров 2.0, приходится опять делать блюр сначала горизонтальный, затем вертикальный. Ну что, вроде получается уже неплохо?
Теперь финальная сборка. Тут я прибегаю к небольшой хитрости, и жму все изображение по вертикали, чтобы получить черные полоски сверху и снизу. Это придает эффект кино. Сначала рисую вот этот, полученный мной рендертаргет с хроматизмом, затем тот, что получили раньше с добавлением, получая тем самым эффект свечения всего в кадре:

Все скриншоты сняты с грядущей 0.2.2 версии движка, который завелся после недавней поломки, связанной с довольно-таки глобальной переработкой. Но теперь quad стал еще мощнее и еще проще в использовании.
В частности существенно упрощена и переработана часть движка, связанная с рендертаргетами. Но об этом в следующих выпусках.

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

Долго сюда не писал, особо нечего было поведать. Но прошло время, и у квода достаточно много изменений и доработок. Итак, готовлю к публичной порке 0.2.2 версию. Что же изменилось?

QuadFont:
  • Появилась возможность посчитать высоту любого текста.
  • Текст теперь правильно рассчитывает межстрочные интервалы для многострочных текстов.
  • Появился SmartColoring, позволяющий раскрашивать текст, вызывая отрисовку по прежнему одним вызовом. "Red, Lime, Fuchsia" например можно нарисовать передав в отрисовку следующую строку "^$RRed, ^$LLime, ^$FFuchsia".
QuadTexture:
  • Текстура получила ряд методов для получения размеров текстуры, рабочей области текстуры, паттернов.
QuadRender:
  • Возможность одним вызовом создать и загрузить объекты. CreateAndLoadTexture, CreateAndLoadFont, CteateAndInitializeTimer.
  • Возможность задать OnError процедуру.
  • Автоматическая запись в лог ошибок отрисовки.
  • Включение\выключение автоматического расчета TBN для спрайтов.
Также  имеются многочисленные мелкие фиксы, о каждом из которых писать не хочется. Но работа проведена большая. В ближайшие пару дней всё появится. Заранее прошу прощения, если что-то забыл упомянуть.

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

    Новость сегодня короткая. Обновился до 0.2.1. Добавил десяток методов, провел рефакторинг и чистку исходников, поубивал потенциальные баги.

    quadengine021.rar

    среда, 10 августа 2011 г.

    Помоему тау лучше...