пятница, 17 августа 2012 г.

Урок 2 - рисование спрайтов.


Тема № 2: Работа со спрайтами.

Тут все просто. Создаем текстурку, грузим из файла и рисуем.
Кода соответственно добавится с предыдущего раза немного

  var
    Logo: IQuadTexture;  
  ...
  QuadDevice.CreateTexture(Logo);
  Logo.LoadFromFile(0, PAnsiChar('data/logo.png'));
  ...
  Logo.DrawRot(X, Y, Angle, Scale, Color);

Для правильной отрисовки полупрозрачных спрайтов нужно поставить правильный режим смешивания:
  Quad.SetBlendMode(qbmSrcAlpha); 
 Пример
Спрайты рисуются в обычной экранной системе координат с попиксельной точностью:
В один текстурный ресурс может быть загружено несколько изображений (в коде стоит индекс 0, но могут быть соответственно другие номера).
Это сделано специально, чтобы с помощью шейдеров использовать несколько карт(нормали, отражения, свечения и т.д) на одном спрайте.
Кроме того, текстура может быть атласом с изображениями фиксированного размера. Если при загрузке указать размеры этих изображений, движок автоматически их разобъёт и в последствии их можно будет вызывать по номерам. Например для анимации.
  Logo.DrawFrame(X, Y, Pattern, Color);
 Существует, несколько способов рисования.
Обычный способ, с пиксельной точностью от верхнего левого угла:
  Logo.Draw(X, Y, Color);
  //для текстур в атласе, Pattern - номер фрагмента
  Logo.DrawFrame(X, Y, Pattern, Color);
 С вращением и масштабированием, точка отсчета(координаты спрайта) находится в центре:
  Logo.DrawRot(X, Y, Angle, Scale, Color);
  Logo.DrawRotFrame(X, Y, Angle, Scale, Pattern, Color);
 С вращением вокруг произвольной точки:
  Logo.DrawRotAxis(X, Y, Angle, Scale, CenterX, CenterY, Color);
  Logo.DrawRotAxisFrame(X, Y, Angle, Scale, CenterX, CenterY, Pattern, Color);

10 комментариев:

  1. А можно ли отрисовать .tga с альфаканалом?
    Пробовал так:
    //tex: IQuadTexture
    tex := Engine.CreateAndLoadTexture(0, pchar('sprite.tga'));
    ...
    //Engine: IQuadRender
    Engine.SetBlendMode(qbmSrcAlpha);
    tex.Draw(10, 10, $FFFFFF);

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

    ОтветитьУдалить
  2. Должно рисоваться при условии наличии альфы в тга. Возможно в ней попросту нет альфы. Последние версии photoshop например не сохраняют альфу в тга правильно, это нужно делать через добавление и рисование вручную альфаканала.
    Вообще используйте png. Он бесплатный, жмет лучше, альфу тоже держит хорошо. Не вижу особого смысла в tga, если честно.

    ОтветитьУдалить
  3. Странно, альфаканал точно есть, добавлял и рисовал его вручную :) но картинка с qbmSrcAlpha не выводится

    ОтветитьУдалить
  4. Вот примерчик https://docs.google.com/open?id=0B1VXsnlK-6IfZ05rV21RQk1WWDg. Альфа задана черно белым в режиме каналов(вторая вкладка рядом со слоями). Сама картинка сохранена 32 битным TGA. Альфа прекрасно работает. Пользуйтесь пнг и гимпом:)

    ОтветитьУдалить
  5. Вот за демку спасибо огромное. Как оказалось, не учел, что при отрисовке спрайта цвет задается четыремя байтами и альфа нулевой была :)
    Побольше б демок с исходниками, можно с минимумом комментариев

    ОтветитьУдалить
  6. А это уже используется версия 0.4 ?
    И еще вопрос по "В один текстурный ресурс может быть загружено несколько изображений (в коде стоит индекс 0, но могут быть соответственно другие номера)." А можно ли и как потом вывести на экран изображение под определенным номером (имеется в виду именно этот индекс, а не pattern)? И, если это используется редко, может лучше сместить этот индекс в LoadFromFile с первого места и сделать дефолтным нулем?

    ОтветитьУдалить
  7. Да.
    Нет, в регистры сейчас можно только загружать и делать рендер в текстуру. Это сделано только для шейдеров. Но ваша идея обсуждается и планируется к реализации. То же самое касательно второго вопроса.

    ОтветитьУдалить
  8. Ну мне даже добавить-то и нечего, все так и есть. Идея здравая и коли движок в 0.4 и так немного изменился в архитектуре, то можно до кучи и этот параметр в конец сместить.
    Спасибо за любопытный фидбек.

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