понедельник, 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 стал еще мощнее и еще проще в использовании.
В частности существенно упрощена и переработана часть движка, связанная с рендертаргетами. Но об этом в следующих выпусках.