вторник, 9 октября 2012 г.

Урок 4 - Использование шейдеров.


Тема № 2 - Использование шейдеров и создание на их основе пост эффектов.

Я думаю, что бессмысленно рассказывать о пользе и мощности такого инструмента, как шейдеры. Quad Engine, несмотря на то, что это инструмент для 2d графики, изначально  разработан для простого использования шейдеров. Что никак не ограничивает сложность самих шейдеров и возможностей по их использованию.


В данном уроке мы рассмотрим самый простой вариант шейдеров - постэффекты. Их много и они разные, но объединяет их способ получения - все изображение рисуется в одну или  несколько полноэкранных текстур, а на них при помощи информации о цвете и дополнительных параметров (масок, информации о глубине, дополнительных текстур и т.д.) накладывается определенный эффект, изменяющий картинку.
Соответственно для того, чтобы воспользоваться шейдером в движке, нужно написать и скомпилировать сам шейдер, подключить его к движку и задать необходимые параметры.
Написание шейдеров выходит за рамки данной статьи, и предполагается, что читатель с этим знаком. Совместно с движком разрабатывается и QuadShade - инструмент для создания и
компиляции DX шейдеров. Для удобства можно использовать шаблон шейдера, идущий вместе с QuadShade.

Тут стоит отметить особенности - Quad Engine по умолчанию может передавать в шейдер несколько дополнительных параметров, которые можно использовать для более сложных сцен.

Собственно к делу.
Подключить шейдер очень просто:

var
  //регистрируем переменную для шейдера
  Shader: IQuadShader;
...
  //Создаем и загружаем шейдер в начале программы
  QuadDevice.CreateShader(Shader);
  Shader.LoadPixelShader(PAnsiChar('shaders/ps_blur.bin'));
...
  //При отрисовке включаем шейдер
  Quad.BeginRender;
  Shader.SetShaderState(True);
  // и рисуем сцену
  Texture.Draw(0, 0);
  Shader.SetShaderState(False);
  Quad.EndRender;

Вот тут можно посмотреть примеры. Представлены очень простые шейдеры, и все параметры для них зашиты в код шейдера. Естественно в реальном проекте обычно так не делают - создаются параметры, которые управляют шейдером из кода основной программы. Об этом будет следующий урок.
В примерах использован код для предварительной отрисовки сцены в текстуру - для создания постэффекта.
Обычно полноэкранные эффекты требуют только пиксельный шейдер, но естествено можно подключить и вершинный шейдер или оба одновременно.
Это делается соответственно командами Shader.LoadPixelShader и Shader.LoadComplexShader.
Так же в примерах использованы очень простые шейдеры, не использующие дополнительных параметров.

3 комментария:

  1. Странно, скачал последнюю версию движка, начал с первого урока, вроде всё по мануалу сделал - делфа ругается, что не знает, что такое IQuadDevice. Если беру QuadEngine.pas из демок с шейдерами - вылетает Access violation на строчке QuadDevice.CreateRender(Quad);
    Старые уроки уже не актуальны?

    ОтветитьУдалить
  2. Извиняюсь за два сообщения подряд, а можно следующий урок про ввод с клавиатуры/мыши? Или у QuadEngine нет собственного функционала по инпуту?

    ОтветитьУдалить
  3. День добрый. Относительно уроков, автор должен был указать что использовал версию 0.4, на сайте же только стабильная 0.3.
    К сожалению, а точнее к счастью, несколько поменялась архитектура движка, и да, появились новые интерфейсы.
    Возможно тут на блогспоте не очень видно и красиво выделены ссылки, потому что каждый урок снабжен архивом, где есть и заголовочные файлы и dll.

    Как раз таки эти уроки актуальнее всего. Дело в том, что всё, что я хотел реализовать в 0.4, я не успел в ней доделать. Поэтому она и не лежит на сайте, а лишь более старая 0.3. Обещаю исправить это недоразумение до нового года, честно-честно (отвёл взгляд в сторону и прикусил губу).

    Касательно второго вопроса - нет, у Quad еще ничего такого нет. В этом отношении я решил идти по пути наименьшего сопротивления. Сначала графика, потом все остальное. Будет и клавиатура и мышь, и даже геймпад. Но позже, много позже.

    Спасибо за проявленный интерес!

    ОтветитьУдалить